একক দায়িত্ব পরিচালনা করার সময় কীভাবে পরিচালনা করবেন?


10

আমার বেস দুটি ক্লাস আছে, Operationএবং Trigger। প্রত্যেকের বেশ কয়েকটি সাবক্লাস রয়েছে যা নির্দিষ্ট ধরণের অপারেশন বা ট্রিগারগুলিতে বিশেষজ্ঞ। একটি Triggerএকটি নির্দিষ্ট ট্রিগার করতে পারে Operation। যখন Operationএকটি নির্দিষ্ট দ্বারা ট্রিগার করা যেতে পারে Trigger

আমার দেওয়া কোডটি লিখিত হওয়া দরকার যা Operationএকটি প্রদত্ত Trigger(বা বিপরীতে) প্রদত্ত একটি মানচিত্র তৈরি করে , তবে আমি এটি কোথায় রাখব তা নিশ্চিত নই।

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

আমি তিনটি বিকল্প দেখতে পাচ্ছি যা সমস্ত কাজ করবে। যদিও 1 এবং 2 কেবল শব্দার্থবিজ্ঞানের পছন্দ হিসাবে উপস্থিত হয়, 3 সম্পূর্ণরূপে একটি পৃথক পদ্ধতির প্রতিনিধিত্ব করে।

  1. ট্রিগার যেমন উপর bool Triggers(Operation o)
  2. অপারেশন, যেমন bool TriggeredBy(Trigger t)
  3. সম্পূর্ণ নতুন ক্লাসে যা ম্যাপিং পরিচালনা করে, যেমন bool MappingExists(Trigger t, Operation o)

আমি কীভাবে সিদ্ধান্ত নেব যে একক দায়বদ্ধতার নীতি অনুসারে ভাগ করা ম্যাপিং কোডটি কোথায় রাখব?

একক দায়িত্ব পরিচালনা করার সময় কীভাবে পরিচালনা করবেন?


সম্পাদনা 1।

সুতরাং আসল কোডটি এরকম দেখাচ্ছে। সকল সম্পত্তি, হয় একজন string, Guid, collection<string>, অথবা enum। এগুলি মূলত কেবলমাত্র ছোট ছোট ডেটা উপস্থাপন করে।

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা 2।

বুলের রিটার্ন টাইপের কারণ। অন্য ক্লাস একটি সংগ্রহ Triggerএবং একটি সংগ্রহ গ্রাস করতে চলেছে Operation। এটি Triggerএবং ক এর মধ্যে কোন ম্যাপিং বিদ্যমান তা জানতে হবে Operation। এটি একটি তথ্য তৈরি করতে সেই তথ্য ব্যবহার করবে।


কেন বুল টাইপ?
তুলিনস কর্ডোভা

কলিং কোডটিতে ফলাফল ফিরিয়ে আনতে @ ব্যবহারকারী 61852
জেমস উড

1
কলিং কোড বুলিয়ান দিয়ে কী করে? আপনি এই প্রশ্নের জবাব কী দিয়েছিলেন তার উপর নির্ভর করে আমার সমাধান হতে পারে।
তুলাইনস কর্ডোভা

@ ব্যবহারকারী 61852, দয়া করে আমার সম্পাদনা দেখুন।
জেমস উড

1
সুতরাং এটির সাথে আসলে কিছুই করার নেই অপারেশন ট্রিগার কার্যকর?
তুলাইনস কর্ডোভা

উত্তর:


4

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

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

নোট করুন যে এই চিন্তাভাবনার লাইনের মূল অনুমানটি হ'ল ন্যূনতম কোড লিখুন (অর্থাত্ আজ তিনটি শ্রেণি) তবে যদি ভবিষ্যতে কার্যকারিতা বাড়ানোর প্রয়োজন অনুমান না করে ভবিষ্যতে কার্যকারিতাটি সর্বদা একদিক থাকবে ঠিক তখনই বড় সংশোধনকারী এড়ানো to কোন ট্রিগার কোন অপারেশনের কারণ নির্ধারণ করে।

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


5

ওখানে এসেছি।

বিকল্প # 3।

আপনি কোন ভাষাটি ব্যবহার করবেন তা আমি জানি না তবে আমি জাভায় খুব সিডিলারযুক্ত একটি সিউডো কোড ব্যবহার করব। আপনার ভাষা যদি সি # হয় তবে আপনার সম্ভবত একই রকম ইন্টারফেস এবং কাঠামো রয়েছে।

একটি ম্যাপিং ক্লাস বা ইন্টারফেস রয়েছে:

public interface Mapping {
    public void setObject1(Object o);
    public void setObject2(Object o);
    public Object getObjecto1();
    public Object getObjecto2();
}
  • সংগ্রহের equals()পদ্ধতিটি ওভাররাইড করুন Mappingযাতে Mappingতাদের প্রদত্ত ম্যাপিং রয়েছে কিনা তা জিজ্ঞাসা করা যেতে পারে।
  • স্পেশালাইজড অবজেক্টগুলির equals()পাশাপাশি অ্যাডুয়েট পদ্ধতি থাকতে হবে ।
  • ইন্টারফেসটিও বাস্তবায়ন করুন Comparable, যাতে আপনি রিপোর্টগুলি বাছাই করতে পারেন।

এগুলি আপনি সহজেই কোনও সংগ্রহে কোনও ম্যাপিং রাখতে পারেন

List<Mapping> list = new ArrayList<Mapping>();
Hat hat = new Hat();
Bag bag = new Bag();
list.add(new Mapping(hat,bag));

পরে আপনি জিজ্ঞাসা করতে পারেন:

// let's say you have a variable named x which is of type Mapping

if ( list.contains(x) ){
    // do some thing
}

0
  1. আপনার কোডটি ছোট ছোট বিটগুলিতে ভাঙ্গুন।

বর্তমানে আপনার ক্লাস এ সম্পর্কে ক্লাস বি সম্পর্কে জানা এবং ক্লাস বি ক্লাস এ সম্পর্কে জেনে রাখা আছে Tha

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

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

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


1
সমস্ত সততার সাথে আমি নিশ্চিত না যে আমি আমার কোডটি আরও ভেঙে ফেলতে পারি। আমি আমার প্রশ্নটি ক্লাসের স্বাক্ষরের সাথে আপডেট করেছি যাতে আপনি দেখতে পান তবে মূলত এগুলি হ'ল বেশ কয়েকটি হালকা ডেটা অবজেক্ট যা প্রতিটি কয়েকটি সম্পত্তি সংরক্ষণ করে। মিলনের ক্ষেত্রে, হ্যাঁ এটি সামান্য সমস্যাযুক্ত, কারণ কার্যকরভাবে এটিকে একটি করে যুক্ত করা Triggerহবে Operation। কিন্তু এটি প্রকৃত বিশ্বের ডেটা দেখতে কেমন তা সাজানোর। তারা মিলিত হয়েছে, কারণ একটি ম্যাপিং রয়েছে, উদাহরণস্বরূপ তাদের একে অপরের সম্পর্কে অর্থ জানতে হবে।
জেমস উড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.