ইতিমধ্যে বিদ্যমান কোন বস্তুর সাথে আমি কীভাবে কার্যকারিতা যুক্ত করব?


25

আমার একটি ইন্টারফেস রয়েছে যা নির্দিষ্ট পরিমাণে সংজ্ঞায়িত কার্যকারিতা রয়েছে। চল বলি:

interface BakeryInterface {
  public function createCookies();
  public function createIceCream();
}

এটি ইন্টারফেসের বেশিরভাগ বাস্তবায়নের জন্য ভাল কাজ করে তবে কয়েকটি ক্ষেত্রে আমাকে কিছু নতুন কার্যকারিতা যুক্ত করতে হবে (যেমন সম্ভবত কোনও নতুন পদ্ধতিতে রোলড করা createBrownies())। এটি করার স্পষ্ট / নিষ্পাপ পদ্ধতির ইন্টারফেসটি প্রসারিত করা হবে:

interface BrownieBakeryInterface extends BakeryInterface {
  public function createBrownies();
}

তবে এর বেশ বড় খারাপ দিক রয়েছে যে আমি বিদ্যমান এপিআই পরিবর্তন না করে নতুন কার্যকারিতা যুক্ত করতে পারছি না (নতুন ইন্টারফেসটি ব্যবহারের জন্য শ্রেণি পরিবর্তন করার মতো)।

আমি তাত্ক্ষণিকতার পরে কার্যকারিতা যুক্ত করতে একটি অ্যাডাপ্টার ব্যবহার করার কথা ভাবছিলাম :

class BrownieAdapter {
  private brownieBakery;

  public function construct(BakeryInterface bakery) {
    this->brownieBakery = bakery;
  }

  public function createBrownies() {
    /* ... */
  }
}

যা আমাকে এমন কিছু জাল করবে:

bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();

এটি সমস্যার উত্তম সমাধানের মতো বলে মনে হচ্ছে তবে আমি ভাবছি আমি যদি এটি করে পুরানো দেবতাদের জাগ্রত করছি। অ্যাডাপ্টারটি কি যাওয়ার উপায়? অনুসরণ করার জন্য আরও ভাল প্যাটার্ন আছে কি? বা আমার কি সত্যিই বুলেট কামড়ানো এবং কেবলমাত্র মূল ইন্টারফেসটি প্রসারিত করা উচিত?


ডেলফির সহায়ক ক্লাস রয়েছে, এটি বিদ্যমান ক্লাসগুলিতে আসলে কোনও পরিবর্তন না করে পদ্ধতি যুক্ত করার মতো। উদাহরণস্বরূপ, ডেলফির একটি গ্রাফিক্স ইউনিটে একটি টিবিটম্যাপ শ্রেণি সংজ্ঞায়িত করা হয়েছে, আপনি একটি সহায়ক শ্রেণি তৈরি করতে পারেন যা টিবিটম্যাপে একটি ফ্লিপ ফাংশন যুক্ত করে, বলবে। হেল্পার ক্লাস যতক্ষণ স্কোপে থাকে আপনি মাইবিটম্যাপ.ফ্লিপ কল করতে পারেন;
বিল

উত্তর:


14

আপনার হ্যান্ডেল বডি প্যাটার্নগুলির যে কোনওই আপনার সঠিক প্রয়োজনীয়তা, ভাষা এবং বিমূর্ততার প্রয়োজনীয় স্তরের উপর নির্ভর করে বর্ণনাকে মাপসই করতে পারে।

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


এটি আমার যা প্রয়োজন তা ঠিক: আমি বুঝতে পেরেছি যে অ্যাডাপ্টারের সাহায্যে নির্ভরতা ইনজেকশন ব্যবহার করা উচিত তবে ডেকরেটার ব্যবহার করে এটি প্রায় হয়ে যায়।

5

অনুভূমিক পুনঃব্যবহারের ধারণাটি অনুসন্ধান করুন , যেখানে আপনি ট্রেইটস , এখনও পরীক্ষামূলক তবে ইতিমধ্যে প্রোডাক্ট-প্রুফ অ্যাস্পেক্ট ওরিয়েন্টেড প্রোগ্রামিং এবং কখনও কখনও ঘৃণাযুক্ত মিক্সিন্সের মতো জিনিসগুলি খুঁজে পেতে পারেন ।

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

var MyClass = {
    do : function(){...}
};

var MyNewClass = new MyClass;
MyClass.undo = function(){...};


var my_new_object = new MyNewClass;
my_new_object.do();
my_new_object.undo();

পরিশেষে, আপনি অনুভূমিক পুনরায় ব্যবহার, বা রানটাইম "পরিবর্তন" এবং প্রতিচ্ছবি সহ শ্রেণি / অবজেক্ট আচরণের "সংযোজন" অনুকরণ করতে পারেন ।


4

যদি কোনও প্রয়োজনীয়তা থাকে যে bakeryউদাহরণটি অবশ্যই অবশ্যই তার আচরণ পরিবর্তন করে (ব্যবহারকারীর ক্রিয়া ইত্যাদির উপর নির্ভর করে) তবে আপনাকে ডেকরেটর প্যাটার্নে যেতে হবে ।

যদি bakeryএটির আচরণটি পরিবর্তনশীল না হয় তবে আপনি Bakery class(বাহ্যিক এপিআই ইত্যাদি) সংশোধন করতে পারবেন না তবে আপনার অ্যাডাপ্টার প্যাটার্নে যেতে হবে ।

যদি bakeryএটির আচরণটি পরিবর্তনশীল হয় না এবং আপনি সংশোধন করতে পারেন Bakery classতবে আপনার বিদ্যমান ইন্টারফেসটি প্রসারিত করা উচিত (যেমন আপনি প্রথমদিকে প্রস্তাব করেছিলেন) বা একটি নতুন ইন্টারফেস প্রবর্তন করা BrownieInterfaceউচিত এবং Bakeryদুটি ইন্টারফেস বাস্তবায়ন করা যাক BakeryInterfaceএবং BrownieInterface
অন্যথায় আপনি কোনও যুক্তিসঙ্গত কারণেই আপনার কোডটিতে (ডেকোরেটর প্যাটার্ন ব্যবহার করে) অপ্রয়োজনীয় জটিলতা যুক্ত করবেন!


2

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

ক্রিস হাউসারের এই উপস্থাপনাটিও রয়েছে যা প্রায় একই ভিত্তিতে আলোচনা করে।

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