পরিবর্তিত কৌশল নকশা প্যাটার্ন


11

আমি সম্প্রতি ডিজাইন প্যাটার্নগুলি সন্ধান করতে শুরু করেছি এবং আমি যে কোডটির কোডিং করছি তার মধ্যে একটি ছোট পার্থক্য বাদে কৌশলগত প্যাটার্নটি পুরোপুরি উপযুক্ত হবে।

মূলত, আমার অ্যালগোরিদমগুলির কয়েকটি (তবে সমস্ত নয়) তাদের একটি অতিরিক্ত পরামিতি বা দুটি দরকার two

সুতরাং আমি হয় প্রয়োজন

  • যখন আমি তাদের গণনা পদ্ধতিতে প্রার্থনা করি তখন তাদের একটি অতিরিক্ত পরামিতি পাস করুন

অথবা

  • এগুলি কনক্রিটএলগোরিদম শ্রেণীর ভিতরে ভেরিয়েবল হিসাবে সংরক্ষণ করুন এবং আমি অ্যালগরিদম কল করার আগে সেগুলি আপডেট করতে সক্ষম হব।

এই প্রয়োজনের জন্য কি কোনও নকশার প্যাটার্ন রয়েছে / কৌশল প্যাটার্নটির সাথে লেগে থাকার সময় আমি কীভাবে এটি বাস্তবায়ন করতে পারি?

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

কেবল জাফায় আমি প্রয়োগ করছি তা স্পষ্ট করে বলতে গেলে এবং তাই optionচ্ছিক পরামিতিগুলির বিলাসিতা নেই (যা এটি সুন্দরভাবে সমাধান করবে)।


সি ++ এর মতো ptionচ্ছিক প্যারামিটারগুলি কোনও কিছুই সমাধান করতে পারে না, কারণ তারা একাধিক ওভারলোডেড পদ্ধতির সংজ্ঞা দেওয়ার জন্য কেবল একটি সংক্ষিপ্ত হাত।
maaartinus

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

উত্তর:


5

স্যামুয়েল, আপনার কৌশলগুলির নির্দিষ্টভাবে প্রয়োজন এমন আরও আচরণ যুক্ত করার জন্য যে কৌশলগুলি প্রতিটি কৌশলই একটি সাধারণ শ্রেণিতে নিয়ে যায় এবং সেই সাধারণ পরামিতি বর্গকে বাড়িয়ে তোলা সম্ভব?

যেমন

StrategyParameter //Base strategy parameter that most of the strategies need
        ^
        |
        |
SpecialStrategyParameter // will be used for strategies that need more parameter

এবং তারপরে, কৌশল শ্রেণিবদ্ধের সংজ্ঞা দিন:

Interface MyStrategy {
   void myStrategyMethod(StrategyParameter parameter);
}

class MyNormalStrategy extends MyStrategy {
   void myStrategyMethod(StrategyParameter parameter) {
       //implement the logic here
   }
}

উপরের কৌশলটি হিসাবে কল করুন: myNormalStrategyInstance.myStrategyMethod(strategyParameter);

class MySpecializedStrategy extends MyStrategy {
   void myStrategyMethod(StrategyParameter parameter) {
       //implement the logic here
   }
}

SpecialStrategyParameterপরিবর্তে উদাহরণস্বরূপ পাস করে উপরের কৌশলটি কল করুন :mySpecializedStrategy.myStrategyMethod(specialStrategyParameter);

কিছু পরিষ্কার না হলে আপডেট করুন। ব্যাখ্যা / স্পষ্ট করতে খুশি হবে।


2
-1 এর জন্য ডাউন কাস্ট দরকার, নকশার এনক্যাপসুলেশনটি ভেঙে দেয়। যদিও এটি প্রশ্নে নকশাটির উন্নতি, তবে এই বিড়ালটির ত্বকের আরও ভাল উপায় রয়েছে।
লম্বা

পছন্দ করুন তবে আমি এর চেয়ে ভাল উপায় দেখতে পাচ্ছি না। আপনি দয়া করে একটি ভাল সমাধান নির্দেশ করতে পারেন? আর্টিকেল নাকি কিছু?
নেরেক

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

4

আপনার কৌশলটি পরিষ্কার করা দরকার ।

এটি কীভাবে আপনি আপনার অ্যালগোরিদম ব্যবহার করেন তার উপর নির্ভর করে । আপনার ক্লায়েন্ট শ্রেণীর জন্য বিভিন্ন কৌশল বাস্তবায়নের বিনিময়যোগ্যভাবে ব্যবহার করার জন্য, তাদের সকলের একটি সাধারণ বিমূর্ততা থাকা দরকার । যদি তারা একই ইন্টারফেস অনুসরণ না করে তবে আপনার যা প্রয়োজন তা বিভিন্ন বিমূর্ততা

আমি আগে কনফিগার করার কৌশলগুলি ব্যবহার করেছি , যেখানে আপনি নির্মাণের উপরের কংক্রিটের ক্লাসগুলি প্যারামিটারাইজ করেন:

interface Strategy {
  int calculate();
}

class ConcreteStrategyThatNeedsAParameter implements Strategy {
  private final int param;
  public ConcreteStrategyThatNeedsAParameter(int param) {
    this.param = param;
  }
  public int calculate() { 
    // uses param...
  }
}

এখন, কারও কাছে এখনও এই শ্রেণীর উদাহরণ তৈরি করা এবং এটি আপনার ক্লায়েন্টের কাছে প্রেরণ করা প্রয়োজন। তবে আপনার ক্লায়েন্টকে এখনও কেবল Strategyইন্টারফেস সম্পর্কে জানতে হবে ।

আপনার কৌশল পদ্ধতিটি যদি পরামিতি নেয় তবে এটিও কাজ করে তবে আপনার ক্লায়েন্ট সেই পরামিতিগুলি সম্পর্কে জানে এবং এটি কার্যকর করে সমস্ত বাস্তবায়নে তাদের পাস করে ।


ক্লায়েন্টটি পরামিতি সরবরাহ করার প্রসঙ্গে একটি।
andyczerwonka

1

ইন্টারফেসে স্বাক্ষরটি যতক্ষণ স্পষ্টভাবে সংজ্ঞায়িত করা হয় ততক্ষণ এটি কৌশল কৌশল অনুসারে মেনে চলে।

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


0

উপরের উত্তরটি পিকিট দ্বারা সরবরাহ করা - আপনি বিমূর্ত ব্যবহার করতে পারেন। আমি এখানে পিকিটের কোড ব্যবহার করছি -

ইন্টারফেস মাইস্ট্রেটজি { বিমূর্ত শূন্য মাইস্ট্রেটজিমেথড (স্ট্র্যাটেজিপ্যারামিটার প্যারামিটার); }

মাই নরমালস্ট্রেজি ক্লাসটি মাইস্ট্রেটগি প্রসারিত করে {পাবলিক ওভাররাইড শূন্য মাইস্ট্রেটমিথথ (স্ট্র্যাটেজিপ্যারামিটার প্যারামিটার) {// এখানে যুক্তি প্রয়োগ করুন}}

ক্লাস মাইস্পেশালাইজড স্ট্রেটজি মাইস্ট্রেটগি প্রসারিত করে {সর্বজনীন ওভাররাইড শূন্য মাইস্ট্রেটমিথথ (স্ট্র্যাটেজিপ্যারামিটার প্যারামিটার, এক্সট্রাস্ট্রেটজিপ্যারামিটার এক্সট্রা প্যারামিটার) {// এখানে যুক্তি বাস্তবায়ন করুন} }

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি কোনও নির্দিষ্ট অ্যালগরিদমে সঠিকভাবে কোনও অতিরিক্ত পরামিতিটি দিতে চান? আপনি কি এটি খুঁজছিলেন দয়া করে আমাকে জানান?


0

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

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