ठीक है .. सभी चर्चा के बाद मैं अपने प्रश्न को थोड़ा बेहतर तरीके से बदल रहा हूं ताकि मैं एक ठोस उदाहरण को प्रतिबिंबित कर सकूं।
मेरे पास दो कक्षाएं हैं ModelOneऔर ModelTwo, ये कक्षाएं समान प्रकार की कार्यक्षमता का प्रदर्शन करती हैं, लेकिन एक दूसरे से असंबंधित हैं। हालाँकि मेरे पास एक तीसरा वर्ग CommonFuncहै जिसमें कुछ सार्वजनिक कार्यक्षमता शामिल है जो कि दोनों में लागू की गई है ModelOneऔर ModelTwoप्रति के रूप में फैली हुई है DRY। दो मॉडलों को ModelMainकक्षा के भीतर त्वरित किया जाता है (जो स्वयं उच्च स्तर पर त्वरित होता है - लेकिन मैं इस स्तर पर रोक रहा हूं)।
IoC कंटेनर जो मैं उपयोग कर रहा हूं वह Microsoft एकता है । मैं इसमें एक विशेषज्ञ होने का दिखावा नहीं करता, लेकिन मेरी यह समझ है कि आप कंटेनर के साथ इंटरफ़ेस और क्लास का टपल रजिस्टर करते हैं और जब आप एक ठोस वर्ग चाहते हैं तो आप IoC कंटेनर से पूछते हैं कि जो वस्तु किसी विशिष्ट इंटरफ़ेस से मेल खाती है। इसका तात्पर्य यह है कि हर उस वस्तु के लिए जिसे मैं यूनिटी से इंस्टेंट करना चाहता हूं, एक मिलान इंटरफ़ेस होना चाहिए। क्योंकि मेरी प्रत्येक कक्षा अलग (और गैर-अतिव्यापी) कार्यक्षमता करती है, इसका अर्थ है कि इंटरफ़ेस और कक्षा 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 पसंद है। लेकिन जैसा कि मैं अपने IoC पसंद / उपयोग (और यह बहस का विषय हो सकता है) की वजह से 1: 1 के अनुपात में चल रहा है, इससे फाइलों के बीच संबंध देखने में फायदे हैं।
विकल्प 2 मुझे अपील कर रहा है, लेकिन अब मैंने ModelMainऔर उप-मॉडल के बीच पानी को पिघला दिया है ।
विकल्प 3 कार्यान्वयन से इंटरफ़ेस परिभाषा को अलग करने के लिए काम करता है, लेकिन अब मेरे पास पथ नामों में ये कृत्रिम ब्रेक हैं।
विकल्प 4. मैंने विकल्प 2 लिया और मूल मॉडल से घटकों को अलग करने के लिए इसे ट्विक किया।
क्या एक को दूसरे पर तरजीह देने का अच्छा कारण है? या कोई अन्य संभावित लेआउट जो मैंने याद किया है?
1. फ्रैंक ने टिप्पणी की कि 1: 1 अनुपात में .h और .cpp फ़ाइलों के C ++ दिनों में वापस आ जाता है। मुझे पता है कि वह कहां से आ रहा है। एकता की मेरी समझ मुझे इस कोने में डालती है, लेकिन मुझे यह भी निश्चित नहीं है कि अगर आप भी Program to an interface एक और दिन के लिए चर्चा करते हैं, तो आप भी इससे बाहर निकल सकते हैं ।
2. मैंने प्रत्येक ऑब्जेक्ट के निर्माता का विवरण छोड़ दिया है। यह वह जगह है जहां IoC कंटेनर आवश्यकतानुसार वस्तुओं को इंजेक्ट करता है।
Client1एक की जरूरत है IBase, यह एक प्रदान करता है Derived1। जब Client2एक की आवश्यकता होती है IBase, तो IoC एक प्रदान करता है Derived2।
interfaceहै। एक interfaceवास्तव में सब आभासी सदस्यों के साथ सिर्फ एक अमूर्त वर्ग है।