একক দায়িত্বের নীতি - আমি কোড বিভাজন এড়াতে পারি কীভাবে?


56

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

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

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

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

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

তা ছাড়া, আমি এমন কোনও সমাধানের কথা ভাবতে পারি না যা সবাইকে খুশি রেখে আমাদের বিকাশের প্রচেষ্টা চালিয়ে যেতে দেয় will

কোনও পরামর্শ ?


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

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

62
20 কনস্ট্রাক্টর প্যারামিটার সহ একটি ক্লাস আমার কাছে খুব বেশি এসআরপি শোনায় না!
ম্যাটড্যাভে

1
আপনি লিখুন "... আইওসি রেজিস্ট্রেশন এবং রেজোলিউশন ..."; এটি মনে হয় যেন আপনি (বা আপনার দলের নেতৃত্ব) "আইওসি" এবং "নির্ভরতা ইনজেকশন" (ডিআই) একই জিনিস, যা সত্য নয়। আইওসি অর্জনের একটি উপায় ডিআই, তবে অবশ্যই এটি একমাত্র নয়। আপনি কেন আইওসি করতে চান তা আপনার সাবধানে বিশ্লেষণ করা উচিত ; যদি আপনি ইউনিট পরীক্ষা লিখতে চান কারণ এটি হয় তবে আপনি পরিষেবাটি লোকেটার প্যাটার্ন বা কেবল ইন্টারফেস ক্লাস ( ISomething) ব্যবহার করার চেষ্টা করতে পারেন । আইএমএইচও, নির্ভরতা ইনজেকশনের চেয়ে এই অ্যাপ্রোসগুলি হ্যান্ডেল করা অনেক সহজ এবং এর ফলে আরও পঠনযোগ্য কোড পাওয়া যায়।

2
এখানে প্রদত্ত যে কোনও উত্তর একটি শূন্যস্থানে থাকবে; একটি নির্দিষ্ট প্রতিক্রিয়া জানাতে আমাদের কোডটি দেখতে হবে। একটি কনস্ট্রাক্টরে 20 পরামিতি? ঠিক আছে, আপনি কোনও জিনিস মিস করছেন ... বা সেগুলি সবই বৈধ হতে পারে; অথবা তারা কোনও কনফিগার ফাইলে থাকতে পারে, বা তারা কোনও ডিআই ক্লাসে থাকতে পারে, বা ... লক্ষণগুলি অবশ্যই সন্দেহজনক মনে হয়, তবে সিএস-এর বেশিরভাগ জিনিসের মতো, "এটি নির্ভর করে" ...
স্টিভেন এ লো লো

উত্তর:


84

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

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

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

সম্পাদনা

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

সম্পাদনা 2

যদি আপনি রিফ্যাক্টরিং সম্পর্কিত টিপস সন্ধান করেন, আপনি যা পরামর্শ করেছিলেন তা করা শুরু করতে পারেন - বেশ কয়েকটি অন্যান্যকে মোড়ানোর জন্য মোটা-দানাযুক্ত শ্রেণি তৈরি করুন। নিশ্চিত করুন যে মোটা-দানাদার শ্রেণি এখনও এসআরপি মেনে চলেছে তবে উচ্চতর স্তরে। তারপরে আপনার দুটি বিকল্প রয়েছে:

  1. যদি সূক্ষ্ম-দানযুক্ত ক্লাসগুলি আর সিস্টেমে অন্য কোথাও ব্যবহার না করা হয় তবে আপনি ধীরে ধীরে মোটা দানাযুক্ত শ্রেণিতে তাদের প্রয়োগটি টানতে এবং সেগুলি মুছতে পারেন।
  2. সূক্ষ্ম দানযুক্ত ক্লাসগুলি একা ছেড়ে যান। সম্ভবত সেগুলি খুব ভালভাবে ডিজাইন করা হয়েছিল এবং এগুলি সহজে ব্যবহারের সহজ করার জন্য আপনার কেবল মোড়কের প্রয়োজন। আপনার প্রকল্পের বেশিরভাগ ক্ষেত্রে এটি আমার সন্দেহ for

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


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

18
আমি শিখি শিখি কীসের জন্য, তবে কীভাবে তুমি খুঁটি দিয়ে মাছ ধরছ?
আর মার্টিনহো ফার্নান্দেস

13
+1 সলিড একটি শেষের উপায়, নিজের মধ্যে শেষ নয়।
বি সেভেন

1
+1: আমি যুক্তি দিয়েছিলাম যে "ল অফ অফ ডেমিটার" এর মতো জিনিসগুলি ভুল নামকরণ করা হয়েছে, এটি "ডিমেটারের গাইড লাইন" হওয়া উচিত। এই জিনিসগুলি আপনার জন্য কাজ করা উচিত, আপনি তাদের জন্য কাজ করা উচিত নয়।
বাইনারি ওয়ারিয়ার

2
@ ইমাদকরিম: এটি সত্য যে ডিএও অবজেক্টের বেশ কয়েকটি বৈশিষ্ট্য থাকার কথা। তবে তারপরে আবারও বেশ কয়েকটি বিষয় রয়েছে যা আপনি Customerক্লাসের মতো সাধারণ কিছুতে একসাথে গোষ্ঠীভুক্ত করতে পারেন এবং আরও রক্ষণাবেক্ষণযোগ্য কোড রাখতে পারেন। এখানে উদাহরণগুলি দেখুন: কোডমোনকিিজম.com/…
স্পোকাইক

32

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

যদি প্রথম প্রশ্নের উত্তর হয়, প্রতিটি ক্ষেত্রে "হ্যাঁ" তবে দ্বিতীয় প্রশ্নটি "এমনকি খুব কাছেরও নয়", তবে আপনি কীভাবে এসআরপি প্রয়োগ করছেন তা আপনাকে আবার দেখার প্রয়োজন।

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

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

তবে আপনি যদি একটি ওআরএম প্রবর্তন করেন তবে ক্লাসগুলি এমনভাবে কাজ করতে পারে যে আপনি ডিটিওতে কোনও ক্ষেত্র যুক্ত করলে এটি স্বয়ংক্রিয়ভাবে সেই ডেটা পড়ার জন্য ব্যবহৃত এসকিউএলকে পরিবর্তন করে দেয়। তারপরে আপনি দুটি উদ্বেগকে আলাদা করার জন্য ভাল কারণ পেয়েছেন।

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


"1 এর জন্য" প্রতিটি পরিবর্তন কি কেবল একটি শ্রেণিকেই প্রভাবিত করে? "
ডিজে 18

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

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

23

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

public class MyAwesomeClass {
    public class MyAwesomeClass(IDependency1 _d1, IDependency2 _d2, ... , IDependency20 _d20) {
      // Assign it all
    }
}

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

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

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

সুতরাং আপনি এই ধাঁধাটি কীভাবে সমাধান করবেন? আপনি অন্যান্য ক্লাসে দায়িত্ব স্থানান্তর। এই শ্রেণীর ক্লাসে আপনি নিতে পারেন এমন কিছু পদক্ষেপ রয়েছে:

  1. আপনার শ্রেণি নির্ভরতাগুলির সাথে করে এমন সমস্ত ক্রিয়া (বা দায়িত্ব) সনাক্ত করুন)
  2. ঘনিষ্ঠভাবে সম্পর্কিত নির্ভরতা অনুযায়ী ক্রিয়াগুলি গ্রুপ করুন।
  3. Redelegate! অর্থ্যাপি নতুন বা (আরও গুরুত্বপূর্ণভাবে) অন্য শ্রেণিতে প্রতিটি চিহ্নিত ক্রিয়াকলাপের রিফ্যাক্টর।

রিফ্যাক্টরিংয়ের দায়িত্বগুলির একটি বিমূর্ত উদাহরণ

যাক Cএকটি বর্গ বিভিন্ন নির্ভরতা যে হতে D1, D2, D3, D4আপনি কম ব্যবহার করতে refactor করা প্রয়োজন। যখন আমরা সনাক্ত করি যে কোন পদ্ধতিগুলি Cনির্ভরতাগুলিতে কল করে আমরা এটির একটি সহজ তালিকা তৈরি করতে পারি:

  • D1- performA(D2),performB()
  • D2 - performD(D1)
  • D3 - performE()
  • D4 - performF(D3)

তালিকার দিকে তাকিয়ে আমরা দেখতে পাচ্ছি D1এবং D2একে অপরের সাথে সম্পর্কিত কারণ শ্রেণিটির একরকম তাদের একসাথে প্রয়োজন। আমরা সেই D4প্রয়োজনগুলিও দেখতে পারি D3। সুতরাং আমাদের দুটি গ্রুপিং রয়েছে:

  • Group 1- D1<->D2
  • Group 2- D4->D3

গ্রুপিংগুলি এমন একটি সূচক যা ক্লাসে এখন দুটি দায়িত্ব রয়েছে।

  1. Group 1- কলিং দুটি অবজেক্টের একে অপরের প্রয়োজন হ্যান্ডলিংয়ের জন্য একটি। হতে পারে আপনি আপনার শ্রেণিকে Cউভয় নির্ভরতা হ্যান্ডেল করার প্রয়োজনটিকে দূর করতে এবং তার পরিবর্তে সেই কলগুলি পরিচালনা করার মধ্যে একটিতে ছেড়ে যেতে পারেন। এই গোষ্ঠীকরণের ক্ষেত্রে এটি স্পষ্টতই D1উল্লেখ করা যেতে পারে D2
  2. Group 2- অন্য দায়বদ্ধতার জন্য অন্যকে কল করার জন্য একটি বিষয় প্রয়োজন। আপনার ক্লাসের পরিবর্তে D4হ্যান্ডেল করতে পারবেন না D3? তারপরে আমরা সম্ভবত কলগুলি না করে D3ক্লাস থেকে বাদ Cদিতে D4পারি।

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


সম্পাদনা:

@ ইমাদ কারেমের মন্তব্যগুলির মধ্যে রয়েছে :

"যদি আপনার শ্রেণীর কনস্ট্রাক্টরে 20 টি প্যারামিটার থাকে তবে এটি আপনার শোনায় না যে আপনার দলটি এসআরপি কী তা বেশ ভাল জানে। গ্রাহক শ্রেণি রয়েছে, কনস্ট্রাক্টরে 20 টি পরামিতি থাকা আশ্চর্যজনক নয়।

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

public class Address {
    private String street1;
    //...

    private Zipcode zipcode;

    // easy to extend
    public bool isValid() {
        return zipcode.isValid();
    }
}

public class Zipcode {
    private string zipcode;
    public bool isValid() {
        // return regex match that zipcode contains numbers
    }
}

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


+1: দুর্দান্ত উত্তর! গ্রুপিং আইএমও একটি খুব শক্তিশালী প্রক্রিয়া কারণ আপনি পুনরায় গ্রুপিং প্রয়োগ করতে পারেন। খুব মোটামুটিভাবে বলছি, এন বিমূর্ত স্তরগুলির সাহায্যে আপনি 2 ^ n আইটেমগুলি সংগঠিত করতে পারেন।
জর্জিও

+1: আপনার প্রথম কয়েকটি অনুচ্ছেদগুলি ঠিক আমার দলটির মুখোমুখি। "বিজনেস অবজেক্টস" যা প্রকৃতপক্ষে সেবার অবজেক্ট এবং ইউনিট টেস্ট সেটআপ কোড যা লিখতে মন বোধ করে। আমি জানতাম যখন আমাদের পরিষেবা স্তর কলগুলিতে কোডের একটি লাইন থাকবে তখন আমাদের একটি সমস্যা হয়েছিল; একটি ব্যবসায় স্তর পদ্ধতিতে কল।
ম্যান

3

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

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

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

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


3

উত্তর হ'ল মেইনটেইনযোগ্যতা এবং সর্বোপরি কোডের স্পষ্টতা। আমার জন্য এর অর্থ কম কোড লেখা , বেশি নয়। কম বিমূর্ততা, কম ইন্টারফেস, কম বিকল্প, কম পরামিতি।

আমি যখনই কোনও কোডের পুনর্গঠনকে মূল্যায়ন করি বা নতুন বৈশিষ্ট্য যুক্ত করি তখন আসল যুক্তির তুলনায় কতটা বয়লারপ্লেট প্রয়োজন হবে তা আমি ভাবি। উত্তরটি যদি 50% এর বেশি হয় তবে এর অর্থ সম্ভবত আমি এটাকে ভেবে দেখছি।

এসআরপির শীর্ষে, আরও অনেকগুলি বিকাশ শৈলী রয়েছে। আপনার ক্ষেত্রে ইয়াগএনআই এর মতো শব্দগুলির অবশ্যই অভাব রয়েছে।


3

এখানে প্রচুর উত্তরগুলি সত্যই ভাল তবে এটি এই সমস্যার প্রযুক্তিগত দিকে মনোনিবেশ করে। আমি কেবল যুক্ত করব যে এটি এসআরপি সাউন্ডটি অনুসরণ করার মতো বিকাশকারীদের প্রচেষ্টার মতো শোনাচ্ছে যা তারা আসলে এসআরপি লঙ্ঘন করে।

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

মনে রাখবেন যে এসআরপি "পরিবর্তনের কারণ" এবং "একটি কাজ কর" না বোঝায় এবং পরিবর্তন আসার আগ পর্যন্ত পরিবর্তনের সেই কারণটি নিয়ে নিজেকে উদ্বিগ্ন হওয়ার দরকার নেই। দ্বিতীয় লোক বিমূর্ততার জন্য অর্থ প্রদান করে।

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

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

যদি আপনি উভয়ই স্বীকার করতে পারেন যে এসআরপি একটি ভাল জিনিস, আপনি কেবল দিকগুলি অন্যরকমভাবে ব্যাখ্যা করেছেন তবে আপনি সম্ভবত উত্পাদনশীল কথোপকথন শুরু করতে পারেন।


-1

আমি আপনার দল-নেতৃত্বের সিদ্ধান্তের সাথে একমত [আপডেট = 2012.05.31] যে এসআরপি সাধারণত ভাল চিন্তাভাবনা করে। তবে আমি @ স্পোইক-এর মন্তব্যে সম্পূর্ণরূপে একমত যে 20 ইন্টারফেস যুক্তি সহ একটি নির্মাণকারীর পক্ষে অনেক দূরে [[/ আপডেট]:

আইওসির সাথে এসআরপি পরিচয় করিয়ে এক "বহু-দায়বদ্ধ-শ্রেণি" থেকে অনেকগুলি এসআরপি -শ্রেণিতে জটিলতা সরিয়ে দেয় এবং এর সুবিধার জন্য আরও জটিল জটিল সূচনা হয়

  • সহজ ইউনিট-টেস্টিবিলিটি / টিডিডি (এক সময় বিচ্ছিন্নভাবে একটি এসআরপি-শ্রেণীর পরীক্ষা করা)
  • কিন্তু ব্যয়ে
    • আরও অনেক জটিল কোড আরম্ভ এবং ইন্টিগ্রেশন এবং
    • আরও শক্তিশালী ডিবাগিং
    • বিভাজন (বিভিন্ন ফাইল / ডিরেক্টরিতে কোড বিতরণ)

আমি আশঙ্কা করছি আপনি এসআরপি ত্যাগ ছাড়াই কোডফ্রেগমেন্টেশন হ্রাস করতে পারবেন না।

তবে আপনি কোনও সিন্ট্যাকটিকিক চিনির শ্রেণি প্রয়োগ করে কোনও কাঠামোগত সূচনার জটিলতা আড়াল করে কোডিনিটালাইজেশনের "ব্যথা কমিয়ে" তুলতে পারেন।

   class MySrpClass {
      MySrpClass(Interface1 parm1, Interface2 param2, .... Interface20 param2) {
      }
   } 

   class MySyntaxSugarClass : MySrpClass {
      MySyntaxSugarClass() {
         super(new MyInterface1Implementation(), new MyImpl2(), ....)
      }
   }

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