একক দায়িত্বের নীতিটি কি কার্যক্রমে প্রযোজ্য?


17

রবার্ট সি মার্টিনের মতে এসআরপি বলেছে যে:

শ্রেণীর পরিবর্তনের জন্য একাধিক কারণ থাকতে হবে না।

তবে তাঁর ক্লিন কোড বইয়ে , অধ্যায় 3: ফাংশনগুলি, তিনি নিম্নলিখিত কোডের ব্লকটি দেখান:

    public Money calculatePay(Employee e) throws InvalidEmployeeType {
        switch (e.type) {
            case COMMISSIONED:
                return calculateCommissionedPay(e);
            case HOURLY:
                return calculateHourlyPay(e);
            case SALARIED:
                return calculateSalariedPay(e);
            default:
                throw new InvalidEmployeeType(e.type);
        }
    }

এবং তারপরে বলা হয়েছে:

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

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


5
এটি বহুবর্ষের জন্য পাঠ্যপুস্তকের ক্ষেত্রে বলে মনে হচ্ছে।
wchargin

এটি অত্যন্ত আন্তঃসঙ্গ বিষয় is এই সমস্যাটির জন্য আপনি নিম্নলিখিত সমাধানটি যুক্ত করার সুযোগ রয়েছে? আমি দৃ se়ভাবে বলতে চাই যে একজন প্রতিটি কর্মচারী ক্লাসে একটি গণনা পে ফুকশন রেখেছিল তবে এটি এখন খারাপ কর্মচারী হবে প্রতি কর্মচারী শ্রেণিটি: 1 এর পরিবর্তিত হতে পারে bec পেমেন্ট গণনা। ক্লাসে আরও সম্পত্তি যুক্ত করা ইত্যাদি
স্টাভ আলফি 7'16

উত্তর:


13

একক দায়বদ্ধতার নীতিমালাটির প্রায়শই একটি মিস হওয়া বিশদটি হ'ল "পরিবর্তনের কারণগুলি" ব্যবহারের ক্ষেত্রে অভিনেতাদের দ্বারা শ্রেণিবদ্ধ করা হয় (আপনি এখানে পুরো ব্যাখ্যা দেখতে পারেন )।

সুতরাং, আপনার উদাহরণে, calculatePayযখনই নতুন ধরণের কর্মচারী প্রয়োজন হয় তখন পদ্ধতিটি পরিবর্তন করা দরকার। যেহেতু এক ধরণের কর্মচারীর অন্যের সাথে কোনও সম্পর্ক নাও থাকতে পারে, তাই যদি আপনি তাদের একসাথে রাখেন তবে এটি নীতি লঙ্ঘন হবে, যেহেতু এই পরিবর্তনটি সিস্টেমের বিভিন্ন ব্যবহারকারী-গোষ্ঠীগুলিতে (বা ব্যবহারের ক্ষেত্রে অভিনেতাদের) প্রভাবিত করবে।

এখন, নীতিটি ফাংশনগুলিতে প্রযোজ্য কিনা তা সম্পর্কে: যদিও কেবলমাত্র একটি পদ্ধতিতে আপনার লঙ্ঘন হয়েছে, আপনি এখনও একাধিক কারণে ক্লাস পরিবর্তন করছেন, সুতরাং এটি এখনও এসআরপি লঙ্ঘন।


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

@ মিশেলশা 10:40 থেকে দেখার চেষ্টা করুন। চাচা বব উল্লেখ করেছেন যে কোডটি "বিভিন্ন কারণে, বিভিন্ন লোকের কারণে পরিবর্তিত হবে"। আমি মনে করি যে এটি হতে পারে মিশেলহেনরিচ আমাদের দিকে ইঙ্গিত করার চেষ্টা করছে।
এনারিক

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

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

1
@ মিশেলশা হ্যাঁ, আপনি ঠিক বলেছেন - সংগঠনটি কীভাবে সংগঠিত হয় তার উপর এসআরপি নির্ভর করে না। ঠিক এই কারণেই আমি আমার সমস্ত মন্তব্যে "মে" বা "হতে পারে" যুক্ত করছি :)। তবে, সেই ক্ষেত্রেও কোডটি এসআরপি লঙ্ঘন করতে পারে না, এটি অবশ্যই ওসিপি লঙ্ঘন করে।
মিশেলহেনরিচ

3

পৃষ্ঠা 176, অধ্যায় 12: উত্থান, ন্যূনতম শ্রেণি এবং পদ্ধতি শিরোনামে বিভাগটি উল্লেখ করে কিছু সংশোধন সরবরাহ করে:

আমাদের ক্লাস এবং পদ্ধতিগুলি ছোট করার প্রয়াসে আমরা অনেকগুলি ছোট ছোট ক্লাস এবং পদ্ধতি তৈরি করতে পারি। সুতরাং এই নিয়মটি পরামর্শ দেয় যে আমরা আমাদের ফাংশন এবং শ্রেণি সংখ্যাও কম রাখি

এবং

উচ্চ শ্রেণি এবং পদ্ধতি গণনা কখনও কখনও অর্থহীন কৌতূহলের ফলাফল are

স্পষ্টতই, তিনি calculatePay()উপরের মতো নিখুঁত নিখুঁত ছোট্ট পদ্ধতিগুলি ভেঙে ফেলার জন্য এসআরপি অনুসরণ করে গোড়ামীবাদের কথা বলছেন ।


3

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

আমি কোনও একটি পরিবর্তনের একাধিক কারণ দেখতে পাচ্ছি না এবং আমি বিশ্বাস করি না যে "দায়িত্ব" বা "পরিবর্তনের কারণ" হিসাবে এসআরপি নিয়ে ভাবনা সহায়ক। মূলত এসআরপি যা পাচ্ছে তা হ'ল সফ্টওয়্যার সত্তা (ফাংশন, ক্লাস, ইত্যাদি) একটি কাজ করা উচিত এবং এটি ভালভাবে করা উচিত।

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

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


-2

আপনি ঠিকই বলেছেন এটি কোনও ফাংশন বা কোনও শ্রেণীর কোনও পদ্ধতি নয়, এসআরপি মানে এই কোডটি ব্লক করে আপনি কেবল একটি কাজ করেন।

'কারণ পরিবর্তন করতে' বিবৃতি কখনও কখনও একটি বিট বিভ্রান্তিকর, কিন্তু যদি আপনি পরিবর্তন calculateSalariedPayবা calculateHourlyPayঅথবা enum Employee.typeআপনি এই পদ্ধতি পরিবর্তন করতে হবে।

আপনার উদাহরণে ফাংশন:

  • কর্মচারীর ধরণ পরীক্ষা করে
  • আর একটি ফাংশন কল করে যা ধরণ অনুসারে অর্থ গণনা করে

আমার মতে এটি সরাসরি কোনও এসআরপি লঙ্ঘন নয়, যেহেতু আপনি যদি কর্মচারী এবং পদ্ধতিগুলি ইতিমধ্যে বিদ্যমান মনে করেন তবে স্যুইচ-কেস এবং কলগুলি আরও ছোট লেখা যায় না। যাইহোক এটি একটি পরিষ্কার ওপেন-ক্লোজড নীতি (ওসিপি) লঙ্ঘন কারণ আপনি অবশ্যই কর্মীদের প্রকার যুক্ত করলে 'কেস' বিবৃতি যুক্ত করতে হবে, সুতরাং এটি একটি খারাপ বাস্তবায়ন: এটি রিফ্যাক্টর।

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

এটির গণনা করা যদি আরও জটিল হয় তবে কেউ ভিজিটর-প্যাটার্নটি ব্যবহার করতে পারে যা 100% এসআরপি নয় তবে এটি সুইচ কেসের চেয়েও বেশি ওসিপি।


2
ফাংশনটি কীভাবে আপনি 2 টি জিনিস তালিকাভুক্ত করতে পারেন তা নিশ্চিত নন তবে বলুন এটি কোনও এসআরপি লঙ্ঘন নয়।
জেফো 1

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