একক দায়িত্বের নীতিটি কি নতুন কোডে প্রয়োগ করা যাবে?


20

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

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


6
@Frank - এটা আসলে সাধারণভাবে যে মত সংজ্ঞায়িত করা হয় - যেমন দেখতে en.wikipedia.org/wiki/Single_responsibility_principle
Joris Timmermans

1
আপনি যেভাবে এটিকে উচ্চারণ করছেন তা আমি এসআরপির সংজ্ঞাটি বোঝার উপায় নয়।
পিটার বি

2
কোডের প্রতিটি লাইনের পরিবর্তিত হওয়ার দুটি কারণ রয়েছে (কমপক্ষে): এটি কোনও বাগে অবদান রাখে বা এটি একটি নতুন প্রয়োজনে হস্তক্ষেপ করে।
বার্ট ভ্যান ইনজেন শেহেনা

1
@ বার্টওয়ানজেঞ্জেনচেনাও: এলএল ;-) আপনি যদি এটি দেখতে পান তবে এসআরপি কোথাও প্রয়োগ করা যাবে না।
ডক ব্রাউন

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

উত্তর:


27

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

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

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

 void RunPrintWorkflow()
 {
     var document = ReadDocument();
     var formattedDocument = FormatDocument(document);
     PrintDocumentToScreen(formattedDocument);
 }

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

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

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


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

3
@ থেক্যাপসাইসিঙ্কিড: হ্যাঁ, আপনি (অন্তত অবিলম্বে রিফ্যাক্টরিং করে) করতে পারেন। তবে আপনি খুব খুব ছোট ফাংশন পাবেন - এবং প্রতিটি প্রোগ্রামার এটি পছন্দ করে না। এই উদাহরণটি দেখুন: সাইট. google.com/site/unclebobconsultingllc/…
ডক ব্রাউন

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

1
@ থেক্যাপসাইসিঙ্কিড: আমার সম্পাদনা দেখুন। বাইরের ফাংশনটির প্রধান দায়িত্বটি কোনও নির্দিষ্ট ডিভাইসে মুদ্রণ করা বা নথির বিন্যাস করা নয় - এটি মুদ্রণের কার্যপ্রবাহকে সংহত করা। এবং যখন এই কর্মপ্রবাহের পরিবর্তন হয়, কেবল সেই কারণেই ফাংশনটি পরিবর্তিত হবে
ডক ব্রাউন

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

7

আমি মনে করি আপনি এসআরপিকে ভুল বুঝছেন।

পরিবর্তনের একক কারণটি কোড পরিবর্তন করার বিষয়ে নয় তবে আপনার কোডটি কী করবে তা নয়।


3

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

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

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

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


3

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

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

কোড হ্রাস করার জন্য রিফ্যাক্টর

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

একটি বুলসিয়ে তৈরি করুন

একক ব্যবহারের প্যাটার্নটির উদ্দেশ্য উত্স কোড হ্রাস করা এবং কোডের পুনরায় ব্যবহারের উন্নতি করা হয়েছিল। এটি বিশেষায়িতকরণ এবং সুনির্দিষ্ট বাস্তবায়ন তৈরি করা হয়েছিল। bullseyeআপনার জন্য উত্স কোডে এক ধরণের go to specific tasks। মুদ্রণের ক্ষেত্রে যখন সমস্যা ছিল তখন আপনি ঠিক করতে পারবেন কোথায় এটি ঠিক করতে হবে।

একক ব্যবহারের অর্থ দ্বিধাবিভক্ত ফ্র্যাকচারিং নয়

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

আপনি কি নিশ্চিত যে usageএটি উল্লেখযোগ্যভাবে পরিবর্তিত হয়েছে?

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

নতুন লোকটি কী তাড়াতাড়ি এটি আবিষ্কার করতে সক্ষম হবে?

আপনার সোর্স কোডটি সর্বদা সহজ সংস্থাগুলি বোঝার পক্ষে বজায় রাখুন।

একটি ওয়াচমেকার হবেন না

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

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


2

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

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

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

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


2

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

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

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

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

যা হারিয়ে গেছে তা হ'ল সিস্টেমের দায়িত্ব । আমরা ডিডিডির উপাদানগুলি বিক্রি করি না। এবং আমরা ক্লাসের পদ্ধতিগুলি ভালভাবে করি না। আমরা সিস্টেমের দায়িত্ব বিক্রি করি। কিছু স্তরে, আপনার একক দায়িত্বের নীতিটি আপনার সিস্টেমকে ডিজাইন করতে হবে design

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

এ কারণেই আমি ট্রিগভ রেইনসকাগের ডিসিআই আর্কিটেকচার সম্পর্কে उत्साहিত - যা উপরের লিন আর্কিটেকচার বইটিতে বর্ণিত। এটি "একক দায়বদ্ধতা" হিসাবে একটি স্বেচ্ছাসেবী এবং রহস্যবাদী মানসিকতা হিসাবে ব্যবহৃত হবে যা শেষ পর্যন্ত কিছু বাস্তব প্রসারণ দেয় - যেমন উপরের বেশিরভাগ যুক্তি খুঁজে পাওয়া যায়। এই মাপটি মানব মানসিক মডেলগুলির সাথে সম্পর্কিত: শেষ ব্যবহারকারীরা প্রথম এবং প্রোগ্রামার্স দ্বিতীয়। এটি ব্যবসায়ের উদ্বেগের সাথে সম্পর্কিত। এবং প্রায়শই ঘটনাক্রমে, এটি ফ্ল্যাপটিকে আমাদের চ্যালেঞ্জ করার সাথে সাথে পরিবর্তনকে আবদ্ধ করে।

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


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

1
আহ, আপনি আমার একজন পুরানো পরিচালকের মতো একজন। "আমরা এটি বুঝতে চাই না: আমরা এটির উন্নতি করতে চাই!" এখানে মূল বিষয়গত বিষয় হ'ল নীতিগুলির একটি: এটি "এসআরপি" এর "পি"। সম্ভবত আমি যদি সরাসরি প্রশ্নটির উত্তর দিয়ে থাকি তবে এটি সঠিক প্রশ্ন: এটি ছিল না। আপনি কখনই প্রশ্ন উত্থাপন করেছেন তা নিয়ে আপনি এটি নিতে পারেন।
ক্যাপ করুন

এখানে কোথাও একটি ভাল উত্তর সমাধি আছে। আমার মনে হয় ...
রাবারডাক

0

হ্যাঁ, একক-দায়বদ্ধতা-নীতিটি নতুন কোডে প্রয়োগ করা উচিত।

কিন্ত! একটি দায়িত্ব কি?

"প্রতিবেদন ছাপানো কি দায়বদ্ধতা"? উত্তর, আমি বিশ্বাস করি "সম্ভবত"।

আসুন এসআরপি-র সংজ্ঞাটি "পরিবর্তনের একক কারণ থাকার সাথে" ব্যবহার করার চেষ্টা করি।

মনে করুন আপনার কাছে এমন একটি ফাংশন রয়েছে যা প্রতিবেদনগুলি ছাপায়। আপনার যদি দুটি পরিবর্তন হয়:

  1. সেই কার্যটি পরিবর্তন করুন কারণ আপনার প্রতিবেদনের কালো পটভূমি থাকা দরকার
  2. ফাংশনটি পরিবর্তন করুন কারণ আপনাকে পিডিএফ প্রিন্ট করতে হবে

তারপরে প্রথম পরিবর্তনটি হ'ল "প্রতিবেদনের স্টাইল পরিবর্তন করুন" অন্যটি হ'ল "প্রতিবেদন আউটপুট ফর্ম্যাট পরিবর্তন করুন" এবং এখন আপনার এগুলি দুটি আলাদা ফাংশনে রাখা উচিত কারণ এগুলি ভিন্ন জিনিস।

তবে আপনার দ্বিতীয় পরিবর্তনটি যদি হত:

2b। সেই কার্যটি পরিবর্তন করুন কারণ আপনার প্রতিবেদনের আলাদা ফন্টের প্রয়োজন

আমি বলব উভয় পরিবর্তনগুলি "প্রতিবেদনের স্টাইল পরিবর্তন করুন" এবং তারা একটি ফাংশনে থাকতে পারে।

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


0

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

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

এই বিষয়গুলি সম্পর্কে একটি দুর্দান্ত পঠন: কোপলিয়েন রচিত চর্বিযুক্ত আর্কিটেকচার


0

"মুদ্রণ" এমভিসিতে অনেকটা "ভিউ" এর মতো। যে কেউ বস্তুর বুনিয়াদি বুঝতে পারে সে এটি বুঝতে পারে।

এটি একটি সিস্টেমের দায়িত্ব। এটি এমভিসি - হিসাবে একটি প্রক্রিয়া হিসাবে প্রয়োগ করা হয় - এতে একটি প্রিন্টার (ভিউ), মুদ্রিত জিনিস (মডিউল) এবং প্রিন্টারের অনুরোধ এবং বিকল্পগুলি (কন্ট্রোলার থেকে) জড়িত।

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


0

কোড পরিবর্তন করার অনুরোধগুলি আসতে শুরু করলেই কেবল এসআরপি প্রয়োগ করা শুরু করা কি আরও ভাল ধারণা নয়?

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

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

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

এটি কঠোরভাবে ইঙ্গিত দেয় যে সামগ্রিক দায়িত্ব - কোড "মুদ্রণ" - এর উপ-দায়িত্ব রয়েছে এবং এটি টুকরো টুকরো করা উচিত। এটি প্রতি এসআরপি লঙ্ঘন নয় বরং এটি একটি ইঙ্গিত দেয় যে পার্টিশন (সম্ভবত "ফর্ম্যাট করা" এবং "উপস্থাপন" উপ-কার্যগুলিতে) সম্ভবত প্রয়োজন required আপনি কি সেই দায়িত্বগুলি স্পষ্টভাবে বর্ণনা করতে পারেন যাতে আপনি বুঝতে পারেন যে উপ-কার্যগুলির মধ্যে কী চলছে সেগুলি বাস্তবায়ন না করেই? আপনি যদি পারেন তবে এগুলি যুক্তিযুক্ত বিভাজন হওয়ার সম্ভাবনা রয়েছে।

আমরা যদি একটি সাধারণ বাস্তব উদাহরণ দেখি তবে এটি আরও পরিষ্কার হতে পারে। আসুন আমরা sort()ইউটিলিটি পদ্ধতিটি বিবেচনা করি java.util.Arrays। এটার কাজ কি? এটি একটি অ্যারে বাছাই করে, এবং এটিই এটি করে। এটি উপাদানগুলি মুদ্রণ করে না, এটি সর্বাধিক নৈতিকভাবে ফিট সদস্য খুঁজে পায় না, এটি ডিক্সিকে শিস দেয় না । এটি কেবল একটি অ্যারে বাছাই করে। আপনি কিভাবে জানতে হবে না। বাছাই করা সেই পদ্ধতির একমাত্র দায়িত্ব। (আসলে, জাভাতে আদিম ধরণের সাথে কিছুটা কুৎসিত প্রযুক্তিগত কারণেই বাছাই করার অনেকগুলি পদ্ধতি রয়েছে; যদিও তাদের সবার সমান দায়িত্ব রয়েছে তাই আপনাকে এদিকে কোনও মনোযোগ দিতে হবে না।)

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

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