আদিম আবেগ কখন কোডের গন্ধ হয় না?


22

আমি সম্প্রতি প্রচুর নিবন্ধগুলি পড়েছি যা আদিম আবেগকে বর্ণনা করে কোডের গন্ধ হিসাবে ।

আদিম আবেগ এড়ানোর দুটি সুবিধা রয়েছে:

  1. এটি ডোমেন মডেলটিকে আরও স্পষ্ট করে তোলে। উদাহরণস্বরূপ, আমি একটি ব্যবসায়িক বিশ্লেষকের সাথে পোস্ট কোড থাকা স্ট্রিংয়ের পরিবর্তে একটি পোস্ট কোড সম্পর্কে কথা বলতে পারি।

  2. সমস্ত বৈধতা প্রয়োগের পরিবর্তে এক জায়গায় রয়েছে।

সেখানে প্রচুর নিবন্ধ রয়েছে যা বর্ণনা করে যে এটি কোনও কোডের গন্ধ। উদাহরণস্বরূপ, আমি এই জাতীয় পোস্ট কোডের জন্য আদিম আবেগ অপসারণের সুবিধাটি দেখতে পাচ্ছি:

public class Address
{
    public ZipCode ZipCode { get; set; }
}

এখানে জিপকোডের নির্মাতা:

public ZipCode(string value)
    {
        // Perform regex matching to verify XXXXX or XXXXX-XXXX format
        _value = value;
    }

আপনি ডিআরওয়াই নীতিটি ভঙ্গ করবেন যে যেখানেই একটি জিপ কোড ব্যবহৃত হয় সেই বৈধতা যুক্তি যুক্ত করে।

তবে, নিম্নলিখিত বিষয়গুলি সম্পর্কে কী:

  1. জন্মের তারিখ: মানসিকতার চেয়ে বৃহত্তর এবং আজকের তারিখের চেয়ে কম পরীক্ষা করে দেখুন।

  2. বেতন: শূন্যের চেয়ে বড় বা সমান এটি পরীক্ষা করুন।

আপনি কি একটি ডেটঅফবার্থ অবজেক্ট এবং বেতন অবজেক্ট তৈরি করবেন? সুবিধাটি হ'ল ডোমেন মডেলটি বর্ণনা করার সময় আপনি তাদের সম্পর্কে কথা বলতে পারেন। যাইহোক, এটি কি খুব বেশি বৈধতা না থাকার কারণে অত্যুক্তিকরণের ক্ষেত্রে। কোনও নিয়ম আছে যা বর্ণনা করে কখন কখন আদিম আবেগকে অপসারণ করবেন না বা যদি সম্ভব হয় তবে সর্বদা এটি করা উচিত?

আমি অনুমান করি আমি ক্লাসের পরিবর্তে একটি টাইপ ওরফে তৈরি করতে পারি, যা উপরের পয়েন্টটিতে সহায়তা করবে।


8
"আপনি ডিআরওয়াই নীতিটি ভঙ্গ করবেন যে যেখানেই একটি জিপ কোড ব্যবহার করা হয় সেই বৈধতা যুক্তি যুক্ত করুন" " ওটা সত্যি না. আপনার মডিউলটিতে ডেটা প্রবেশের সাথে সাথেই বৈধকরণ করা উচিত । যদি একাধিক "এন্ট্রি পয়েন্ট" থাকে তবে বৈধতা পুনরায় ব্যবহারযোগ্য ইউনিটে হওয়া উচিত , এবং এটি ডিটিও হওয়ার দরকার নেই (
হওয়াও

1
এটির তুলনায় আপনি কীভাবে নির্মাণকারীর জন্য "মননেট" এবং "আজকের তারিখ" দিচ্ছেন DateOfBirth?
কালেথ

11
কাস্টম প্রকার তৈরির আর একটি সুবিধা হ'ল টাইপ সুরক্ষা। আপনার যদি থাকে Salaryএবং Distanceআপত্তি থাকে তবে আপনি দুর্ঘটনাক্রমে এগুলি বিনিময়যোগ্যভাবে ব্যবহার করতে পারবেন না। তারা যদি উভয় প্রকারের হয় তবে আপনি পারেন double
স্ক্রোগ 1

3
@ ডাব্লু 500 আসলে
বৈধতাটি ডিটিওর

2
আমার কাছে এটি সমস্ত সুযোগের বিষয়। আপনি যদি আদিমদের একটি বিস্তৃত সুযোগ দেন তবে এমন অনেকগুলি উপায় রয়েছে যাতে সেগুলি অপব্যবহার ও ভুলভাবে ব্যবহার করা যায়। সুতরাং আপনি সাধারণত তাদের একটি সংকীর্ণ সুযোগ দিতে চান, এবং এটির একটি উপায় হ'ল আদিম, ব্যক্তিগতভাবে কোনও অভ্যন্তরীণ হিসাবে সঞ্চিত একটি অভ্যন্তরীণ হিসাবে সংরক্ষণ করা ব্যবহার করে একটি ধারণার প্রতিনিধিত্ব করে এমন একটি ক্লাস ডিজাইন করা, যাতে এটি প্রয়োগ করা যায়। এখন আদিমদের পরিধি সংকীর্ণ এবং এর অপব্যবহার / ভুল হ্রাস হওয়ার সম্ভাবনা নেই এবং আপনি কার্যকরভাবে আক্রমণকারীদের বজায় রাখতে পারেন। তবে যদি আদিমতার ক্ষেত্রটি শুরু করার জন্য সংকীর্ণ হয়, তবে এটি বহুলোকিল হতে পারে এবং বজায় রাখতে অতিরিক্ত সংযুক্তকরণ এবং কোডের প্রচুর প্রচলন করতে পারে।

উত্তর:


17

আদিম অবসেশন ডোমেইন ধারণাগুলি উপস্থাপনের জন্য আদিম ডেটা ধরণের ব্যবহার করে।

বিপরীতটি হবে "ডোমেন মডেলিং", বা সম্ভবত "ওভার ইঞ্জিনিয়ারিং"।

আপনি কি একটি ডেটঅফবার্থ অবজেক্ট এবং বেতন অবজেক্ট তৈরি করবেন?

স্যালারি অবজেক্টের পরিচয় দেওয়া নিম্নলিখিত কারণগুলির জন্য একটি ভাল ধারণা হতে পারে: ডোমেন মডেলগুলিতে সংখ্যা খুব কমই একা থাকে, তাদের প্রায় সবসময় একটি মাত্রা এবং একটি ইউনিট থাকে। আমরা যদি কোনও সময় বা একটি ভরতে দৈর্ঘ্য যোগ করি তবে আমরা সাধারণত দরকারী কিছু মডেল করি না এবং মিটার এবং ফুট মিশ্রিত করার সময় আমরা খুব কমই ভাল ফলাফল পাই

ডেটঅফবার্থের ক্ষেত্রে, সম্ভবত - দুটি বিষয় বিবেচনা করতে হবে। প্রথমত, একটি অ-আদিম তারিখ তৈরি করা আপনাকে তারিখ গণিতের চারপাশে সমস্ত উদ্ভট উদ্বেগকে কেন্দ্র করে স্থান দেয়। অনেকগুলি ভাষা বাক্সের বাইরে একটি সরবরাহ করে; তারিখটাইম , java.util.Date । এগুলি তারিখগুলির ডোমেন অজোনস্টিক বাস্তবায়ন, তবে সেগুলি আদিম নয়

দ্বিতীয়ত, DateOfBirthআসলেই কোনও তারিখের সময় নয়; এখানে মার্কিন যুক্তরাষ্ট্রে, "জন্ম তারিখ" হ'ল একটি সাংস্কৃতিক নির্মাণ / আইনি কল্পকাহিনী। আমরা কোনও ব্যক্তির জন্মের স্থানীয় তারিখ থেকে জন্মের তারিখ পরিমাপ করি ; ক্যালিফোর্নিয়ায় জন্মগ্রহণ করা বব, নিউ ইয়র্কে জন্মগ্রহণকারী অ্যালিসের চেয়ে একটি "আগের" জন্ম তারিখ থাকতে পারে, যদিও তিনি এই দুইয়ের মধ্যেই ছোট

এমন কোনও নিয়ম রয়েছে যা কখন এবং কখন আদিম আবেশকে অপসারণ না করার বর্ণনা দেয় বা সম্ভব হলে আপনার সর্বদা এটি করা উচিত।

অবশ্যই সবসময় না; সীমানায়, অ্যাপ্লিকেশনগুলিকে উদ্দেশ্য ভিত্তিক নয়পরীক্ষাগুলিতে আচরণগুলি বর্ণনা করার জন্য ব্যবহৃত আদিমগুলি দেখতে মোটামুটি সাধারণ ।


1
শীর্ষে উদ্ধৃতি দেওয়ার পরে প্রথম মন্তব্যটি একটি অ-সিকুইটর বলে মনে হচ্ছে। এছাড়াও এটি কেবল প্রশ্নের বিষয় পুনরুদ্ধার করে। এটি অন্যথায় একটি ভাল উত্তর তবে আমি এটি সত্যিই বিভ্রান্তিকর বলে মনে করি।
জিমি জেমস

সি # ডেটটাইম বা জাভা.উটিল.ডেট উভয়ই ডেটঅফবার্থের জন্য উপযুক্ত অন্তর্নিহিত ধরণের নয়।
কেভিন ক্লাইন

হয়তো প্রতিস্থাপন java.util.Dateসঙ্গেjava.time.LocalDate
Koray Tugay

7

সত্যি কথা বলতে: এটি নির্ভর করে।

আপনার কোডকে ওভাররিঞ্জাইন করার ঝুঁকি সর্বদা থাকে। ডেটঅফবার্থ এবং বেতন কতটা ব্যাপকভাবে ব্যবহৃত হবে? আপনি কি কেবল সেগুলি তিনটি দৃly়ভাবে সংযুক্ত ক্লাসে ব্যবহার করবেন, বা এগুলি সমস্ত অ্যাপ্লিকেশন জুড়ে ব্যবহার করা হবে? আপনি কি "কেবল" তাদের নিজের টাইপ / শ্রেণিতে এই প্রতিবন্ধকতাটি প্রয়োগ করার জন্য আবদ্ধ করেন, বা আপনি কি আসলে সেখানে অন্তর্ভুক্ত আরও প্রতিবন্ধকতা / কার্যকারিতা সম্পর্কে ভাবতে পারেন?

উদাহরণস্বরূপ বেতন গ্রহণ করা যাক: "বেতন" (যেমন বিভিন্ন মুদ্রা পরিচালনা করা, বা সম্ভবত কোনও স্ট্রিং () ফাংশন) দিয়ে আপনার কোনও পরিচালনা আছে? যখন আপনি এটিকে সাধারণ আদিম হিসাবে দেখেন না তখন বেতন কী / কী তা বিবেচনা করুন এবং বেতনটির নিজস্ব শ্রেণি হওয়ার ভাল সুযোগ রয়েছে।


একটি টাইপ ওরফে কি ভাল বিকল্প?
w0051977

@ w0051977 আমি চারনক্সের সাথে একমত এবং টাইপ
উপন্যাসের

@ w0051977 একটি টাইপ ওরফে বিকল্প হতে পারে যদি প্রাথমিক লক্ষ্যটি কঠোর টাইপিং প্রয়োগ করা হয়, তবে "ফ্লোট ডলার" (প্রতি ঘন্টা? সপ্তাহ? মাস?) এর একটি দুর্ঘটনাজনিত কার্যভার এড়াতে একটি নির্দিষ্ট মান (বেতন) কী তা স্পষ্ট করে বলা যায়? "ভাসমান বেতন" (প্রতি মাসে? বছর?)। এটি আপনার প্রয়োজনগুলি নির্ভর করে।
CharonX

@ চ্যারনএক্স, আমি বিশ্বাস করি যে দশমিক একটি বেতনের জন্য নয়, বেতনের জন্য ব্যবহার করা উচিত। তুমি কি একমত?
w0051977

@ w0051977 যদি আপনার দশমিক ধরণের ভাল থাকে তবে তা পছন্দনীয় হবে, হ্যাঁ। (আমি এই মুহূর্তে একটি সি ++ প্রকল্পে কাজ করছি, তাই বুলিয়ান, পূর্ণসংখ্যা এবং
ভাসমানগুলি

5

থাম্বের একটি সম্ভাব্য নিয়ম প্রোগ্রামের স্তরের উপর নির্ভর করে। জন্য ডোমেন (DDD) ওরফে সংস্থাগুলো লেয়ার (মার্টিন, 2018) এই শক্তি হিসাবে ভাল হতে "একটি ডোমেইন / ব্যবসা ধারণা প্রতিনিধিত্বমূলক কিছু জন্য প্রিমিটিভের এড়াতে"। ওপি দ্বারা ন্যায়সঙ্গততা বর্ণিত হয়েছে: আরও অভিব্যক্তিপূর্ণ ডোমেন মডেল, ব্যবসায়িক নিয়মের বৈধতা, অন্তর্নিহিত ধারণাগুলি সুস্পষ্ট করে তোলে (ইভান্স, 2004)।

কোনও প্রকারের উপন্যাস একটি হালকা ওজনের বিকল্প (ঘোষ, 2017) হতে পারে এবং যখন প্রয়োজন হয় তখন কোনও সত্তা শ্রেণীর কাছে এটি পুনরুদ্ধার করা যায়। উদাহরণস্বরূপ, আমাদের প্রথমে এটির প্রয়োজন হতে পারেSalary হতে পারি >=0এবং পরে তা অস্বীকার করার সিদ্ধান্ত নেব $100.33333এবং উপরের কিছু $10,000,000(যা ক্লায়েন্টকে দেউলিয়া করবে)। Nonnegativeউপস্থাপন Salaryএবং অন্যান্য ধারণাগুলি উপস্থাপনের জন্য আদিম ব্যবহার এই পুনরুদ্ধারকে জটিল করে তুলবে।

আদিমদের এড়ানো ওভার ইঞ্জিনিয়ারিং এড়াতে সহায়তা করতে পারে। মনে করুন আমাদের কোনও ডেটা কাঠামোর সাথে বেতন এবং জন্মের তারিখ একত্রিত করা দরকার : উদাহরণস্বরূপ, কম পদ্ধতি পরামিতি থাকতে হবে বা মডিউলগুলির মধ্যে ডেটা পাস করতে হবে। তারপরে আমরা টাইপ সহ একটি টুপল ব্যবহার করতে পারি (Salary, DateOfBirth)। প্রকৃতপক্ষে, আদিম সঙ্গে একটি tuple (Nonnegative, Nonnegative), তথ্যহীন, কিছু ফোটানো class EmployeeDataঅন্যদের মধ্যে প্রয়োজনীয় ক্ষেত্রগুলি আড়াল করবে। বলা স্বাক্ষরটি calcPension(d: (Salary, DateOfBirth))তার চেয়ে বেশি calcPension(d: EmployeeData)ফোকাসযুক্ত, যা ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে। তেমনি, কোনও বিশেষায়িতকে class SalaryAndDateOfBirthবিশ্রী মনে হয় এবং সম্ভবত এটি ওভারকিল। পরে, আমরা একটি ডেটা শ্রেণি সংজ্ঞায়িত করতে বেছে নিতে পারি; টিপলস এবং প্রাথমিক ডোমেনের ধরণগুলি আমাদের এই জাতীয় সিদ্ধান্তগুলি স্থগিত করে।

একটি বাহ্যিক স্তরে (যেমন জিইউআই) এটি সত্তা তাদের উপাদানগুলির আদিমদের (উদাহরণস্বরূপ ডিএওতে রাখার জন্য) "স্ট্রিপ" করার জন্য বোধ করতে পারে। এটি মার্টিনে (2018) উকিল অনুসারে ডোমেন বিমূর্ততাগুলি বাইরের স্তরগুলিতে ফাঁস হওয়া রোধ করে।

রেফারেন্স
ই। ইভান্স, "ডোমেন-চালিত ডিজাইন", 2004
ডি ঘোষ, "কার্যকরী এবং প্রতিক্রিয়াশীল ডোমেন মডেলিং", 2017
আরসি মার্টিন, "ক্লিন আর্কিটেকচার", 2018


সমস্ত উল্লেখের জন্য +1।
w0051977

4

আদিম আবেশ বা আর্কিটেকচার নভোচারী হয়ে ভোগা ভাল ?

উভয় ক্ষেত্রেই প্যাথলজিকাল, একটি ক্ষেত্রে আপনার খুব কম বিমূর্ততা রয়েছে যা পুনরাবৃত্তির দিকে পরিচালিত করে এবং সহজেই কমলার জন্য একটি আপেলকে ভুলভাবে ভুল করে তোলে এবং অন্য ক্ষেত্রে আপনি ইতিমধ্যে এটি থামিয়ে দিয়ে কাজগুলি করতে ভুলে গিয়েছিলেন, যাতে কিছু করা শক্ত হয়ে যায় making ।

প্রায় সর্বদা হিসাবে, আপনি সংযম চান, একটি আশাবাদী মধ্যম উপায় আশা করি।

মনে রাখবেন কোনও ধরণের পাশাপাশি কোনও সম্পত্তির একটি নামও রয়েছে। এছাড়াও, ঠিকানাটির উপাদানগুলির মধ্যে দ্রবীভূতকরণ যদি সবসময় একইভাবে করা হয় তবে খুব জটিল হতে পারে। সমস্ত পৃথিবীই এনওয়াই শহরের কেন্দ্রস্থল নয়।


3

যদি আপনার বেতনের শ্রেণি থাকে তবে এতে অ্যাপ্লায়াইজের মতো পদ্ধতি থাকতে পারে।

অন্যদিকে আপনার জিপকোড শ্রেণীর অভ্যন্তরীণ বৈধতা থাকতে হবে না যেখানে বৈধতা যাচাই করা এড়াতে আপনি যেখানেই ইনজেকশন করতে পারবেন এমন একটি জিপকোডভালিডেটর শ্রেণি থাকতে পারে, সুতরাং যদি আপনার সিস্টেমটি মার্কিন যুক্তরাষ্ট্র এবং যুক্তরাজ্য উভয় অ্যাড্রেসে চালানো হয় তবে আপনি কেবল ইনজেক্ট করতে পারেন সঠিক ভ্যালিডিটার এবং যখন আপনাকে এওএস অ্যাড্রেসগুলি পরিচালনা করতে হবে তখন আপনি কেবল একটি নতুন ভ্যালিডিটার যুক্ত করতে পারেন।

আরেকটি উদ্বেগ হ'ল যদি আপনাকে এনটিটি ফ্রেমওয়ার্কের মাধ্যমে কোনও ডাটাবেসে ডেটা লিখতে হয় তবে তারপরে বেতন বা জিপকোড কীভাবে পরিচালনা করতে হবে তা জানতে হবে।

বুদ্ধিমান ক্লাসগুলি কীভাবে হওয়া উচিত তার কোনও স্পষ্ট উত্তর নেই, তবে আমি বলব যে আমি ব্যবসার যুক্তি যেমন বৈধকরণের মতো, ডেটা ক্লাসগুলি খাঁটি ডেটা থাকার কারণে ব্যবসায় যুক্তিযুক্ত ক্লাসগুলিতে নিয়ে যাচ্ছি বলে মনে হচ্ছে সত্তা ফ্রেমওয়ার্কের সাথে আরও ভাল কাজ করা।

প্রকারের এলিয়াস ব্যবহার করার জন্য, সদস্য / সম্পত্তির নামটি বিষয়বস্তু সম্পর্কে প্রয়োজনীয় সমস্ত তথ্য দেওয়া উচিত, তাই আমি প্রকারের উপকরণগুলি ব্যবহার করব না।


একটি টাইপ ওরফে কি ভাল বিকল্প?
w0051977

2

(প্রশ্ন সম্ভবত সত্যই কি)

আদিম ধরণের ব্যবহার কখন কোডের গন্ধ হয় না?

(উত্তর)

যখন প্যারামিটারটিতে নিয়ম না থাকে - একটি আদিম টাইপ ব্যবহার করুন।

এর পছন্দগুলির জন্য আদিম ধরণের ব্যবহার করুন:

htmlEntityEncode(string value)

এর পছন্দগুলির জন্য অবজেক্টটি ব্যবহার করুন:

numberOfDaysSinceUnixEpoch(SimpleDate value)

আধুনিক উদাহরণ এটা নিয়ম, অর্থাত, বস্তু আছে SimpleDateগঠিত হয় Year, Monthএবং Day। এক্ষেত্রে অবজেক্টের ব্যবহারের মাধ্যমে, SimpleDateবৈধ হওয়ার ধারণাটি বস্তুর মধ্যে আবদ্ধ হতে পারে।


1

এই প্রশ্নের অন্যত্র দেওয়া ইমেল ঠিকানা বা জিপ কোডগুলির ক্যানোনিকাল উদাহরণগুলি ছাড়াও, যেখানে আমি আদিম আবেগ থেকে দূরে রিফ্যাক্টরিং খুঁজে পাই তা সত্তা আইডি সহ বিশেষত সহায়ক হতে পারে (দেখুন https://andrewlock.net/ using- स्ट्रिंग-typed-entity -আইডিতে টু এড়ানো-আদিম-আবেশ-অংশ -১ / এটি কীভাবে করা যায় তার উদাহরণের জন্য। নেট)।

আমি একটি বাগটি কতবার স্রষ্টার সংখ্যা হারিয়েছি কারণ কোনও পদ্ধতিতে এর স্বাক্ষর ছিল:

int leaveId = 12345;
int submitterId = 23456;
int approverId = 34567;

SubmitLeaveApplication(leaveId, approverId, submitterId);

public void SubmitLeaveApplication(int leaveId, int submitterId, int approverId) {
  // implementation here
}

ঠিকঠাক সংকলন করে, এবং আপনি যদি আপনার ইউনিট পরীক্ষার সাথে কঠোর না হন তবে এটিও পাস হতে পারে। যাইহোক, ডোমেন-নির্দিষ্ট ক্লাসে সেই সত্তা আইডিগুলিকে রিফ্যাক্টর করুন এবং হাই প্রেস্টো, সংকলন-সময় ত্রুটিগুলি:

LeaveId leaveId = 12345;
SubmitterId submitterId = 23456;
ApproverId approverId = 34567;

SubmitLeaveApplication(leaveId, approverId, submitterId);

public void SubmitLeaveApplication(LeaveId leaveId, SubmitterId submitterId, ApproverId approverId) {
  // implementation here
}

এই পদ্ধতিটি 10 ​​বা ততোধিক প্যারামিটার পর্যন্ত মাপসই করা হয়েছে, সমস্ত intডেটা টাইপ করুন ( লম্বা প্যারামিটার তালিকার কোডের গন্ধের কিছু মনে করবেন না) আপনি যখন ডোমেন অবজেক্ট এবং ডিটিওগুলির মধ্যে অটোম্যাপ্পারের মতো কিছু ব্যবহার করেন এবং আপনি যে রিফ্যাক্টরিং করেন তা আরও খারাপ হয়ে যায় I অটোমেজিক ম্যাপিং থেকে তোলা যায় না।


0

আপনি ডিআরওয়াই নীতিটি ভঙ্গ করবেন যে যেখানেই একটি জিপ কোড ব্যবহৃত হয় সেই বৈধতা যুক্তি যুক্ত করে।

অন্যদিকে, অনেকগুলি বিভিন্ন দেশ এবং তাদের বিভিন্ন জিপকোড সিস্টেমগুলির সাথে ডিল করার সময়, এর অর্থ হ'ল আপনি জিপকোডকে বৈধ করতে পারবেন না যদি না আপনি দেশটিকে প্রশ্নবিদ্ধ না করেন। তাই তোমারZipCode ক্লাসেরও দেশ সঞ্চয় করা দরকার।

তবে আপনি কি তখন আলাদাভাবে দেশটিকে Address(যা জিপকোডও অংশ যার) এবং জিপকোডের (বৈধতার জন্য) উভয় অংশ হিসাবে সংরক্ষণ করেন ?

  • যদি আপনি তা করেন তবে আপনি ডিআরওয়াইও লঙ্ঘন করছেন। এমনকি যদি আপনি এটিকে ডিআরওয়াই লঙ্ঘন নাও করেন (কারণ প্রতিটি উদাহরণ পৃথক উদ্দেশ্যে কাজ করে) তবে দুটি দেশের মান পৃথক হয়ে গেলে বাগের দরজা খোলার উপরে এটি অযথা অতিরিক্ত মেমরি গ্রহণ করে (যা তারা যুক্তিযুক্তভাবে কখনই করা উচিত নয়) থাকা).
    • অথবা, বিকল্পভাবে, এটি আপনাকে দুটি ডেটা পয়েন্টগুলি সর্বদা একইরূপে নিশ্চিত করার জন্য প্রয়োজনীয় হতে পরিচালিত করে, যা প্রস্তাব দেয় যে আপনার এই ডেটাটি যেভাবেই হোক কোনও একক বিন্দুতে সংরক্ষণ করা উচিত, সুতরাং উদ্দেশ্যকে পরাস্ত করে।
  • আপনি যদি তা না করেন তবে এটি কোনও ZipCodeশ্রেণি নয় বরং একটি Addressশ্রেণি, যার আবার এমন একটি উপাদান থাকবে string ZipCodeযার অর্থ আমরা সম্পূর্ণ বৃত্তে এসেছি।

উদাহরণস্বরূপ, আমি একটি ব্যবসায়িক বিশ্লেষকের সাথে পোস্ট কোড থাকা স্ট্রিংয়ের পরিবর্তে একটি পোস্ট কোড সম্পর্কে কথা বলতে পারি।

সুবিধাটি হ'ল ডোমেন মডেলটি বর্ণনা করার সময় আপনি তাদের সম্পর্কে কথা বলতে পারেন।

আমি আপনার অন্তর্নিহিত দৃ understand়তাটি বুঝতে পারি না যে যখন কোনও টুকরোটিতে কোনও নির্দিষ্ট পরিবর্তনশীল প্রকার থাকে, আপনি যখনই কোনও ব্যবসায় বিশ্লেষকের সাথে কথা বলছেন তখন আপনাকে সেই ধরণের উল্লেখ করা একরকম বাধ্যবাধকতা রয়েছে।

কেন? আপনি কেবল "জিপকোড" সম্পর্কে কথা বলতে এবং নির্দিষ্ট ধরণের সম্পূর্ণরূপে বাদ দিতে কেন অক্ষম? আপনার ব্যবসায়ের (প্রযুক্তিগত নয়!) বিশ্লেষকের সাথে আপনি কী ধরনের আলোচনা করছেন যেখানে সম্পত্তির প্রকার কথোপকথনের সমান?

আমি যেখানে থেকে এসেছি, পোস্টকোডগুলি সর্বদা সংখ্যাসূচক থাকে। সুতরাং আমাদের একটি পছন্দ আছে, আমরা এটি একটি intহিসাবে বা হিসাবে এটি সঞ্চয় করতে পারি string। আমরা স্ট্রিংটি ব্যবহার করি কারণ ডেটাতে গাণিতিক ক্রিয়াকলাপের কোনও প্রত্যাশা নেই তবে কোনও ব্যবসায়িক বিশ্লেষক আমাকে কখনও বলেনি যে এটি স্ট্রিং হওয়া দরকার। এই সিদ্ধান্তটি বিকাশকারীকে ছেড়ে দেওয়া হয়েছে (বা যুক্তিযুক্তভাবে প্রযুক্তিগত বিশ্লেষক, যদিও আমার অভিজ্ঞতায় তারা সরাসরি কৌতুকপূর্ণ কৌতুক মোকাবেলা করে না)।

কোনও ব্যবসায়িক বিশ্লেষক যতক্ষণ না অ্যাপ্লিকেশনটি যা প্রত্যাশা করে তা করে, তথ্যের ধরণের বিষয়ে চিন্তা করে না।


বৈধতা মোকাবেলা করার জন্য একটি কৌশলযুক্ত জন্তু, কারণ এটি মানুষ যা প্রত্যাশা করে তার উপর নির্ভর করে।

একটি হিসাবে, কেন আদিম আবেগ এড়ানো উচিত সেই উপায় হিসাবে বৈধতা যুক্তির সাথে আমি একমত নই, কারণ আমি একমত নই যে (সর্বজনীন সত্য হিসাবে) ডেটা সর্বদা সর্বদা বৈধ হওয়া দরকার।

উদাহরণস্বরূপ, যদি এটি আরও জটিল চেহারা হয়? সাধারণ বিন্যাস চেকের পরিবর্তে, যদি আপনার বৈধতা কোনও বাহ্যিক এপিআইয়ের সাথে যোগাযোগ করে এবং প্রতিক্রিয়ার জন্য অপেক্ষা করে থাকে তবে কী হবে? আপনি যে অ্যাপ্লিকেশনটি ZipCodeইনস্ট্যান্ট করেন তার জন্য আপনি কি সত্যই আপনার অ্যাপ্লিকেশনটিকে এই বাহ্যিক এপিআই কল করতে বাধ্য করতে চান ?
হতে পারে এটি একটি কঠোর ব্যবসায়ের প্রয়োজনীয়তা এবং তারপরে এটি অবশ্যই ন্যায়সঙ্গত। তবে এটি সর্বজনীন সত্য নয়। এটি প্রচুর ব্যবহারের ক্ষেত্রে থাকবে যেখানে এটি সমাধানের চেয়ে বোঝা বেশি।

দ্বিতীয় উদাহরণ হিসাবে, কোনও ফর্মে আপনার ঠিকানা প্রবেশের সময়, আপনার দেশের আগে আপনার পোস্টকোড প্রবেশ করা সাধারণ। যদিও ইউআই-তে তাত্ক্ষণিক বৈধতা প্রতিক্রিয়া পাওয়া ভাল, তবে অ্যাপ্লিকেশনটি আমাকে "ভুল" জিপকোড ফর্ম্যাটটিতে সতর্ক করে দিলে এটি আসলে আমার (বা ব্যবহারকারী হিসাবে) বাধা হয়ে দাঁড়াবে, কারণ ইস্যুটির আসল উত্সটি (উদাহরণস্বরূপ) আমার দেশটি সেই দেশ নয় যা পূর্বনির্ধারিতভাবে নির্বাচিত হয় এবং সুতরাং ভুল দেশের জন্য বৈধতাটি ঘটে।
এটি ভুল ত্রুটির বার্তা, যা ব্যবহারকারীকে বিভ্রান্ত করে এবং অযথা বিভ্রান্তি সৃষ্টি করে।

ঠিক কীভাবে স্থায়ী বৈধতা কোনও সর্বজনীন সত্য নয়, আমার উদাহরণও নয়। এটি প্রাসঙ্গিক । কিছু অ্যাপ্লিকেশন ডোমেনগুলির সর্বোপরি ডেটা বৈধকরণের প্রয়োজন। অন্যান্য ডোমেনগুলি অগ্রাধিকারের তালিকার তুলনায় উচ্চতর বৈধতা দেয় না কারণ ঝামেলা এটির সাথে নিয়ে আসে তাদের আসল অগ্রাধিকারগুলির সাথে দ্বন্দ্ব করে (উদাহরণস্বরূপ ব্যবহারকারীর অভিজ্ঞতা, বা প্রাথমিকভাবে ত্রুটিযুক্ত ডেটা সংরক্ষণ করার ক্ষমতা যাতে এটি কখনও না হওয়ার পরিবর্তে সংশোধন করা যায়) সংরক্ষিত)

জন্মের তারিখ: মানসিকতার চেয়ে বৃহত্তর এবং আজকের তারিখের চেয়ে কম পরীক্ষা করে দেখুন।
বেতন: শূন্যের চেয়ে বড় বা সমান এটি পরীক্ষা করুন।

এই বৈধতাগুলির সাথে সমস্যাটি হ'ল এগুলি অসম্পূর্ণ, অনর্থক বা অনেক বড় সমস্যার সূচক

মানসিকতার চেয়ে কোনও তারিখ বেশি তা পরীক্ষা করা নিরর্থক। মানসিকতার আক্ষরিক অর্থ এটি সম্ভবতমতম তারিখ। এছাড়াও, আপনি প্রাসঙ্গিকতার রেখাটি কোথায় আঁকেন? প্রতিরোধ করার DateTime.MinDateকিন্তু অনুমতি দেওয়ার DateTime.MinDate.AddSeconds(1)কী দরকার? আপনি একটি নির্দিষ্ট মান চেরিপিক করছেন যা অন্য অনেক মানের সাথে তুলনায় বিশেষত ভুল নয়।

আমার জন্মদিনটি ২ য় জানুয়ারী 1978 (এটি নয়, তবে এটি ধরে নেওয়া যাক)। তবে আসুন আমরা বলি যে আপনার আবেদনের ডেটাটি ভুল, এবং পরিবর্তে এটি বলে আমার জন্মদিনটি:

  • জানুয়ারী 1 ম 1978
  • জানুয়ারী 1 লা 1722
  • জানুয়ারী 1 লা 2355

এই সমস্ত তারিখ ভুল। এগুলির কোনওটিই অপরের চেয়ে "বেশি সঠিক" নয়। কিন্তু আপনার যাচাইকরণ নিয়মের শুধুমাত্র ধরতে হবে এক এই তিনটি উদাহরণ কয়েক।

আপনি কীভাবে এই ডেটা ব্যবহার করছেন সে প্রসঙ্গে আপনি পুরোপুরি বাদ দিয়েছেন। যদি এটি উদাহরণস্বরূপ জন্মদিনের অনুস্মারক বট হিসাবে ব্যবহার করা হয় তবে আমি বলব যে ভুল তারিখটি পূরণের কোনও বিশেষ খারাপ পরিণতি নেই বলে বৈধতাটি অর্থহীন।
অন্যদিকে, যদি এটি সরকারী ডেটা হয় এবং কারও পরিচয় প্রমাণ করার জন্য আপনার জন্ম তারিখের প্রয়োজন হয় (এবং এটির ব্যর্থতা খারাপ পরিণতির দিকে পরিচালিত করে, উদাহরণস্বরূপ কারও সামাজিক সুরক্ষা অস্বীকার করে), তবে তথ্যের সঠিকতা সর্বমোট এবং আপনার সম্পূর্ণরূপে প্রয়োজন তথ্য যাচাই করুন। আপনার কাছে এখন প্রস্তাবিত বৈধতা পর্যাপ্ত নয়।

বেতনের জন্য, কিছু সাধারণ জ্ঞান রয়েছে যে এটি নেতিবাচক হতে পারে না। তবে আপনি যদি বাস্তবসম্মতভাবে আশা করেন যে অযৌক্তিক ডেটা প্রবেশ করা হচ্ছে, তবে আমি আপনাকে এই অযৌক্তিক ডেটার উত্সটি অনুসন্ধান করার পরামর্শ দেব। কারণ তাদের যদি সংবেদনশীল ডেটা প্রবেশের জন্য বিশ্বাস করা যায় না তবে আপনি তাদের সঠিক ডেটা প্রবেশের জন্য বিশ্বাস করতে পারবেন না ।

পরিবর্তে যদি বেতনটি আপনার অ্যাপ্লিকেশন দ্বারা গণনা করা হয়, এবং কোনওভাবে এটি একটি নেতিবাচক (এবং সঠিক) নম্বর দিয়ে শেষ করা সম্ভব হয়, তবে Math.Max(myValue, 0)বৈধতা ব্যর্থ হওয়ার পরিবর্তে নেতিবাচক সংখ্যাগুলিকে 0 এ পরিণত করার জন্য আরও ভাল পন্থা হ'ল। কারণ যদি আপনার যুক্তি স্থির করে যে ফলাফলটি একটি negativeণাত্মক সংখ্যা, বৈধতা ব্যর্থ হওয়ার অর্থ এটি গণনাটি আবারও করতে হবে, এবং এটি দ্বিতীয়বারের মতো আলাদা নম্বর নিয়ে আসবে এমন ভাবার কোনও কারণ নেই।
এবং যদি এটি একটি ভিন্ন সংখ্যার সাথে আসে তবে এটি আপনাকে আবার সন্দেহের দিকে নিয়ে যায় যে গণনাটি সামঞ্জস্যপূর্ণ নয় এবং তাই বিশ্বাস করা যায় না।

এটি বৈধতা কার্যকর নয় তা বলার অপেক্ষা রাখে না। তবে অর্থহীন বৈধতা উভয়ই খারাপ কারণ সত্যই কোনও সমস্যা সমাধান না করার এবং মানুষকে সুরক্ষার ভ্রান্ত ধারণা দেওয়ার ক্ষেত্রে চেষ্টা করা দরকার।


কারও জন্মের তারিখটি প্রকৃতপক্ষে বর্তমান তারিখের অতীত হতে পারে, যদি এখনই একটি সময় অঞ্চলে একটি শিশু জন্মগ্রহণ করে যা ইতিমধ্যে পরের দিন এড়িয়ে যায়। এবং একটি হাসপাতাল ডেটাবেসে "প্রত্যাশিত জন্ম তারিখ" সংরক্ষণ করতে পারে যা ভবিষ্যতে কয়েক মাস হতে পারে। আপনি কি এটির জন্য আলাদা ধরনের চান?
gnasher729

@ গ্নাসের 29২৯: আমি অনুসরণ করি তা সম্পর্কে আমি নিশ্চিত নই, মনে হয় আপনি আমার সাথে একমত হচ্ছেন (বৈধতা প্রাসঙ্গিক এবং সর্বজনীনভাবে সঠিক নয়) তবে আপনার মন্তব্যের বাক্যবিন্যাস আপনাকে পরামর্শ দেয় যে আমি অসম্মতি প্রকাশ করি। নাকি আমি ভুল পড়ছি?
উত্তেজিত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.