কিছু ওও ডিজাইনের পরামর্শ খুঁজছি


12

আমি একটি অ্যাপ্লিকেশন বিকাশ করছি যা একটি শিল্প পরিবেশে ভালভ খুলতে এবং বন্ধ করতে ব্যবহৃত হবে, এবং এর মতো সহজ কিছু ভাবছিলাম: -

public static void ValveController
{
    public static void OpenValve(string valveName)
    {
        // Implementation to open the valve
    }

    public static void CloseValve(string valveName)
    {
        // Implementation to close the valve
    }
}

(প্রয়োগটি ভাল্বকে নিয়ন্ত্রণ করতে সিরিয়াল বন্দরটিতে কিছু বাইট উপাত্ত লিখবে - ভাল্বের নাম থেকে প্রাপ্ত একটি "ঠিকানা" এবং ভালভ খুলতে বা বন্ধ করতে "1" বা "0")।

অন্য দেব জিজ্ঞাসা করেছিলেন যে আমরা পরিবর্তে প্রতিটি শারীরিক ভালভের জন্য আলাদা ক্লাস তৈরি করা উচিত, যার মধ্যে কয়েক ডজন রয়েছে। আমি সম্মত হই যে কোডটির PlasmaValve.Open()চেয়ে কোডটি লেখার চেয়ে ভাল লাগবে ValveController.OpenValve("plasma"), তবে এটি কি ওভারকিল?

এছাড়াও, আমি ভাবছিলাম যে ভবিষ্যতের বেশ কয়েকটি প্রয়োজনীয় প্রয়োজনীয়তা মাথায় রেখে নকশাটি কীভাবে মোকাবেলা করা যায়:

  1. আমাদের নতুন ধরণের ভালভকে সমর্থন করতে বলা হয় যাতে এটি খুলতে এবং বন্ধ করতে বিভিন্ন মান প্রয়োজন (0 এবং 1 নয়)।
  2. আমাদের এমন একটি ভালভকে সমর্থন করতে বলা হয় যা কেবল "খোলা" বা "বন্ধ" না হয়ে 0-100 থেকে যে কোনও অবস্থানে সেট করা যায়।

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


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

2
অনুমানমূলক ভবিষ্যতের প্রয়োজনীয়তাগুলি নিয়ে চিন্তা করবেন না। YAGNI।
pdr

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

2
মানুষ, 'উত্তরাধিকারের উপরের রচনা' ওভাররেটেড। আমি একটি ভালভ বিমূর্ত শ্রেণি / ইন্টারফেস তৈরি করব এবং তারপরে সেগুলি প্লাজমাভালভে সাবক্লাস করব। এবং তারপরে আমি নিশ্চিত করছিলাম যে আমার ভালভকন্ট্রোলার ভালভ (গুলি) এর সাথে কাজ করবে, কোন সাবক্লাসটি হুবহু সেগুলি যত্ন করে না।
মিস্টারফক্স

2
@ সুসলিক: একেবারে। আমি এমন লোকদের দ্বারা স্প্যাগেটি নামে একটি দুর্দান্ত কোডও দেখেছি যারা সলিড নীতিগুলি বোঝেন না। আমরা এই সঙ্গে চিরতরে যেতে পারে। আমার বক্তব্যটি হ'ল আমি ওভার-আনসারেন্সের কারণে যে সমস্যার মুখোমুখি হয়েছি তার চেয়ে বেশি প্রতিষ্ঠিত নীতিগুলি (বহু বছরের অভিজ্ঞতার জন্মগত) খারিজ করে দেওয়ার কারণে আরও বেশি সমস্যা দেখেছি। তবে আমি একমত যে উভয় চূড়ান্তই বিপজ্জনক।
pdr

উত্তর:


12

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

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


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

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

1

আমার বড় গ্রিপ ভাল্ব সনাক্তকরণের জন্য প্যারামিটারের জন্য স্ট্রিং ব্যবহার করছে।

অন্তত অন্তর্নিহিত বাস্তবায়নের প্রয়োজনীয়তার ফর্মটিতে একটি Valveশ্রেণি তৈরি করুন getAddressএবং সেগুলি পাস করুন ValveControllerএবং নিশ্চিত করুন যে আপনি অস্তিত্বহীন ভালভ তৈরি করতে পারবেন না। এইভাবে আপনাকে প্রতিটি ওপেন এবং ক্লোজ পদ্ধতিতে ভুল স্ট্রিং পরিচালনা করতে হবে না।

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

আপনি যদি টেস্টিং পছন্দ করেন তবে আপনার ValveControllerএকটি সিঙ্গলটনও তৈরি করা উচিত যাতে আপনি এটি উপহাস করতে পারেন (বা অপারেটরদের জন্য একটি প্রশিক্ষণ মেশিন তৈরি করতে পারেন)।


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

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