অন্যথায় যদি - বারবার কোড লজিক


15

আমার বস আমাকে একটি বিশেষ যুক্তি দিয়ে একটি প্রকল্প দিয়েছেন। আমাকে একটি ওয়েব পৃষ্ঠা বিকাশ করতে হবে যা সে পণ্যটিতে না আসা পর্যন্ত অনেক ক্ষেত্রে নেভিগেটরকে নেতৃত্ব দিতে হবে।

এটি সাইটের নেভিগেশনের পাথ স্কিম:

পাথ স্কিম

গুরুত্বপূর্ণ!

পণ্য পৃষ্ঠাতে ন্যাভিগেটর যে ফিল্টারটি চায় তা চয়ন করতে পারে।

  • যদি এ, তবে তাকে বি (এবং তারপরে সি অবশ্যই) বা সি মাধ্যমে যেতে হবে এবং পণ্যগুলিতে পৌঁছাতে হবে।
  • বি যদি হয় তবে সে সি এর মধ্য দিয়ে যেতে হবে এবং পণ্যগুলিতে পৌঁছাতে হবে।
  • যদি সি হয়, তবে সে সরাসরি পণ্যগুলিতে পৌঁছায়।

অবশ্যই আমি যদি এআই থেকে শুরু করি তবে দীর্ঘতম পথটি অনুসরণ করছি এবং আমি যখন আমার পণ্যগুলি পৌঁছাচ্ছি তখন আমার কাছে 3 টি সক্রিয় ফিল্টার রয়েছে।

এখন অবধি আমি নিম্নলিখিত কোডটি বিকাশ করেছি যা ভাল কাজ করে।

if filter_A
  if filter_B
     filter_C()
     .. else ..
  else
     filter_C
    .. else ..
else
   if filter_B
      filter_C()
     .. else ..
   else
     filter_C()
     .. else ..

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

আমি কোডগুলির প্রতিটি বিভাগকে ফাংশনে বিভক্ত করার বিষয়ে ভেবেছিলাম তবে এই ক্ষেত্রে এটি কী ভাল ধারণা?



নিয়ন্ত্রণ প্রবাহ ডায়াগ্রাম সমস্ত নিয়ন্ত্রণের মধ্য দিয়ে যাওয়া দেখায় filter_C, তবে শর্তাধীন বিবৃতি নির্দেশ করে যে নিয়ন্ত্রণ প্রবাহটি প্রায় যেতে পারে filter_C। ? filter_Cচ্ছিক?
কার্টিসএইচএক্স

@ কার্টিসএইচএক্স ফিল্টার সি বাধ্যতামূলক। হ্যাঁ দুঃখিত আমার ভুলটি আমি কপি-পেস্ট করেছি।
কেভিন চিত্তাদিনি

2
এই প্রশ্নটি কীভাবে ভাষা-অজ্ঞাতজ্ঞানী হতে পারে ? জাভাতে একটি আইডোম্যাটিক সলিউশন হাস্কেলের কোনও প্রতিচ্ছবিযুক্ত সমাধান থেকে খুব আলাদা হবে। আপনি কি আপনার প্রকল্পের জন্য কোনও ভাষা নিয়ে সিদ্ধান্ত নেননি?
200_সুচি

উত্তর:


20

ফিল্টারগুলি কোনও পরামিতি নেয় কিনা আপনি তা বলেননি। উদাহরণস্বরূপ, filter_Aএকটি বিভাগ ফিল্টার হতে পারে, যাতে এটি কেবল "আমাকে প্রয়োগ করার দরকার কি" এর প্রশ্ন নয় filter_A, এটি হতে পারে " filter_Aক্ষেত্রের = = ক্ষেত্রের সাথে আমার সমস্ত রেকর্ড প্রয়োগ এবং ফিরিয়ে নেওয়া দরকার fooCategory।"

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

class RequestFilters {
    FilterA filterA;
    FilterB filterB;
    FilterC filterC;
}

তারপরে আপনার এর মতো কিছু থাকতে পারে ( কার্যকর জাভা থেকে এনাম সিঙ্গলটন প্যাটার্ন ব্যবহার করে ):

enum NoOpFilterA implements FilterA {
    INSTANCE;

    public List<Item> applyFilter(List<Item> input) {
       return input;
    }
}

তবে আপনি যদি কিছু আইটেম ফিল্টার করতে চান তবে আপনি পরিবর্তে একটি FilterAবাস্তবায়নের উদাহরণ সরবরাহ করতে পারেন যা আসলে কিছু করে। আপনার পরিস্রাবণ পদ্ধতিটি খুব সহজ হবে

List<Item> filterItems(List<Item> data, RequestFilters filters) {
    List<Item> returnedList = data;
    returnedList = filters.filterA.filter(data);
    returnedList = filters.filterB.filter(data);
    returnedList = filters.filterC.filter(data);
    return returnedList;
}

তবে আমি সবে শুরু করছি।

আমি সন্দেহ করি যে applyFilterকলটি তিনটি ধরণের ফিল্টারের জন্য আসলে একই রকম হবে। যদি এটি হয় তবে আমি এটি উপরে বর্ণিত পদ্ধতিতেও করব না। আপনি কেবলমাত্র একটি ইন্টারফেস রেখে ক্লিনার কোড পেতে পারেন, তারপরে এটি করে:

class ChainedFilter implements Filter {
     List<Filter> filterList;

     void addFilter(Filter filter) {
          filterList.add(filter);
     }

     List<Item> applyFilter(List<Item> input) {
         List<Item> returnedList = input;
         for(Filter f : filterList) {
             returnedList = f.applyFilter(returnedList);
         }
         return returnedList;
     }
}

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

অতিরিক্তভাবে, আপনি NoOpFilterউপরের মতো কিছু যোগ করতে পারেন বা আপনার কোডের জন্য যা কিছু সহজ, আপনি কেবল তালিকায় কোনও নির্দিষ্ট ফিল্টার যুক্ত করতে পারবেন না।


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

যদি আপনার Filterহিসাবে থাকে Predicateতবে আপনি এটি সরাসরি Streamএপিআইতে ব্যবহার করতে পারেন । অনেক ভাষায় একই রকম কার্যকরী গঠন রয়েছে।
বরিস স্পাইডার

3
@ বোরিস্টস্পাইডার কেবলমাত্র সে জাভা 8 ব্যবহার করছে; এমনকি তিনি কোন ভাষা ব্যবহার করছেন তাও বলেননি। অন্যান্য ভাষায় এরকম গঠন রয়েছে তবে আমি কীভাবে এটি করব তার সমস্ত স্বাদে যেতে
চাইনি

3
বোঝা গেছে - এটি কেবল উল্লেখ করার মতো যে এটি যদি ওপি সবচেয়ে ভাল সম্ভাব্য বাস্তবায়ন সরবরাহ করতে চায় তবে এটি অন্বেষণ করার একটি উপায়। ইতিমধ্যে একটি দুর্দান্ত উত্তরের জন্য আপনার অবশ্যই আমার +1 আছে।
বরিস স্পাইডার

3

এই ক্ষেত্রে, ফিল্টারিংয়ের যুক্তি এবং ফিল্টারগুলি কীভাবে চালিত হয় তার নিয়ন্ত্রণ প্রবাহকে আলাদা করা গুরুত্বপূর্ণ is ফিল্টার যুক্তি পৃথক ফাংশনে পৃথক করা উচিত, যা একে অপরের থেকে স্বতন্ত্রভাবে চালানো যেতে পারে।

ApplyFilterA();
ApplyFilterB();
ApplyFilterC();

নমুনা কোড পোস্ট, সেখানে 3 Booleans এর filter_A, filter_Bএবং filter_C। তবে ডায়াগ্রাম থেকে filter_Cসর্বদা চলতে থাকে, যাতে এটি নিঃশর্তে পরিবর্তিত হতে পারে।

দ্রষ্টব্য: আমি ধরে নিচ্ছি যে নিয়ন্ত্রণ প্রবাহ ডায়াগ্রামটি সঠিক। পোস্ট করা নমুনা কোড এবং নিয়ন্ত্রণ প্রবাহ চিত্রের মধ্যে একটি তাত্পর্য রয়েছে।

কোডগুলির একটি পৃথক অংশ যা ফিল্টারগুলি চালিত হয়

ApplyFilters(bool filter_A, bool filter_B)
{
    listOfProducts tmp;
    if (filter_A)
        ApplyFilterA();
    if (filter_B)
        ApplyFilterB();
    ApplyFilterC();
}

কোন ফিল্টারগুলি চালিত হয় এবং ফিল্টারগুলি কী করে তা নিয়ন্ত্রণ করার মধ্যে একটি আলাদা পার্থক্য রয়েছে। যুক্তি টুকরো টুকরো টুকরো টুকরো।


+1 এটি গ্রহণযোগ্য উত্তরের চেয়ে অনেক সহজ এবং ডিকোপলড বলে মনে হচ্ছে।
উইঙ্কব্র্যাস

2

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

if filter_a
  do_filter_a()

if filter_b
  do_filter_b()

do_filter_c()

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

optional_filters_array = (a, b, c, d, e, f, g, h, etc)

for current_filter in optional_filters_array
  do_filter(current_filter)

do_required_filter()

বা:

optional_filters_array = (a, b, c, d, e, f, g, h, etc)
required_filter = last_filter


for current_filter in optional_filters_array
  do_filter(current_filter)

do_filter(required_filter)

উত্স থেকে, আপনি ফিল্টার প্রসেসিং সাবরুটিন সংজ্ঞায়িত করতে হবে।


1

আমি ফিল্টারএ, ফিল্টারবি, এবং ফিল্টারসি প্রকৃতপক্ষে পণ্যগুলির তালিকা পরিবর্তন করতে চলেছি going অন্যথায়, যদি সেগুলি যদি কেবলমাত্র চেক হয় তবে ফিল্টারএ এবং ফিল্টারবি উপেক্ষা করা যেতে পারে যেহেতু সমস্ত পাথ চূড়ান্তভাবে ফিল্টারসকে নিয়ে যায়। আপনার প্রয়োজনীয়তার বিবরণটি বোঝা যাচ্ছে যে প্রতিটি ফিল্টার পণ্য তালিকা হ্রাস করবে।

সুতরাং ধরে নেওয়া ফিল্টারগুলি আসলে পণ্যের তালিকা হ্রাস করে, এখানে সিডো-কোডের কিছুটা ...

class filter
    func check(item) returns boolean
endclass

func applyFilter(filter, productList) returns list
    newList is list
    foreach item in productList
        if filter.check(item) then
            add item to newList
        endif
    endfor 
    return newList
endfunc



filterA, filterB, filterC = subclasses of filter for each condition, chosen by the user
products = list of items to be filtered

if filterA then
    products = applyFilter(filterA, products)
endif

if filterB then
    products = applyFilter(filterB, products)
endif

if filterC then
    products = applyFilter(filterC, products)
endif

# use products...

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

filterC = instance of filter, always chosen

...

# if filterC then
products = applyFilter(filterC, products)
# endif

0

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

আপনি যদি কোনও বস্তুর গ্রাফের মতো ফিল্টারগুলির নির্ভরতা মডেল করেন, তবে সম্ভাব্য প্রবাহের পথগুলি পরিচালনা করে এমন কোড কোনও লোমশ যুক্তি ছাড়াই বেশ সোজা এগিয়ে forward এছাড়াও, গ্রাফ (ব্যবসায়িক যুক্তি) পরিবর্তন করতে পারে, যখন গ্রাফকে ব্যাখ্যা করে এমন কোড একই থাকে।

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