रचना तब होती है जब एक object A
सम्मिलित होता है object B
और इसे object A
बनाने के लिए भी ज़िम्मेदार होता है object B
।
रचना संबंध
हमारे पास एक वर्ग ए है जो कक्षा बी द्वारा उपयोग किया जाएगा।
final class A
{
}
रचना के रूप में कई विकल्प हो सकते हैं।
प्रत्यक्ष आरंभीकरण रचना:
final class B
{
private $a = new A();
}
रचनाकार आरंभीकरण रचना
final class B
{
private $a;
public function __construct()
{
$this->a = new A();
}
}
आलसी आरंभीकरण रचना
final class B
{
private $a = null;
public function useA()
{
if ($this->a === null) {
$this->a = new A();
}
/* Use $this->a */
}
}
आप देखते हैं कि यह वर्गों A
और के बीच एक तंग संबंध बनाता है B
। कक्षा B
बस के बिना मौजूद नहीं हो सकती A
। यह निर्भरता इंजेक्शन सिद्धांत का एक बड़ा उल्लंघन है , जो कहता है:
एक निर्भरता एक वस्तु है जिसका उपयोग किया जा सकता है (एक सेवा)। एक इंजेक्शन एक आश्रित वस्तु (एक ग्राहक) के लिए एक निर्भरता से गुजर रहा है जो इसका उपयोग करेगा। सेवा को ग्राहक की स्थिति का हिस्सा बनाया जाता है। ग्राहक को सेवा का निर्माण करने या सेवा खोजने की अनुमति देने के बजाय ग्राहक को पास करना, पैटर्न की मूलभूत आवश्यकता है।
रचना कभी-कभी समझ में आती है, जैसे कि new DateTime
php या new std::vector<int>
C ++ में कॉल करना । लेकिन अधिक बार नहीं, यह एक चेतावनी है, कि आपके कोड का डिज़ाइन गलत है।
एक मामले में, जहां class A
कैशिंग के लिए उपयोग की जाने वाली एक विशेष वस्तु class B
होगी, हमेशा के कार्यान्वयन का उपयोग करके कैश किया जाएगा class A
, और आपको इसे गतिशील रूप से बदलने के लिए कोई नियंत्रण नहीं होगा, जो खराब है।
इसके अलावा, यदि आप आलसी आरंभीकरण रचना का उपयोग करते हैं, तो इसका मतलब है कि आपके पास एक काम होगा object B
, जिसे useA()
विधि कहा जाता है और निर्माण object A
विफल हो जाएगा, आपका object B
अचानक बेकार है।
दूसरी ओर, एकत्रीकरण, रिश्ते का एक तरीका है, जो DI सिद्धांत का अनुसरण करता है । object B
उपयोग करने के लिए की जरूरत है object A
, तो आप पहले ही बना उदाहरण के पास करना चाहिए object A
करने के लिए object B
, और के सृजन करना चाहिए object A
विफल, कुछ भी पहली जगह में पारित हो जाएगा।
संक्षेप में, एग्रीगेशन निर्भरता इंजेक्शन सिद्धांत के लिए यूएमएल प्रतिनिधित्व है , यह कंस्ट्रक्टर इंजेक्शन, सेटर इंजेक्शन या सार्वजनिक संपत्ति इंजेक्शन है।
ये सभी एग्रीगेशन हैं
सबसे तंग, कंस्ट्रक्टर इंजेक्शन ( object B
बिना मौजूद नहीं हो सकता object A
)।
final class B
{
private $a;
public function __construct(A $a)
{
$this->a = $a;
}
}
लोसर (आप object A
अंदर उपयोग कर सकते हैं या नहीं भी कर सकते हैं object B
, लेकिन यदि आप करते हैं, तो आपको संभवतः इसे पहले सेट करना चाहिए)।
वाया सेटर:
final class B
{
private $a;
public function setA(A $a)
{
$this->a = $a;
}
}
सार्वजनिक संपत्ति:
final class B
{
public $a;
}
समग्र रूप से एकत्रीकरण के उपयोग को सही ठहराने का एक शानदार तरीका नहीं है, यदि आप सभी वर्गों के ठोस कार्यान्वयन का उपयोग कर रहे हैं, लेकिन एक बार जब आप इंटरफेस को इंजेक्ट करना शुरू कर देते हैं या सी ++ सार वर्गों के मामले में, अचानक एकत्रीकरण एकमात्र तरीका होगा अपना अनुबंध पूरा करें।