এটি কেবল পোলা সম্পর্কেই নয়, বাগের সম্ভাব্য উত্স হিসাবে অবৈধ অবস্থা প্রতিরোধ সম্পর্কেও।
আসুন দেখুন কীভাবে আমরা আপনার উদাহরণকে কোনও কংক্রিট বাস্তবায়ন না করে কিছু প্রতিবন্ধকতা সরবরাহ করতে পারি:
প্রথম পদক্ষেপ: কোনও ফাইল খোলার আগে কোনও কিছু কল করার অনুমতি দেবেন না।
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
এখন এটি সুস্পষ্ট হওয়া CreateDataFileInterface.OpenFileউচিত যে একটি DataFileInterfaceউদাহরণ পুনরুদ্ধার করার জন্য অবশ্যই কল করা উচিত , যেখানে আসল ডেটা লেখা যেতে পারে।
দ্বিতীয় পদক্ষেপ: নিশ্চিত করুন, শিরোনাম এবং ট্রেইলার সর্বদা সেট করা আছে।
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
DataFileInterfaceফাইল নাম, শিরোলেখ এবং ট্রেলার পেতে এখন আপনাকে সমস্ত প্রয়োজনীয় প্যারামিটারগুলি সম্মুখভাগ সরবরাহ করতে হবে । সমস্ত লাইন না লেখা পর্যন্ত যদি ট্রেলার স্ট্রিংটি না পাওয়া যায় তবে আপনি এই প্যারামিটারটি Close()(সম্ভবত পদ্ধতিটির নামকরণ WriteTrailerAndClose()) এ স্থানান্তর করতে পারেন যাতে ট্রেলার স্ট্রিং ছাড়া ফাইলটি কমপক্ষে শেষ করা যায় না।
মন্তব্যে জবাব দিতে:
আমি ইন্টারফেসের বিচ্ছেদ পছন্দ করি। তবে আমি ভাবতে আগ্রহী যে বাস্তবায়ন সম্পর্কে আপনার পরামর্শ (উদাঃ WritTrailerAndClose ()) এসআরপি লঙ্ঘনের বিষয়ে ভার্জিং করছে। (এটি এমন একটি বিষয় যা আমি বেশ কয়েকটি উপলক্ষে লড়াই করেছি, তবে আপনার পরামর্শটি সম্ভবত একটি সম্ভাব্য উদাহরণ বলে মনে হচ্ছে)) আপনি কীভাবে প্রতিক্রিয়া জানান?
সত্য। আমি আমার বক্তব্য গঠনের প্রয়োজনের চেয়ে উদাহরণটিতে বেশি মনোনিবেশ করতে চাইনি, তবে এটি একটি ভাল প্রশ্ন। এই ক্ষেত্রে আমি মনে করি আমি এটি কল করব Finalize(trailer)এবং তর্ক করব যে এটি খুব বেশি করে না। ট্রেলার লিখতে এবং বন্ধ করা কেবল বাস্তবায়নের বিশদ। তবে যদি আপনি মতানৈক্য করেন বা একই রকম পরিস্থিতি যেখানে এটি আলাদা তবে এখানে একটি সম্ভাব্য সমাধান রয়েছে:
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
আমি আসলে এই উদাহরণটির জন্য এটি করব না তবে এটি কৌশলটি কীভাবে বহন করবে তা দেখায়।
যাইহোক, আমি ধরে নিয়েছি যে পদ্ধতিগুলি আসলে এই ক্রমে ডাকতে হবে, উদাহরণস্বরূপ ধারাবাহিকভাবে অনেকগুলি লাইন লিখতে। যদি এটির প্রয়োজন না হয় তবে আমি সর্বদা একজন বিল্ডারকে পছন্দ করব, বেন কট্রেলের পরামর্শ অনুসারে ।