C# में Composition (कंपोजिशन)
कंपोजिशन एक **स्ट्रॉन्ग "है-ए" (has-a) रिलेशनशिप** है जहां पार्ट (चाइल्ड) का जीवनचक्र होल (पैरेंट) द्वारा नियंत्रित होता है। अगर पैरेंट नष्ट होता है, तो चाइल्ड भी नष्ट हो जाता है। यह एग्रीगेशन (कमजोर संबंध) से अधिक मजबूत है।
उदाहरण: Car और Engine
public class Engine {
public void Start() => Console.WriteLine("Engine started");
public void Stop() => Console.WriteLine("Engine stopped");
}
public class Car {
// Engine का जीवनचक्र Car द्वारा प्रबंधित
private readonly Engine _engine = new Engine(); // इन्लाइन इंस्टेंशिएशन
public void StartCar() {
Console.WriteLine("Car starting...");
_engine.Start();
}
public void StopCar() {
_engine.Stop();
Console.WriteLine("Car stopped");
}
// Car डिस्पोज़ होने पर Engine भी डिस्पोज़ होगा (अगर IDisposable)
}
class Program {
static void Main() {
Car car = new Car();
car.StartCar();
car.StopCar();
// car स्कोप से बाहर जाता है -> _engine भी कलेक्ट हो जाता है
}
}
आउटपुट
Car starting... Engine started Engine stopped Car stopped
Composition vs Aggregation vs Association
| रिलेशनशिप | मजबूती | जीवनचक्र | उदाहरण |
|---|---|---|---|
| Composition | मजबूत (Part-of) | पैरेंट चाइल्ड का मालिक, साथ नष्ट | Car → Engine, House → Room |
| Aggregation | कमजोर (Has-a) | चाइल्ड स्वतंत्र, पैरेंट से पहले/बाद जीवित रह सकता है | Department → Employee, Library → Book |
| Association | सामान्य उपयोग | कोई स्वामित्व नहीं | Teacher → Student, Doctor → Patient |
कंपोजिशन के लाभ
- एनकैप्सुलेशन: आंतरिक विवरण छुपे रहते हैं।
- कम कपलिंग: चाइल्ड क्लास को पैरेंट के बारे में पता नहीं होता।
- पुन: उपयोग: चाइल्ड क्लास अन्य संदर्भों में उपयोग हो सकती है।
- टेस्टेबिलिटी: मॉक/स्टब चाइल्ड इंजेक्ट कर सकते हैं (अगर इंटरफेस के माध्यम से)।
डिज़ाइन पैटर्न में कंपोजिशन
- Decorator Pattern: रनटाइम पर व्यवहार जोड़ने के लिए कंपोजिशन।
- Composite Pattern: ट्री स्ट्रक्चर में कंपोजिशन।
- Strategy Pattern: एल्गोरिदम कंपोजिशन के माध्यम से इंजेक्ट।
कोड में पहचान
// Composition: private readonly, कंस्ट्रक्टर/फील्ड इनिशियलाइज़र में बनाया गया
private readonly Engine _engine = new Engine();
// Aggregation: कंस्ट्रक्टर/प्रॉपर्टी से इंजेक्टेड, बाहरी रूप से प्रबंधित
public Engine Engine { get; set; } // या कंस्ट्रक्टर में पास किया गया