প্রিমিটিভস, যেমন string
বা int
, কোনও ব্যবসায়িক ডোমেনে কোনও অর্থ রাখে না। এর প্রত্যক্ষ পরিণতি হ'ল আপনি পণ্য আইডি প্রত্যাশার ক্ষেত্রে ভুলভাবে একটি ইউআরএল ব্যবহার করতে পারেন, বা দাম প্রত্যাশার সময় পরিমাণ ব্যবহার করতে পারেন ।
এজন্য অবজেক্ট ক্যালিস্টেনিক্স চ্যালেঞ্জ আদিমদের এর একটি নিয়ম হিসাবে মোড়ানো বৈশিষ্ট্যযুক্ত:
বিধি 3: সমস্ত আদিম এবং স্ট্রিং মোড়ানো
জাভা ভাষায়, আন্ত একটি আদিম, সত্যিকারের বস্তু নয়, তাই এটি বস্তুর চেয়ে বিভিন্ন বিধি মান্য করে। এটি এমন একটি সিনট্যাক্সের সাথে ব্যবহার করা হয় যা অবজেক্ট-ভিত্তিক নয়। আরও গুরুত্বপূর্ণ বিষয় হল এটির একটি নিজস্ব কেবলমাত্র একটি স্কেলার, সুতরাং এর কোনও অর্থ নেই। যখন কোনও প্যারামিটার হিসাবে কোনও পদ্ধতি গ্রহণ করে, তখন পদ্ধতির নামটি অভিপ্রায় প্রকাশের সমস্ত কাজ করা প্রয়োজন। যদি একই পদ্ধতিটি একটি প্যারামিটার হিসাবে একটি ঘন্টা নেয় তবে কী চলছে তা দেখা খুব সহজ।
একই ডকুমেন্টটি ব্যাখ্যা করে যে এখানে আরও একটি সুবিধা রয়েছে:
আওয়ার বা অর্থের মতো ছোট ছোট বস্তুগুলি আমাদের আচরণের জন্য একটি স্পষ্ট জায়গা দেয় যা অন্যথায় অন্য শ্রেণীর চারপাশে আবদ্ধ হত ।
প্রকৃতপক্ষে, যখন আদিমগুলি ব্যবহৃত হয়, তখন সাধারণত এই ধরণের সাথে সম্পর্কিত কোডের সঠিক অবস্থানটি ট্র্যাক করা খুব কঠিন, যা প্রায়শই গুরুতর কোড ডুপ্লিকেশন বাড়ে । যদি Price: Money
শ্রেণি থাকে তবে ভিতরে সীমা পরীক্ষা করা স্বাভাবিক checking পরিবর্তে, যদি int
(আরও খারাপ, ক double
) পণ্যের দাম সংরক্ষণ করতে ব্যবহৃত হয়, তবে এই ব্যাপ্তিটি বৈধতা দেওয়া উচিত কে? পণ্যটি? ছাড়? কার্ট?
শেষ অবধি, নথিতে উল্লিখিত না হওয়া তৃতীয় সুবিধা হ'ল অন্তর্নিহিত ধরণের তুলনামূলকভাবে সহজ পরিবর্তন করার ক্ষমতা। আজ আমার এমন ProductId
হয়েছে short
, সেটির অন্তর্নিহিত টাইপ হিসেবে এবং পরে আমি ব্যবহার করতে হবে int
পরিবর্তে, সম্ভাবনা পরিবর্তন করতে সমগ্র কোড বেস জুড়ে করা হবে না কোড আছে।
অপূর্ণতা — এবং একই যুক্তিটি অবজেক্ট ক্যালিস্টেনিক্স অনুশীলনের প্রতিটি নিয়মের ক্ষেত্রে প্রযোজ্য that এটি যদি দ্রুত সমস্ত কিছুর জন্য একটি শ্রেণি তৈরি করার জন্য অত্যধিক মাত্রাতিরিক্ত হয়ে যায় । যদি Product
থাকে ProductPrice
যা উত্তরাধিকারী থেকে PositivePrice
যা আহরণ থেকে Price
যা আবার থেকে উত্তরাধিকারী Money
, এই পরিষ্কার স্থাপত্য, বরং সম্পূর্ণ জগাখিচুড়ি অর্ডার একটি একক জিনিস খুঁজে পেতে, একটি রক্ষণাবেক্ষণকারী কয়েক ডজন প্রত্যেক সময় ফাইল খুলতে উচিত কোথায়।
আরেকটি বিষয় বিবেচনা করার জন্য হ'ল অতিরিক্ত ক্লাস তৈরির ব্যয় (কোডের রেখার ক্ষেত্রে)। যদি মোড়কগুলি অপরিবর্তনীয় হয় (সাধারণত সেগুলি হওয়া উচিত) তবে এর অর্থ হ'ল আমরা যদি সি # গ্রহণ করি তবে আপনার অবশ্যই কমপক্ষে র্যাপারের মধ্যে থাকতে হবে:
- সম্পত্তি প্রাপ্তি,
- এর সমর্থন ক্ষেত্র,
- একটি কনস্ট্রাক্টর যা ব্যাকিং ফিল্ডে মান নির্ধারণ করে,
- একটি প্রথা
ToString()
,
- এক্সএমএল ডকুমেন্টেশন মন্তব্যসমূহ (যা অনেকগুলি লাইন তৈরি করে),
- এ
Equals
এবং GetHashCode
ওভাররাইড (এছাড়াও অনেকগুলি এলওসি)।
এবং শেষ পর্যন্ত, যখন প্রাসঙ্গিক:
- একটি ডিবাগারডিসপ্লে বৈশিষ্ট্য,
==
ও !=
অপারেটরদের ওভাররাইড ,
- অবশেষে এনক্যাপসুলেটেড প্রকারে এবং নির্বিঘ্নে রূপান্তর করতে অন্তর্নিহিত রূপান্তর অপারেটরের একটি ওভারলোড,
- কোড চুক্তি (আক্রমণকারী সহ, এটি একটি দীর্ঘ দীর্ঘ পদ্ধতি, এর তিনটি বৈশিষ্ট্য সহ),
- বেশ কয়েকটি রূপান্তরকারী যা এক্সএমএল সিরিয়ালাইজেশন, জেএসএন সিরিয়ালাইজেশন বা একটি ডাটাবেস থেকে / থেকে কোনও মান সঞ্চয় করে / লোড করার সময় ব্যবহৃত হবে।
একটি সাধারণ মোড়কের জন্য একশত এলওসি এটিকে বেশ নিষিদ্ধ করে তোলে, এ কারণেই আপনি এ জাতীয় মোড়কের দীর্ঘমেয়াদী লাভ সম্পর্কে সম্পূর্ণ নিশ্চিত থাকতে পারেন। টমাস জাঙ্ক দ্বারা ব্যাখ্যা করা সুযোগের ধারণাটি এখানে বিশেষভাবে প্রাসঙ্গিক। ProductId
আপনার কোড বেজ জুড়ে ব্যবহৃত একটি প্রতিনিধিত্ব করার জন্য একশটি এলওসি লেখা বেশ কার্যকর বলে মনে হচ্ছে। কোনও কোডের জন্য এই আকারের একটি শ্রেণি লেখা যা একক পদ্ধতির মধ্যে তিনটি লাইন তৈরি করে অনেক বেশি প্রশ্নবিদ্ধ।
উপসংহার:
অ্যাপ্লিকেশনটির ব্যবসায়ের ডোমেইনে অর্থ রয়েছে এমন ক্লাসগুলিতে আড়াল করুন যখন (1) এটি ভুলগুলি হ্রাস করতে সহায়তা করে, (২) কোড সদৃশতার ঝুঁকি হ্রাস করে বা (3) অন্তর্নিহিত ধরণটি পরে পরিবর্তন করতে সহায়তা করে।
আপনি আপনার কোডটিতে খুঁজে পাওয়া প্রতিটি আদিম স্বয়ংক্রিয়ভাবে মোড়বেন না: এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে ব্যবহার করা string
বা int
পুরোপুরি ঠিক।
অনুশীলনে, ইন public string CreateNewThing()
, ThingId
ক্লাসের উদাহরণ ফিরিয়ে দেওয়া পরিবর্তে string
সহায়তা করতে পারে তবে আপনি এটিও করতে পারেন:
Id<string>
শ্রেণীর উদাহরণ দিন , এটি জেনেরিক টাইপের একটি বিষয় যা নির্দেশ করে যে অন্তর্নিহিত প্রকারটি একটি স্ট্রিং। প্রচুর প্রকারের রক্ষণাবেক্ষণের অপূর্ণতা ছাড়াই আপনার পঠনযোগ্যতার সুবিধা রয়েছে।
Thing
শ্রেণীর উদাহরণ দিন Return ব্যবহারকারীর যদি কেবল আইডি দরকার হয় তবে এটি সহজেই এর মাধ্যমে করা যেতে পারে:
var thing = this.CreateNewThing();
var id = thing.Id;