ঠিক আছে .. সমস্ত আলোচনার পরেও আমি আমার প্রশ্নটি সামান্য পরিবর্তন করছি যার সাথে আমি কংক্রিটের উদাহরণটি প্রতিস্থাপন করছি যা আমি আচরণ করছি।
আমার দুটি ক্লাস রয়েছে ModelOne
এবং ModelTwo
এই ক্লাসগুলি একই ধরণের কার্যকারিতা সম্পাদন করে তবে একে অপরের সাথে সম্পর্কিত নয়। তবে আমি একটা তৃতীয় ক্লাস আছে CommonFunc
যে কিছু পাবলিক কার্যকারিতা উভয় বাস্তবায়িত হয় রয়েছে ModelOne
এবং ModelTwo
প্রতি হিসেবে উপাদান হয়েছে DRY
। দুটি মডেলের মধ্যে তাত্ক্ষণিক হয়ModelMain
ক্লাসের (যা নিজেই একটি উচ্চ স্তরের ইত্যাদিতে ইনস্ট্যান্ট হয় - তবে আমি এই স্তরে থামছি)।
আমি যে আইওসি পাত্রে ব্যবহার করছি তা হ'ল মাইক্রোসফ্ট ইউনিটি । আমি এতে বিশেষজ্ঞ হওয়ার ভান করি না, তবে এটি সম্পর্কে আমার বোঝাপড়াটি হ'ল আপনি কনটেইনারটির সাথে ইন্টারফেস এবং ক্লাসের একটি বেশিরভাগ রেজিস্ট্রেশন করেন এবং যখন আপনি একটি কংক্রিট শ্রেণি চান তখন আপনি আইওসি ধারককে কোনও নির্দিষ্ট ইন্টারফেসের সাথে মেলে তার জন্য জিজ্ঞাসা করেন। এটি বোঝায় যে ইউনিটি থেকে প্রতিটি বস্তুর জন্য আমি ইনস্ট্যান্ট করতে চাই, একটি ম্যাচিং ইন্টারফেস থাকতে হবে। কারণ আমার প্রতিটি ক্লাস আলাদা (এবং-ওভারল্যাপিং) কার্যকারিতা সম্পাদন করে এর অর্থ ইন্টারফেস এবং শ্রেণি 1 এর মধ্যে 1: 1 অনুপাত রয়েছে । তবে এর অর্থ এই নয় যে আমি লেখার প্রতিটি শ্রেণীর জন্য আমি অনিচ্ছাকৃতভাবে একটি ইন্টারফেস লিখছি।
সুতরাং কোড অনুসারে আমি 2 দিয়ে শেষ করব :
public interface ICommonFunc
{
}
public interface IModelOne
{
ICommonFunc Common { get; }
..
}
public interface IModelTwo
{
ICommonFunc Common { get; }
..
}
public interface IModelMain
{
IModelOne One { get; }
IModelTwo Two { get; }
..
}
public class CommonFunc : ICommonFunc { .. }
public class ModelOne : IModelOne { .. }
public class ModelTwo : IModelTwo { .. }
public class ModelMain : IModelMain { .. }
প্রশ্নটি আমার সমাধানটি কীভাবে সংগঠিত করা যায় তা নিয়ে। আমার কি ক্লাস এবং ইন্টারফেস একসাথে রাখা উচিত? বা আমার ক্লাস এবং ইন্টারফেস একসাথে রাখা উচিত? উদাহরণ:
বিকল্প 1 - শ্রেণি নাম দ্বারা সংগঠিত
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-Main
| |
| |-IModelMain.cs
| |-ModelMain.cs
|
|-One
| |
| |-IModelOne.cs
| |-ModelOne.cs
|
|-Two
|
|-IModelTwo.cs
|-ModelTwo.cs
|
বিকল্প 2 - কার্যকারিতা দ্বারা সংগঠিত (বেশিরভাগ)
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-IModelMain.cs
|-IModelOne.cs
|-IModelTwo.cs
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
বিকল্প 3 - ইন্টারফেস এবং বাস্তবায়ন পৃথকীকরণ
MySolution
|
|-MyProject
|
|-Interfaces
| |
| |-Models
| | |
| |-Common
| | |-ICommonFunc.cs
| |
| |-IModelMain.cs
| |-IModelOne.cs
| |-IModelTwo.cs
|
|-Classes
|
|-Models
| |
|-Common
| |-CommonFunc.cs
|
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
বিকল্প 4 - কার্যকারিতা উদাহরণ আরও গ্রহণ করা
MySolution
|
|-MyProject
| |
|-Models
| |
|-Components
| |
| |-Common
| | |
| | |-CommonFunc.cs
| | |-ICommonFunc.cs
| |
| |-IModelOne.cs
| |-IModelTwo.cs
| |-ModelOne.cs
| |-ModelTwo.cs
|
|-IModelMain.cs
|-ModelMain.cs
|
পথটিতে শ্রেণিকামের কারণে আমি পছন্দ 1 অপছন্দ পছন্দ করি। তবে আমার আইওসি পছন্দ / ব্যবহারের কারণে আমি 1: 1 অনুপাতের দিকে ঝুঁকছি (এবং এটি বিতর্কযোগ্য হতে পারে) ফাইলগুলির মধ্যে সম্পর্ক দেখার ক্ষেত্রে এর সুবিধা রয়েছে।
বিকল্প 2 আমার কাছে আবেদন জানায় তবে এখন আমি ModelMain
সাব এবং মডেলগুলির মধ্যে জলাবদ্ধতা ।
বিকল্প 3 বাস্তবায়ন থেকে ইন্টারফেস সংজ্ঞা পৃথক করতে কাজ করে, তবে এখন আমার কাছে পথের নামগুলিতে এই কৃত্রিম বিরতি রয়েছে।
বিকল্প 4। আমি বিকল্প 2 নিয়েছি এবং প্যারেন্ট মডেল থেকে উপাদানগুলি পৃথক করার জন্য এটি টুইট করেছি।
একে অপরের চেয়ে বেশি পছন্দ করার কোনও যুক্তি আছে কি? বা অন্য কোনও সম্ভাব্য বিন্যাস যা আমি মিস করেছি?
1. ফ্রাঙ্ক একটি মন্তব্য করেছে যে 1: 1 অনুপাত থাকা .h এবং .cpp ফাইলগুলির সি ++ দিন ফিরে আসে। আমি জানি সে কোথা থেকে আসছে। আমার Unক্যের বোঝাপড়া আমাকে এই কোণায় ফেলেছে বলে মনে হয় তবে আপনি কীভাবে এর থেকে বেরিয়ে আসবেন তা সম্পর্কেও আমি নিশ্চিত নই তবে আপনি যদি এই কথারও অনুসরণ করেন Program to an interface
তবে অন্য এক দিনের জন্য আলোচনা চালিয়ে যান।
২. আমি প্রতিটি অবজেক্ট কনস্ট্রাক্টরের বিশদ রেখে দিয়েছি। এটি যেখানে IoC ধারক প্রয়োজন হিসাবে বস্তু ইনজেক্ট করে।
Client1
একটি প্রয়োজন হয় IBase
, এটি সরবরাহ করে একটি Derived1
। যখন Client2
একটি প্রয়োজন হয় IBase
, আইওসি একটি সরবরাহ করে Derived2
।
interface
জন্য এটির কোনও কারণ নেই । একটি interface
সত্যই সমস্ত ভার্চুয়াল সদস্যের সাথে একটি বিমূর্ত শ্রেণি।