আমার কিছু কোডে, আমার কাছে এটির মতো একটি স্ট্যাটিক কারখানা রয়েছে:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
কোড পর্যালোচনা চলাকালীন প্রস্তাব দেওয়া হয়েছিল যে এটি সিঙ্গলটন এবং ইনজেকশন হওয়া উচিত। সুতরাং, এটি দেখতে এইরকম হওয়া উচিত:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
হাইলাইট করার জন্য কয়েকটি বিষয়:
- দুটি কারখানাই রাষ্ট্রহীন।
- পদ্ধতির মধ্যে একমাত্র পার্থক্য হ'ল তাদের স্কোপগুলি (উদাহরণস্বরূপ স্থিতিশীল)। বাস্তবায়নও একই রকম।
- ফু একটি মটরশুটি যা একটি ইন্টারফেস নেই।
স্থির হওয়ার জন্য আমার যে যুক্তি ছিল তা হ'ল:
- বর্গটি রাষ্ট্রহীন, সুতরাং তাত্ক্ষণিক হওয়ার দরকার নেই
- কারখানাটি ইনস্ট্যান্ট করার চেয়ে স্থিতিশীল পদ্ধতিটি কল করতে সক্ষম হওয়া আরও স্বাভাবিক বলে মনে হয়
সিঙ্গেলটন হিসাবে কারখানার পক্ষে যুক্তিগুলি ছিল:
- সব কিছু ইনজেক্ট করা ভাল
- কারখানার রাজ্যহীনতা সত্ত্বেও, ইঞ্জেকশন দিয়ে টেস্টিং করা সহজ (উপহাস করা সহজ)
- ভোক্তার পরীক্ষা করার সময় এটি উপহাস করা উচিত
সিঙ্গেলটন পদ্ধতির সাথে আমার কিছু গুরুতর সমস্যা রয়েছে কারণ এটি মনে হয় যে কোনও পদ্ধতিই স্থিতিশীল হওয়া উচিত না। এটি মনে হয় যে ইউটিলিটিগুলি যেমন StringUtils
মোড়ানো এবং ইনজেকশন করা উচিত, যা নির্বোধ বলে মনে হয়। শেষ অবধি, এটি সূচিত করে যে আমাকে কারখানায় কোনও সময়ে উপহাস করা দরকার, যা সঠিক বলে মনে হচ্ছে না। কারখানাটি কখন উপহাস করার দরকার তা আমি ভাবতে পারি না।
সম্প্রদায় কী মনে করে? যদিও আমি সিঙ্গলটনের পদ্ধতির পছন্দ করি না, যদিও এর বিরুদ্ধে আমার ভীষণ দৃ strong় যুক্তি রয়েছে বলে মনে হয় না।
DateTime
এবং File
ক্লাসগুলি ঠিক একই কারণে পরীক্ষা করা বেশ কুখ্যাত। যদি আপনার কাছে উদাহরণস্বরূপ কোনও শ্রেণি থাকে যা নির্ধারকটিতে Created
তারিখ নির্ধারণ করে DateTime.Now
আপনি 5 মিনিটের ব্যবধানে তৈরি হওয়া এই দুটি বস্তুর সাথে ইউনিট পরীক্ষা তৈরির বিষয়ে কীভাবে যান? বছরের পর বছর কী? আপনি সত্যিই এটি করতে পারবেন না (প্রচুর কাজ ছাড়াই)।
private
কনস্ট্রাক্টর এবং একটি getInstance()
পদ্ধতি থাকা উচিত নয়? দুঃখিত, অযোগ্য-নিট-পিকার!