আসুন বিকল্পগুলি দেখুন, যেখানে আমরা বৈধকরণ কোডটি রাখতে পারি:
- বিল্ডারে সেটারগুলির ভিতরে।
build()
পদ্ধতির ভিতরে ।
- নির্মিত সত্তার অভ্যন্তরে:
build()
সত্তাটি তৈরি হওয়ার সময় এটি পদ্ধতিতে ডাকা হবে ।
বিকল্প 1 আমাদের আগে সমস্যাগুলি সনাক্ত করতে সহায়তা করে, তবে জটিল পরিস্থিতিগুলি তখনই ঘটতে পারে যখন আমরা কেবলমাত্র পুরো প্রসঙ্গে থাকা ইনপুটটিকে বৈধতা দিতে পারি, সুতরাং build()
পদ্ধতিটিতে বৈধতার কমপক্ষে অংশটি করা যায় । সুতরাং, বিকল্প 1 নির্বাচন করা বৈধতার অংশের সাথে এক জায়গায় এবং অন্য অংশটি অন্য স্থানে সম্পন্ন হওয়ার সাথে অসামঞ্জস্যপূর্ণ কোডের দিকে নিয়ে যাবে।
বিকল্প 2 অপশন 1 এর চেয়ে উল্লেখযোগ্যভাবে খারাপ নয়, কারণ সাধারণত, নির্মাতাদের সেটটারগুলি ডানদিকে আগে ডাকা হয় build()
, বিশেষত, সাবলীল ইন্টারফেসে। সুতরাং, বেশিরভাগ ক্ষেত্রে প্রাথমিক পর্যায়ে সমস্যা সনাক্ত করা এখনও সম্ভব। তবে, যদি বিল্ডার কোনও অবজেক্ট তৈরির একমাত্র উপায় না হন তবে এটি বৈধতা কোডটির সদৃশ হবে, কারণ যেখানেই আপনি কোনও বস্তু তৈরি করেন সেখানে আপনার এটি থাকা দরকার। এক্ষেত্রে সর্বাধিক যৌক্তিক সমাধান হ'ল যথাসম্ভব তৈরি হওয়া অবজেক্টের নিকটবর্তীকরণ, যা এর অভ্যন্তরে valid এবং এটি বিকল্প 3 ।
সলিউড দৃষ্টিকোণ থেকে, বিল্ডারে বৈধতা রাখাও এসআরপি লঙ্ঘন করে: বিল্ডার শ্রেণীর ইতিমধ্যে কোনও অবজেক্ট তৈরির জন্য ডেটা একত্রিত করার দায়িত্ব রয়েছে। বৈধকরণ তার নিজস্ব অভ্যন্তরীণ অবস্থার উপর চুক্তি স্থাপন করছে, অন্য কোনও অবজেক্টের অবস্থা পরীক্ষা করা এটি একটি নতুন দায়িত্ব।
সুতরাং, আমার দৃষ্টিকোণ থেকে, ডিজাইনের দৃষ্টিকোণ থেকে কেবল দেরি করে ফেলাই ভাল নয়, তবে বিল্ডার নিজেই নয় বরং নির্মাত্তর সত্তার ভিতরেই ব্যর্থ হওয়া আরও ভাল।
ইউপিডি: এই মন্তব্যটি আমাকে আরও একটি সম্ভাবনার কথা মনে করিয়ে দিয়েছে, যখন বিল্ডারের অভ্যন্তরে বৈধতা (বিকল্প 1 বা 2) বোঝায়। এটি নির্ধারণ করে না যদি নির্মাতার তৈরি করা বস্তুগুলির নিজস্ব চুক্তি করে। উদাহরণস্বরূপ, ধরে নিই যে আমাদের এমন একটি নির্মাতা আছেন যা নির্দিষ্ট বিষয়বস্তু দিয়ে একটি স্ট্রিং তৈরি করে, বলুন, সংখ্যা রেঞ্জের তালিকা 1-2,3-4,5-6
। এই বিল্ডারের মতো পদ্ধতি থাকতে পারে addRange(int min, int max)
। ফলস্বরূপ স্ট্রিং এই সংখ্যাগুলি সম্পর্কে কিছুই জানে না, এটিরও জানা উচিত নয়। নির্মাতা নিজেই স্ট্রিংয়ের বিন্যাস এবং সংখ্যার উপর সীমাবদ্ধতা নির্ধারণ করে। সুতরাং, পদ্ধতিটি addRange(int,int)
অবশ্যই ইনপুট নম্বরগুলি বৈধ করে তুলবে এবং সর্বাধিক মিনিটের চেয়ে কম হলে একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে।
এটি বলেছিল, সাধারণ নিয়মটি কেবল বিল্ডার নিজেই নির্ধারিত চুক্তিগুলিকে বৈধতা দেবে।