একক দায়িত্বের নীতিটি ভঙ্গ না করে কীভাবে কোনও শ্রেণীর একাধিক পদ্ধতি থাকতে পারে


64

একক দায়িত্ব নীতি উইকিপিডিয়া হিসাবে সংজ্ঞায়িত করা হয়

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

কোনও শ্রেণীর যদি কেবল একটি একক দায়িত্ব থাকা উচিত, তবে এটির 1 টির বেশি পদ্ধতি কীভাবে থাকতে পারে? প্রতিটি পদ্ধতির আলাদা আলাদা দায়িত্ব থাকবে না, যার অর্থ ক্লাসের 1 টিরও বেশি দায়িত্ব থাকবে।

প্রতিটি উদাহরণ আমি একক দায়িত্বের নীতিটি প্রদর্শন করতে দেখেছি একটি উদাহরণ বর্গ ব্যবহার করে যার কেবল একটি পদ্ধতি রয়েছে। এটি উদাহরণ দেখতে বা একাধিক পদ্ধতি সহ এমন একটি শ্রেণীর ব্যাখ্যা পেতে সহায়তা করতে পারে যা এখনও একটি দায়িত্ব বলে মনে করা যেতে পারে।


11
কেন ডাউনটা? SE.SE- এর জন্য আদর্শ প্রশ্নের মতো মনে হচ্ছে; ব্যক্তি বিষয়টি নিয়ে গবেষণা করেছেন এবং প্রশ্নটি খুব স্পষ্ট করে তোলার চেষ্টা করেছেন। পরিবর্তে এটি upvotes প্রাপ্য।
আর্সেনী মরজেনকো

19
ডাউনভোটটি সম্ভবত এটি এমন একটি প্রশ্ন হওয়ার কারণে হয়েছিল যা ইতিমধ্যে বেশ কয়েকবার জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে, উদাহরণস্বরূপ সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেক্সঞ্জ / প্রশ্নগুলি / 345018/… দেখুন । আমার মতে, এটি যথেষ্ট নতুন দিক যুক্ত করে না।
হান্স-মার্টিন মোসনার


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

6
@ ড্যারেলহফম্যান এটি সত্য নয়। যদি প্রতিটি শ্রেণি শুধুমাত্র "কল ()" পদ্ধতি সহ ফান্টেক্টর হত, তবে আপনি মূলত অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে সাদামাটা পদ্ধতিগত প্রোগ্রামিংটি অনুকরণ করেছেন। আপনি এখনও অন্যথায় যা কিছু করতে পারতেন তা করতে পারেন, যেহেতু একটি ক্লাস'স "কল ()" পদ্ধতিটি অন্যান্য ক্লাসের "" কল () "পদ্ধতিতে কল করতে পারে।
ভেলাস

উত্তর:


29

একক দায়িত্ব এমন কিছু নাও হতে পারে যা একটি একক ক্রিয়াকলাপ সম্পাদন করতে পারে।

 class Location { 
     public int getX() { 
         return x;
     } 
     public int getY() { 
         return y; 
     } 
 }

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

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

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

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

"একটি মডিউল একজনের জন্য দায়বদ্ধ হওয়া উচিত, এবং কেবল একজনই, অভিনেতা"

রবার্ট সি মার্টিন - ক্লিন আর্কিটেকচার

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

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

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

এখানে প্রয়োগ করার জন্য ক্লাসিক নীতিটিকে কনসার্নস পৃথকীকরণ বলা হয় । আপনি যদি আপনার সমস্ত উদ্বেগ পৃথক করেন তবে যুক্তি দেওয়া যেতে পারে যে কোনও এক জায়গায় যা রয়েছে তা হ'ল উদ্বেগ। ১৯৯১ সালে মুভি সিটি স্লিকাররা আমাদের কোঁকড়া চরিত্রটির সাথে পরিচয় করানোর আগে আমরা এই ধারণাটি বলেছিলাম।

্রফ. এটি ঠিক যে চাচা বব একটি দায়বদ্ধতা বলে উদ্বেগ নয় calls তাঁর প্রতি একটি দায়িত্ব হ'ল আপনি যে বিষয়টির দিকে মনোযোগ দিন। এটি এমন কিছু যা আপনাকে পরিবর্তন করতে বাধ্য করতে পারে। আপনি একটি উদ্বেগের দিকে মনোনিবেশ করতে পারেন এবং এখনও এমন কোড তৈরি করতে পারেন যা বিভিন্ন এজেন্ডাসহ বিভিন্ন গোষ্ঠীর জন্য দায়বদ্ধ।

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

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

ক্রিয়ামূলক এই তাকান যে a.f(x)এবং a.g(x)চ কেবল হয় একটি (x) এর এবং ছ একটি (x) এর। দুটি ফাংশন নয় বরং একসঙ্গে পৃথক পৃথক ফাংশনের জোড়ের ধারাবাহিকতা। দ্য aএমনকি এটি ডাটা আছে নেই। এটি সহজেই হতে পারে আপনি কীভাবে জানেন fএবং কোনটি gপ্রয়োগ করতে চলেছেন। একসাথে পরিবর্তিত ক্রিয়াকলাপগুলি একত্রে অন্তর্ভুক্ত। এটা ভাল পুরানো বহুবাদিতা।

সুযোগ সীমিত করার জন্য এসআরপি হ'ল বহু কারণগুলির মধ্যে একটি। এটি একটি ভাল। তবে একমাত্র নয়।


25
আমি মনে করি এই উত্তরটি এসআরপি বের করার চেষ্টা করে এমন কাউকে বিভ্রান্ত করছে। মিঃ রাষ্ট্রপতি এবং মিসেস ডিরেক্টরের মধ্যে যুদ্ধ প্রযুক্তিগত উপায়ে সমাধান করা যায় না এবং এটি একটি ইঞ্জিনিয়ারিংয়ের সিদ্ধান্তকে ন্যায়সঙ্গত করার জন্য ব্যবহার করা অযৌক্তিক। কনওয়ের আইন কার্যকর।
1:51

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

টিম ওটিঞ্জার বর্ণনা অনুযায়ী কোঁকড়ানো আইন জোর দিয়ে যে একটি পরিবর্তনশীল ধারাবাহিকভাবে একটি জিনিস বোঝানো উচিত । আমার কাছে এসআরপি তার চেয়ে কিছুটা শক্তিশালী; কোনও শ্রেণি ধারণামূলকভাবে "একটি জিনিস" উপস্থাপন করতে পারে, তবুও পরিবর্তনের দুটি বাহ্যিক চালক যদি "একটি জিনিস" এর কিছু দিককে বিভিন্ন উপায়ে আচরণ করে বা দুটি ভিন্ন দিক নিয়ে উদ্বিগ্ন হয় তবে এসআরপি লঙ্ঘন করে। মডেলিংয়ের একটি সমস্যা; আপনি একক শ্রেণীর হিসাবে কিছু মডেল বেছে নিয়েছেন, তবে ডোমেন সম্পর্কে এমন কিছু আছে যা সেই পছন্দটিকে সমস্যাযুক্ত করে তোলে (কোডবেসগুলি বিকশিত হওয়ার সাথে সাথে জিনিসগুলি আপনার পথে আসতে শুরু করে)।
ফিলিপ মিলোভানোভিć

2
@ ফিলিপমিলোভানোভি - ক্যানওয়ের আইন এবং এসআরপি-র মধ্যে তারা যেভাবে দেখছেন তারা চাচা বব তার ক্লিন আর্কিটেকচার বইয়ে এসআরপিকে ব্যাখ্যা করেছিলেন এই ধারণা থেকে আসে যে সংগঠনটির একটি ক্লিন অ্যাকাইক্লিকাল org চার্ট রয়েছে। এটি একটি পুরানো ধারণা। এমনকি বাইবেলে এখানে একটি উক্তি রয়েছে: "কোনও মানুষ দু'জন মনিবের সেবা করতে পারে না"।
candied_orange

1
@ টি কে কে ইম এটি (সমীকরণ করে না) কোঁওয়ের আইনের সাথে কোঁকড়ানো আইনের সাথে সম্পর্কিত নয়। আমি এই ধারণাটি খণ্ডন করছি যে এসআরপি বেশিরভাগ কোঁকড়ানো আইন কারণ চাচা বব নিজেই তাঁর ক্লিন আর্কিটেকচার বইয়ে বলেছিলেন।
candied_orange

48

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

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

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

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

এখন, এই সমস্ত পদ্ধতির একটি লক্ষ্য সাধারণ রয়েছে, সেটি হচ্ছে, একটি ক্রম নিন এবং সিএসভি উত্পন্ন করুন। এটি ক্লাসের একক দায়িত্ব ।


পাবলো এইচ মন্তব্য করেছেন:

দুর্দান্ত উদাহরণ, তবে আমি অনুভব করি যে এটি এখনও এসআরপি কেন একটি শ্রেণিকে একাধিক পাবলিক পদ্ধতিতে অনুমতি দেয় না তার উত্তর দেয় না।

প্রকৃতপক্ষে. আমি যে সিএসভি উদাহরণ দিয়েছি তা আদর্শভাবে একটি পাবলিক পদ্ধতি রয়েছে এবং অন্যান্য সমস্ত পদ্ধতি ব্যক্তিগত। আরও ভাল উদাহরণ একটি Queueশ্রেণীর দ্বারা প্রয়োগ করা একটি সারি হবে । এই শ্রেণিতে মূলত দুটি পদ্ধতি থাকবে: push(এটিও বলা হয় enqueue) এবং pop(এটিও বলা হয় dequeue)।

  • এর দায়বদ্ধতা Queue.pushহ'ল সারির লেজের কোনও জিনিস যুক্ত করা।

  • এর দায়িত্ব Queue.popহ'ল সারির মাথা থেকে কোনও জিনিস সরিয়ে ফেলা এবং যেখানে সারিটি খালি রয়েছে তা পরিচালনা করা।

  • Queueশ্রেণীর দায়িত্ব একটি সারি যুক্তি সরবরাহ করা।


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

1
@ পাবলোএইচ: ফর্সা আমি আরও একটি উদাহরণ যুক্ত করেছি যেখানে একটি শ্রেণিতে দুটি পদ্ধতি রয়েছে।
আর্সেনী মোরজেনকো

30

একটি ফাংশন একটি ফাংশন।

একটি দায়িত্ব একটি দায়িত্ব।

একজন যান্ত্রিকের গাড়ি ঠিক করার দায়িত্ব রয়েছে, যার মধ্যে ডায়াগনস্টিকস, কিছু সাধারণ রক্ষণাবেক্ষণের কাজ, কিছু প্রকৃত মেরামতের কাজ, অন্যের কাছে কাজের কিছু প্রতিনিধি ইত্যাদি জড়িত থাকবে involve

একটি ধারক শ্রেণীর (তালিকা, অ্যারে, অভিধান, মানচিত্র, ইত্যাদির) অবজেক্টগুলি সংরক্ষণ করার দায়িত্ব রয়েছে যার মধ্যে সেগুলি সংরক্ষণ করা, সন্নিবেশকরণের অনুমতি দেওয়া, অ্যাক্সেস সরবরাহ করা, একরকম অর্ডার দেওয়া ইত্যাদি ves

একটি একক দায়িত্বের অর্থ এই নয় যে খুব সামান্য কোড / কার্যকারিতা রয়েছে, এর অর্থ এই যে সেখানে যে কোনও কার্যকারিতা একই দায়বদ্ধতার অধীনে "একত্রে অন্তর্ভুক্ত" রয়েছে।


2
একমত। @ অ্যালিস রোনকেইন - দুটি জবাব বাঁধার জন্য। এবং নেস্টেড দায়িত্বগুলির জন্য, আপনার যান্ত্রিক উপমা ব্যবহার করে, একটি গ্যারেজের যানবাহন রক্ষণাবেক্ষণের দায়িত্ব রয়েছে। গ্যারেজের বিভিন্ন মেকানিক্সের গাড়ির বিভিন্ন অংশের জন্য দায়িত্ব রয়েছে, তবে এই যান্ত্রিকগুলির প্রত্যেকটি একত্রিত হয়ে কাজ করে
wolfsshield

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

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

20

একক দায়িত্বের অর্থ এই নয় যে এটি কেবল একটি কাজ করে।

উদাহরণস্বরূপ একটি ব্যবহারকারী পরিষেবা শ্রেণি নিন:

class UserService {
    public User Get(int id) { /* ... */ }
    public User[] List() { /* ... */ }

    public bool Create(User u) { /* ... */ }
    public bool Exists(int id) { /* ... */ }
    public bool Update(User u) { /* ... */ }
}

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

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

// Interface to read bytes from a stream
type Reader interface {
    Read(p []byte) (n int, err error)
}

// Interface to write bytes to a stream
type Writer interface {
    Write(p []byte) (n int, err error)
}

// Interface to convert an object into JSON
type Marshaler interface {
    MarshalJSON() ([]byte, error)
}

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

আইএসপি এবং এসআরপি-র মধ্যে পার্থক্য চিহ্নিত করার জন্য লুয়ানকে ধন্যবাদ।


3
প্রকৃতপক্ষে, আপনি ইন্টারফেস বিভাজন নীতিটি বর্ণনা করছেন (সোলিডে "আমি")। এসআরপি বেশ আলাদা জন্তু be
লুয়ান

একপাশে, আপনি এখানে কোন কোডিং কনভেনশন ব্যবহার করছেন? আমি আশা বস্তু UserService এবং UserUpperCamelCase হবে, কিন্তু পদ্ধতি Create , Existsএবং Updateআমি lowerCamelCase দিতেন।
KlaymenDK

1
@ ক্লেমেনডিকে আপনি ঠিক বলেছেন, বড় হাতের ব্যবহার গো (বড় হাতের রফতানি / রপ্তানি / পাবলিক, লোয়ারকেস = প্রাইভেট) ব্যবহারের অভ্যাস
জেসি

@ লুয়ান এটি নির্দেশ করার জন্য ধন্যবাদ, আমি আমার উত্তরটি স্পষ্ট করে বলছি
জেসি

1
@ ক্লেমেনডিকে প্রচুর ভাষা পদ্ধতি এবং ক্লাসের জন্য প্যাসকেলকেস ব্যবহার করে। সি # উদাহরণস্বরূপ।
ওমেগাস্টিক

15

একটি রেস্তোঁরায় একটি শেফ আছে। তার একমাত্র দায়িত্ব রান্না করা। তবুও তিনি স্টেকস, আলু, ব্রকলি এবং আরও কয়েক'শ জিনিস রান্না করতে পারেন। আপনি কি আপনার মেনুতে ডিশ প্রতি একজন শেফ ভাড়া নেবেন? বা প্রতিটি থালা প্রতিটি উপাদান জন্য একটি শেফ? বা কোনও শেফ যিনি তার একক দায়িত্ব পালন করতে পারেন: রান্না করতে?

যদি আপনি সেই শেফকেও বেতনের কাজটি করতে বলেন, আপনি যখন এসআরপি লঙ্ঘন করেন that's


4

পাল্টা উদাহরণ: পরিবর্তনযোগ্য রাষ্ট্র সঞ্চয় করা।

ধরা যাক আপনার সর্বকালের সবচেয়ে সহজ ক্লাস ছিল, যার একমাত্র কাজ একটি সঞ্চয় করা int

public class State {
    private int i;


    public State(int i) { this.i = i; }
}

আপনি যদি কেবলমাত্র 1 টি পদ্ধতির মধ্যে সীমাবদ্ধ থাকেন তবে আপনি এনক্যাপসুলেশনটি না ভেঙে এবং সর্বজনীন করা না হলে আপনি হয় একটি setState(), বা একটি রাখতে getState()পারেন i

  • সেটটারটি গেটর ছাড়া অকেজো (আপনি কখনই তথ্যটি পড়তে পারেননি)
  • গেটর সেটটার ব্যতীত অকেজো (আপনি কখনই তথ্যটি পরিবর্তন করতে পারবেন না)।

সুতরাং পরিষ্কার, এই একক দায়িত্ব এই ক্লাসে কমপক্ষে 2 পদ্ধতি থাকা প্রয়োজন । Qed।


4

আপনি একক দায়িত্বের নীতিটি ভুল ব্যাখ্যা করছেন।

একক দায়িত্ব একক পদ্ধতির সমান হয় না। তারা বিভিন্ন জিনিস মানে। সফটওয়্যার বিকাশে আমরা সংহতি সম্পর্কে কথা বলি । ফাংশন (পদ্ধতি) যেগুলির মধ্যে উচ্চ সংহতি রয়েছে "একত্রে" একসাথে এবং একক দায়িত্ব পালন হিসাবে গণ্য হতে পারে।

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


2

জিনিসগুলি দেখার জন্য এবং কার্যকারণের চেয়ে ডেটার দৃষ্টিকোণ থেকে তাদের সংগঠিত করতে এটি প্রায়শই সহায়ক (কোনও ভাষায়, তবে বিশেষত ওও ভাষাগুলিতে) helpful

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

এবং বিশেষত, ক্লাসটির এমন কোনও কিছুই প্রকাশ করা উচিত নয় যার ফলে অসঙ্গতিপূর্ণ বা ভুল ডেটা হতে পারে। উদাহরণস্বরূপ, যদি কোনও Point(0,0) এর মধ্যে (127,127) বিমানের মধ্যে থাকা আবশ্যক , তবে নির্মাতা এবং যে কোনও পদ্ধতি যা নতুন পরিবর্তন বা উত্পাদন Pointকরে তাদের প্রদত্ত মানগুলি যাচাই করা এবং যে কোনও পরিবর্তন যা এই লঙ্ঘন করবে তা প্রত্যাখ্যান করার দায়িত্ব রয়েছে have প্রয়োজন। (প্রায়শই এর মতো কিছু Pointঅপরিবর্তনীয় হতে পারে, এবং Pointএটি নির্ধারণের পরে কোনও সংশোধন করার কোনও উপায় নেই তা নিশ্চিত করে তো শ্রেণীর দায়বদ্ধতাও বোধ করবে)

নোট করুন যে এখানে লেয়ারিং পুরোপুরি গ্রহণযোগ্য। আপনার Pointস্বতন্ত্র পয়েন্টগুলির Polygonসাথে ডিল করার জন্য একটি ক্লাস এবং একটি সেট এর সাথে কাজ করার জন্য একটি ক্লাস থাকতে পারে Point; এগুলির এখনও পৃথক দায়িত্ব রয়েছে কারণ শ্রেণীর Polygonকাছে একটি Point(যেমন একটি পয়েন্টের একটি xএবং একটি yমূল্য উভয়ই রয়েছে ) তা নিশ্চিত করার জন্য কোনও কিছু করার জন্য সমস্ত দায়িত্ব প্রতিনিধিত্ব করে Point

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