কারখানা হিসাবে বেস ক্লাস?


14

আমি উইকএন্ডে কিছু কোড লিখছিলাম এবং আমি নিজেকে একটি বেস ক্লাসে স্ট্যাটিক পদ্ধতি হিসাবে একটি কারখানা লিখতে চেয়েছি found

আমার প্রশ্নটি কেবল এটাই # আইডোমেটিক পদ্ধতির কিনা তা জানার জন্য?

আমার অনুভূতি যে এটি নাও হতে পারে এই বিষয়টি থেকে আসে যে বেস ক্লাসটি উদ্ভূত শ্রেণীর জ্ঞান রাখে।

এটি বলেছিল, আমি একই ফল পাওয়ার সহজ উপায় সম্পর্কে নিশ্চিত নই। একটি সম্পূর্ণ অন্যান্য কারখানার শ্রেণি মনে হয় (কমপক্ষে আমার কাছে) অনিবদ্ধ জটিলতার (?) এর মতো

কিছুটা এইরকম:

class Animal
{
  public static Animal CreateAnimal(string name)
  {
     switch(name)
     {
        case "Shark":
          return new SeaAnimal();
          break;
        case "Dog":
          return new LandAnimal();
          break;
        default:
          throw new Exception("unknown animal");
     }
  }
}
class LandAnimal : Animal
{
}

class SeaAnimal : Animal
{
}

আপনি কিভাবে আপনার কারখানা পরীক্ষা করবেন?

এই প্রশ্নের কোড সহ, আমি চাই না। তবে উত্তরটি আমার কোডিং শৈলীতে আরও পরীক্ষার সংহত করার পথে আমাকে ইঞ্চি করতে সহায়তা করেছে
অ্যারোন আনোডাইড

আপনার অ্যানিম্যাল ক্লাসে সিওয়ার্ল্ড এবং ল্যান্ডওয়ার্ল্ড উভয়কেই টেনে নিয়ে যাওয়ার বিষয়টি বিবেচনা করুন, সর্বোপরি কোনও বিচ্ছিন্ন সেটিংয়ে পরিচালনা করা আরও শক্ত করে তোলে।

উত্তর:


13

ভাল, একটি পৃথক কারখানা শ্রেণীর সুবিধা হ'ল ইউনিট পরীক্ষায় এটি উপহাস করা যায়।

তবে আপনি যদি তা করতে যাচ্ছেন না, বা অন্য কোনও উপায়ে বহুবৈচিত্র্য তৈরি করছেন না, তবে শ্রেণিতে নিজেই একটি স্ট্যাটিক ফ্যাক্টরি পদ্ধতি ঠিক আছে।


ধন্যবাদ, আপনি যখন পলিমর্ফিকটি অন্য কোনও উপায়ে বলছেন তখন আপনি যা উল্লেখ করছেন তার একটি উদাহরণ দিতে পারেন?
অ্যারোন অ্যানোডিড

আমি বলতে চাইছি আপনি যদি কখনও একটি কারখানার পদ্ধতিটিকে অন্যটির সাথে প্রতিস্থাপন করতে সক্ষম হন। পরীক্ষার উদ্দেশ্যে এটি উপহাস করা তার মধ্যে অন্যতম সাধারণ উদাহরণ।
pdr

18

আপনি জেনারিকসটি সুইচ স্টেটমেন্ট এড়াতে এবং বেস ক্লাস থেকে প্রবাহিত বাস্তবায়নগুলি ডিকুল করতেও ব্যবহার করতে পারেন:

 public static T CreateAnimal<T>() where T: new, Animal
 {
    return new T();
 }

ব্যবহার:

LandAnimal rabbit = Animal.CreateAnimal();  //Type inference should should just figure out the T by the return indicated.

অথবা

 var rabbit = Animal.CreateAnimal<LandAnimal>(); 


2
@PeterK। ফোলার কোড স্মেলগুলিতে বিবৃতিগুলি পরিবর্তন করতে বোঝায়, তবে তার সমাধান হ'ল এগুলি প্রতিস্থাপনের পরিবর্তে কারখানার ক্লাসে নেওয়া উচিত। এটি বলেছিল, আপনি যদি বিকাশের সময় সর্বদা প্রকারটি জানতে চান তবে জেনারিক্স আরও একটি ভাল সমাধান। তবে আপনি যদি না করেন (মূল উদাহরণটি সূচিত হিসাবে) তবে আমি যুক্তি দিয়ে বলব যে কারখানার পদ্ধতিতে স্যুইচ এড়ানোর জন্য প্রতিচ্ছবি ব্যবহার করা একটি মিথ্যা অর্থনীতি হতে পারে।
পিডিআর

স্যুইচ স্টেটমেন্ট এবং যদি-অন্যথায় - চেইন একই থাকে are সংকলন সময় পরীক্ষা করার কারণে আমি পূর্ববর্তীটিকে ব্যবহার করি যা ডিফল্ট
কেসটি

4
@ পিটারকে, একটি স্যুইচ স্টেটমেন্টে কোডটি এক জায়গায় রয়েছে। পূর্ণ বিকাশে ওও একই কোডটি একাধিক, পৃথক শ্রেণিতে ছড়িয়ে থাকতে পারে। একটি ধূসর অঞ্চল রয়েছে যেখানে একটি স্নিপেটের সংযোজন জটিলতা একটি স্যুইচ-স্টেটমেন্টের চেয়ে কম কাঙ্ক্ষিত।

@ থরবজর্ন, আমার সেই সঠিক চিন্তাভাবনা ছিল, তবে এতটা সংক্ষিপ্তভাবে কখনই বলা যায়নি, কথায় কথায় রাখার জন্য ধন্যবাদ
অ্যারোন আনোডাইড

5

চূড়ান্তভাবে নেওয়া, কারখানাটি জেনেরিকও হতে পারে।

interface IFactory<K, T> where K : IComparable
{
    T Create(K key);
}

তারপরে যে কোনও বস্তুর কারখানা তৈরি করতে পারে, যার ফলে যে কোনও ধরণের অবজেক্ট তৈরি হতে পারে। আমি নিশ্চিত না যে এটি যদি সহজ হয় তবে এটি অবশ্যই আরও জেনেরিক।

আমি একটি ছোট কারখানা বাস্তবায়নের জন্য স্যুইচ বিবৃতিতে কোনও ভুল দেখতে পাচ্ছি না। আপনি যখন বিপুল সংখ্যক অবজেক্টগুলিতে বা বিভিন্ন শ্রেণীর অবজেক্টের সম্ভাব্য শ্রেণিতে পরিণত হন, তখন আমি মনে করি আরও জেনেরিক পদ্ধতির পক্ষে আরও উপযুক্ত।


1

খারাপ ধারণা। প্রথমত, এটি উন্মুক্ত নীতিটি লঙ্ঘন করে। যে কোনও নতুন প্রাণীর জন্য আপনাকে আবারও আপনার বেস ক্লাসের সাথে জগাখিচুড়ি করতে হবে এবং আপনি এটি সম্ভাব্যভাবে ভেঙে ফেলবেন। নির্ভরতা ভুল পথে যেতে হবে।

আপনার যদি কোনও কনফিগারেশন থেকে প্রাণী তৈরির প্রয়োজন হয় তবে এর মতো একটি গঠন ঠিকঠাক হবে, যদিও নামের সাথে মেলে এমন ধরণের প্রতিবিম্ব ব্যবহার করা এবং এটি প্রাপ্ত প্রকারের তথ্য ব্যবহার করে এটি ইনস্ট্যান্টিয়েট করা আরও ভাল বিকল্প হবে।

তবে আপনার যেকোন উপায়ে একটি উত্সর্গীকৃত ফ্যাক্টরি ক্লাস তৈরি করা উচিত, প্রাণী শ্রেণীর শ্রেণিবিন্যাস থেকে মুক্ত না হওয়া এবং বেস ধরণের পরিবর্তে আইএএনমাল ইন্টারফেসটি ফিরিয়ে দেওয়া উচিত। তারপরে এটি দরকারী হয়ে উঠবে, আপনি কিছু ডিকপলিং অর্জন করতে পারেন।


0

এই প্রশ্নটি আমার জন্য সময়োপযোগী - গতকাল আমি প্রায় ঠিক এই জাতীয় কোড লিখছিলাম। আমার প্রকল্পে যা কিছু প্রাসঙ্গিক তার সাথে কেবল "প্রাণী" প্রতিস্থাপন করুন, যদিও আমি এখানে আলোচনার স্বার্থে "প্রাণী" এর সাথে আঁকড়ে থাকি। একটি 'স্যুইচ' স্টেটমেন্টের পরিবর্তে আমার কিছু নির্দিষ্ট জটিল মানগুলির সাথে কেবল একটি ভেরিয়েবলের তুলনা করার চেয়ে বেশি কিছু জড়িত 'if' স্টেটমেন্টগুলির আরও জটিল জটিল সিরিজ ছিল। তবে এটি একটি বিশদ। স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি জিনিসগুলির নকশা করার জন্য একটি ঝরঝরে উপায় বলে মনে হয়েছিল, যেহেতু ডিজাইনের কোডের দ্রুত এবং নোংরা মেসগুলি পুনরুদ্ধার করার সময় থেকে উদ্ভূত হয়েছিল।

উত্সযুক্ত শ্রেণীর জ্ঞান থাকা বেস ক্লাসের ভিত্তিতে আমি এই নকশাটিকে প্রত্যাখ্যান করেছি। ল্যান্ডএনিমাল এবং সিঅনিমাল ক্লাসগুলি যদি ছোট, ঝরঝরে এবং সহজ হয় তবে তারা একই উত্স ফাইলে থাকতে পারে। তবে আমার কাছে পাঠ্য ফাইলগুলি সরকারীভাবে সংজ্ঞায়িত মানগুলির সাথে মেনে চলার জন্য বড় অগোছালো পদ্ধতি রয়েছে - আমি আমার সোর্স ফাইলে আমার ল্যান্ডঅ্যানিমাল ক্লাস চাই।

এটি বৃত্তাকার ফাইলের উপর নির্ভরশীলতার দিকে পরিচালিত করে - ল্যান্ডঅ্যানিমাল প্রাণী থেকে উদ্ভূত, তবে অ্যানিমালটি ইতিমধ্যে ল্যান্ডঅ্যানিমাল, সিঅ্যানিমাল এবং আরও পনেরো শ্রেণীর অস্তিত্ব সম্পর্কে জানতে হবে। আমি কারখানার পদ্ধতিটি টেনে আনলাম, এটিকে নিজস্ব ফাইলে রেখেছি (আমার মূল অ্যাপ্লিকেশনটিতে, আমার প্রাণী লাইব্রেরিতে নয়) একটি স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি সুন্দর এবং চতুর বলে মনে হয়েছিল, তবে আমি বুঝতে পেরেছিলাম যে এটি আসলে কোনও নকশা সমস্যার সমাধান করেনি।

এটি আইডিয়োমেটিক সি # এর সাথে কীভাবে সম্পর্কিত তা আমার কোনও ধারণা নেই, যেহেতু আমি ভাষাগুলিকে প্রচুর স্যুইচ করি, তাই আমি সাধারণত আমার প্রচলিত কাজের বাইরে ভাষা এবং দেবতার কাঠামোর সাথে অদ্ভুত প্রতিচ্ছবি এবং কনভেনশনগুলিকে উপেক্ষা করি। যদি আমার সি # তে কিছু অর্থযুক্ত হয় তবে এটি "পাইথোনিক" দেখাচ্ছে। আমি সাধারণ স্পষ্টতা জন্য লক্ষ্য।

এছাড়াও, আমি জানি না যে ছোট, সাধারণ শ্রেণীর ক্ষেত্রে ভবিষ্যতের কাজগুলিতে প্রসারিত হওয়ার সম্ভাবনা কম ক্ষেত্রে ক্ষেত্রে স্থিতিশীল কারখানা পদ্ধতিটি ব্যবহার করার কোনও সুবিধা ছিল কিনা - কোনও এক উত্সের ফাইলে এটি থাকা কোনও কোনও ক্ষেত্রে সুন্দর হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.