আমি প্রায়শই এই সমস্যার সমাধান করি: এখানে এমন একটি ওয়েব শপ প্রজেক্ট থাকুক যার একটি পণ্য শ্রেণি রয়েছে। আমি এমন একটি বৈশিষ্ট্য যুক্ত করতে চাই যা ব্যবহারকারীদের একটি পণ্যতে পর্যালোচনা পোস্ট করতে দেয়। সুতরাং আমার কাছে একটি পর্যালোচনা শ্রেণি রয়েছে যা একটি পণ্যের উল্লেখ করে। এখন আমার কাছে এমন একটি পদ্ধতি প্রয়োজন যা পণ্যটিতে সমস্ত পর্যালোচনা তালিকা করে। দুটি সম্ভাবনা রয়েছে:
(ক)
public class Product {
...
public Collection<Review> getReviews() {...}
}
(বি)
public class Review {
...
static public Collection<Review> forProduct( Product product ) {...}
}
কোডটি দেখে, আমি (এ) বেছে নেব: এটি অচল নয় এবং এর জন্য প্যারামিটারের দরকার নেই। তবে, আমি বুঝতে পারি যে (এ) একক দায়িত্বের নীতি (এসআরপি) এবং ওপেন-ক্লোজড নীতি (ওসিপি) লঙ্ঘন করেছে যেখানে (বি) তা করে না:
(এসআরপি) যখন আমি কোনও পণ্যের জন্য পর্যালোচনা সংগ্রহ করার পদ্ধতিটি পরিবর্তন করতে চাই তখন আমাকে পণ্য শ্রেণি পরিবর্তন করতে হবে। তবে পণ্য শ্রেণি পরিবর্তন করার একমাত্র কারণ থাকতে হবে। এবং এটি অবশ্যই পর্যালোচনা নয়। আমি যদি পণ্যের বৈশিষ্ট্যগুলির সাথে কিছু করার থাকে এমন প্রতিটি বৈশিষ্ট্য যদি প্যাক করি তবে তা শীঘ্রই ছড়িয়ে যাবে।
(ওসিপি) এই বৈশিষ্ট্যটি দিয়ে প্রসারিত করতে আমাকে পণ্য শ্রেণি পরিবর্তন করতে হবে। আমি মনে করি এটি নীতিটির 'পরিবর্তনের জন্য বন্ধ' অংশটি লঙ্ঘন করে। পর্যালোচনাগুলি প্রয়োগের জন্য গ্রাহকের অনুরোধ পাওয়ার আগে, আমি পণ্যটিকে সমাপ্ত হিসাবে বিবেচনা করেছি এবং এটি "বন্ধ" করেছি।
আরও গুরুত্বপূর্ণ কী: সলিড নীতি অনুসরণ করে, বা একটি সহজ ইন্টারফেস আছে?
নাকি আমি এখানে পুরোপুরি কিছু ভুল করছি?
ফলাফল
বাহ, আপনার দুর্দান্ত উত্তরগুলির জন্য সমস্ত ধন্যবাদ! সরকারী উত্তর হিসাবে এটি চয়ন করা কঠিন।
আমি উত্তরগুলি থেকে মূল যুক্তিগুলি সংক্ষেপে বলি:
- প্রো (এ): ওসিপি একটি আইন এবং কোড বিষয়গুলির পাঠযোগ্যতা নয়।
- প্রো (এ): সত্তার সম্পর্কটি নাব্যযোগ্য। উভয় শ্রেণিই এই সম্পর্ক সম্পর্কে জানতে পারে।
- প্রো (এ) + (বি): উভয়ই করুন এবং (এ) থেকে (বি) তে প্রতিনিধি দিন যাতে পণ্যটির আবার পরিবর্তন হওয়ার সম্ভাবনা কম থাকে less
- প্রো (সি): অনুসন্ধানকারী পদ্ধতিগুলিকে তৃতীয় শ্রেণিতে (পরিষেবা) রাখুন যেখানে এটি স্থির নয়।
- বিপরীতে (খ): পরীক্ষায় ঠাট্টা বিঘ্ন ঘটায়।
আমার কলেজগুলিতে কাজের অতিরিক্ত কয়েকটি জিনিস অবদান রেখেছিল:
- প্রো (বি): আমাদের ওআরএম কাঠামোটি স্বয়ংক্রিয়ভাবে (বি) এর জন্য কোড তৈরি করতে পারে।
- প্রো (এ): আমাদের ওআরএম কাঠামোর প্রযুক্তিগত কারণে, অনুসন্ধানকারী যেখান থেকে যায় সেখান থেকে কিছু ক্ষেত্রে স্বতন্ত্রভাবে "বদ্ধ" সত্তা পরিবর্তন করা প্রয়োজন। সুতরাং আমি সর্বদা যাইহোক, সলডকে আটকে রাখতে সক্ষম হব না।
- বিপরীতে (সি): থেকে অনেক কলহ ;-)
উপসংহার
আমি আমার বর্তমান প্রকল্পের জন্য প্রতিনিধিদের সাথে (এ) + (বি) উভয়ই ব্যবহার করছি। পরিষেবামুখী পরিবেশে তবে আমি (সি) সাথে যাব।
Assert(5 = Math.Abs(-5));
Abs()
করা সমস্যা নয়, এটি নির্ভর করে এমন কিছু পরীক্ষা করে। মোক ব্যবহারের জন্য নির্ভরশীল কোড-আন্ডার-টেস্ট (সিটি) কে বিচ্ছিন্ন করার জন্য আপনার কাছে কোনও সিউম নেই। এর অর্থ আপনি এটি পারমাণবিক ইউনিট হিসাবে পরীক্ষা করতে পারবেন না এবং আপনার সমস্ত পরীক্ষাগুলি একীকরণের পরীক্ষায় পরিণত হয় যা ইউনিট যুক্তিকে পরীক্ষা করে। একটি পরীক্ষায় ব্যর্থতা সিটি বা Abs()
(বা এর নির্ভরশীল কোড) এ হতে পারে এবং ইউনিট পরীক্ষাগুলির নির্ণয়ের সুবিধাগুলি সরিয়ে দেয়।