मैं एक मूल्य वस्तु के रूप में Address
मॉडल करना चाहता हूं। चूंकि यह अपरिवर्तनीय बनाने के लिए एक अच्छा अभ्यास है, इसलिए मैंने कोई भी सेटटर प्रदान नहीं करना चुना, जो बाद में इसे संशोधित करने की अनुमति दे सकता है।डीडीडी: एक जटिल मूल्य वस्तु को अपरिवर्तनीय कैसे रखा जाए?
एक आम तरीका है कि डेटा को कन्स्ट्रक्टर को पास करना; तथापि, जब मूल्य वस्तु बहुत बड़ी है, कि काफी फूला हुआ हो सकता है:
class Address {
public function __construct(
Point $location,
$houseNumber,
$streetName,
$postcode,
$poBox,
$city,
$region,
$country) {
// ...
}
}
एक और दृष्टिकोण एक साफ निर्माता है, जिसके परिणामस्वरूप एक सरणी के रूप में तर्क प्रदान करने के लिए, हो whould, लेकिन यह हो सकता है गंदगी के कार्यान्वयन कन्स्ट्रक्टर:
class Address {
public function __construct(array $parts) {
if (! isset($parts['location']) || ! $location instanceof Point) {
throw new Exception('The location is required');
}
$this->location = $location;
// ...
if (isset($parts['poBox'])) {
$this->poBox = $parts['poBox'];
}
// ...
}
}
यह मेरे लिए थोड़ा अप्राकृतिक दिखता है।
किसी भी बड़े मूल्य वस्तु को सही ढंग से कार्यान्वित करने के तरीके पर कोई सलाह?
व्यक्तिगत रूप से मुझे लगता है कि यदि आपकी मान वस्तु इतनी बड़ी है कि इससे समस्याएं आती हैं, तो इसे कई मूल्य वस्तुओं में विभाजित करने की आवश्यकता होती है। पता उदाहरण मेरी व्यक्तिगत संवेदनशीलताओं के लिए ठीक लगता है, लेकिन यदि आपको यह बहुत बड़ा लगता है तो शायद यह स्थान + सड़क का पता + शहर (जहां शहर क्षेत्र और देश शामिल हो) हो सकता है। – Domenic
@Domenic: यह भी एक दिलचस्प दृष्टिकोण है! – Benjamin