সমস্যাটি
ধরা যাক, আমার কাছে একটি ক্লাস রয়েছে DataSource
যা একটি ReadData
পদ্ধতি থেকে ডেটা পড়ার জন্য একটি পদ্ধতি (এবং অন্যরাও হতে পারে তবে কিছু সরল রাখুন) .mdb
:
var source = new DataSource("myFile.mdb");
var data = source.ReadData();
কয়েক বছর পরে, আমি সিদ্ধান্ত নিয়েছি যে ডেটা উত্স হিসাবে ফাইলগুলি .xml
ছাড়াও আমি ফাইলগুলিকে সমর্থন করতে সক্ষম হতে চাই .mdb
। "রিডিং ডেটা" প্রয়োগের জন্য .xml
এবং .mdb
ফাইলগুলি একেবারেই আলাদা is এইভাবে, যদি আমি সিস্টেমটি স্ক্র্যাচ থেকে ডিজাইন করি তবে আমি এটির মতো এটি সংজ্ঞায়িত করব:
abstract class DataSource {
abstract Data ReadData();
static DataSource OpenDataSource(string fileName) {
// return MdbDataSource or XmlDataSource, as appropriate
}
}
class MdbDataSource : DataSource {
override Data ReadData() { /* implementation 1 */ }
}
class XmlDataSource : DataSource {
override Data ReadData() { /* implementation 2 */ }
}
দুর্দান্ত, কারখানার পদ্ধতি নিদর্শনটির একটি নিখুঁত বাস্তবায়ন। দুর্ভাগ্যক্রমে, DataSource
একটি লাইব্রেরিতে অবস্থিত এবং কোডটির রিফ্যাক্টরিং এর ফলে বিদ্যমান সমস্ত কল ভেঙে যায়
var source = new DataSource("myFile.mdb");
বিভিন্ন ক্লায়েন্ট গ্রন্থাগার ব্যবহার করে। আফসোস আমার, কেন আমি প্রথমে কারখানার পদ্ধতি ব্যবহার করিনি?
সলিউশন
এই সমাধানগুলি আমি নিয়ে আসতে পারি:
ডেটাসোর্স কনস্ট্রাক্টরকে একটি উপ-টাইপ (
MdbDataSource
বাXmlDataSource
) ফেরত করুন । এটি আমার সমস্ত সমস্যার সমাধান করবে। দুর্ভাগ্যক্রমে, সি # এটি সমর্থন করে না।বিভিন্ন নাম ব্যবহার করুন:
abstract class DataSourceBase { ... } // corresponds to DataSource in the example above class DataSource : DataSourceBase { // corresponds to MdbDataSource in the example above [Obsolete("New code should use DataSourceBase.OpenDataSource instead")] DataSource(string fileName) { ... } ... } class XmlDataSource : DataSourceBase { ... }
এটা কি আমি ব্যবহার যেহেতু এটি (অর্থাৎ কলের কোড পিছন সামঞ্জস্যপূর্ণ রাখে শেষ পর্যন্ত এর
new DataSource("myFile.mdb")
এখনও কাজে)। খসড়া: নামগুলি যেমন হওয়া উচিত তেমনি বর্ণনামূলক নয়।DataSource
আসল বাস্তবায়নের জন্য একটি "মোড়ক" তৈরি করুন :class DataSource { private DataSourceImpl impl; DataSource(string fileName) { impl = ... ? new MdbDataSourceImpl(fileName) : new XmlDataSourceImpl(fileName); } Data ReadData() { return impl.ReadData(); } abstract private class DataSourceImpl { ... } private class MdbDataSourceImpl : DataSourceImpl { ... } private class XmlDataSourceImpl : DataSourceImpl { ... } }
খসড়া: প্রতিটি ডেটা উত্স পদ্ধতি (যেমন
ReadData
) অবশ্যই বয়লারপ্লেট কোড দ্বারা রুট করা উচিত। আমি বয়লারপ্লেট কোড পছন্দ করি না। এটি অপ্রয়োজনীয় এবং কোডটিকে বিশৃঙ্খলা করে।
আমি যে কোনও মার্জিত সমাধান মিস করেছি তা কি?
new
শ্রেণি অবজেক্টের কোনও পদ্ধতি নয় (যাতে আপনি ক্লাস নিজেই সাবক্লাস করতে পারেন - একটি প্রযুক্তি যা মেটাক্লাস নামে পরিচিত - এবং new
আসলে কী কী নিয়ন্ত্রণ করে) তবে এটি কীভাবে সি # (বা জাভা, বা সি ++) কাজ করে না।