मैंने कानून-ऑफ-डेमेटर टैग किए गए लगभग सभी प्रश्न पढ़े हैं। इन विशिष्ट सवालों में से किसी एक में मेरे विशिष्ट प्रश्न का उत्तर नहीं दिया गया है, हालांकि यह बहुत समान है। मुख्य रूप से मेरा सवाल यह है कि जब आपके पास संरचना की परतों के साथ एक वस्तु है, लेकिन विभिन्न वस्तुओं से संपत्ति मूल्यों को पुनर्प्राप्त करने की आवश्यकता है, तो आप इसे कैसे प्राप्त करते हैं और एक दूसरे पर एक दृष्टिकोण क्यों लेते हैं?संग्रह के साथ डेमेटर और संरचना का कानून कैसे काम करता है?
System.out.println("Phone: " + customer.getPrimaryAddress().getPhoneNumber());
System.out.println("Hobbies: " + customer.getHobbies().getListOfInterests().toString());
यह भी कानून का उल्लंघन होगा:
public class Customer {
private String name;
private ContactInfo primaryAddress;
private ContactInfo workAddress;
private Interests hobbies;
//Etc...
public getPrimaryAddress() { return primaryAddress; }
public getWorkAddress() { return workAddress; }
public getHobbies() { return hobbies; }
//Etc...
}
private ContactInfo {
private String phoneNumber;
private String emailAddress;
//Etc...
public getPhoneNumber() { return phoneNumber; }
public getEmailAddress() { return emailAddress; }
//Etc...
}
private Interests {
private List listOfInterests;
}
निम्नलिखित दोनों Demeter के कानून का उल्लंघन होगा:
मान लीजिए कि आप इस तरह अन्य वस्तुओं से बना एक सुंदर मानक वस्तु, करते हैं डेमेटर, मुझे लगता है (स्पष्टीकरण?):
ContactInfo customerPrimaryAddress = customer.getPrimaryAddress();
System.out.println("Phone: " + customerPrimaryAddress.getPhoneNumber());
तो संभवतः, आप wou बस फोन
public getPrimaryPhoneNumber() {
return primaryAddress.getPhoneNumber();
}
और फिर: ld फिर एक "getPrimaryPhoneNumber()" ग्राहक के लिए विधि जोड़ने println ("फोन:" + customer.getPrimaryPhoneNumber());
लेकिन समय के साथ ऐसा करना ऐसा लगता है कि यह वास्तव में बहुत सारी समस्याएं प्रदान करेगा और डेमेटर के कानून के इरादे से काम करेगा। यह ग्राहक वर्ग को गेटर्स और सेटर्स के एक बड़े बैग में बनाता है जिसकी अपनी आंतरिक कक्षाओं के बारे में बहुत अधिक ज्ञान है। उदाहरण के लिए, ऐसा लगता है कि ग्राहक ऑब्जेक्ट में एक दिन के विभिन्न पते होंगे (न केवल "प्राथमिक" और "कार्य" पता)। शायद ग्राहक वर्ग में विशिष्ट नामांकित ContactInfo ऑब्जेक्ट्स की बजाय ContactInfo ऑब्जेक्ट्स की एक सूची (या अन्य संग्रह) होगी। आप उस मामले में डेमेटर के कानून का पालन कैसे जारी रखते हैं? यह अमूर्तता के उद्देश्य को हराने के लिए प्रतीत होता है। उदाहरण के लिए, इस तरह के एक मामले में उचित लगता है, जहां एक ग्राहक ContactInfo मदों की एक सूची है:
Customer.getSomeParticularAddress(addressType).getPhoneNumber();
यह लगता है जब आप कुछ एक मोबाइल फोन और एक लैंडलाइन फोन के लोगों के बारे में सोचने की तरह यह भी उन्मादपूर्ण प्राप्त कर सकते हैं, और फिर ContactInfo में फोन नंबरों का संग्रह होना चाहिए।
Customer.getSomeParticularAddress(addressType).getSomePhoneNumber(phoneType).getPhoneNumber();
जो मामले में, न केवल हम वस्तुओं के लिए वस्तुओं के भीतर वस्तुओं के भीतर बात कर रहे हैं, लेकिन हम भी पता है कि वैध addressType की और PHONETYPE के हैं। मैं निश्चित रूप से इसके साथ एक समस्या देख सकता हूं, लेकिन मुझे यकीन नहीं है कि इससे कैसे बचें। विशेष रूप से जब भी जो भी कक्षा इसे कॉल कर रही है, शायद यह जानती है कि वे ग्राहक के "प्राथमिक" पते के लिए "मोबाइल" फोन नंबर खींचना चाहते हैं।
इसे डेमेटर के कानून का अनुपालन करने के लिए कैसे प्रतिक्रिया दी जा सकती है और यह अच्छा क्यों होगा?
मुझे लगता है कि आप भी इसे सचमुच ले जा रहे हैं, यह सिर्फ एक दिशानिर्देश के लिए संभव कोड बदबू आ रही है। आप क्या कर रहे हैं ठीक है। – Esailija
Esailija के साथ सहमत, डेमेटर के कानून को वास्तव में गेटर्स पर आवेदन करने की आवश्यकता नहीं है, वे बहुत तुच्छ हैं। वास्तव में जो भी आप सुझाव देते हैं (ग्राहक .getPrimaryPhoneNumber()) ग्राहक को ContactInfo के आंतरिक पता करने के लिए नेतृत्व करेंगे। संरचना प्रकार ऑब्जेक्ट्स रखने का लाभ यह है कि आप सीमित करते हैं कि किसके लिए ContactInfo के बारे में जानना है, उदाहरण के लिए – Taylor
ठीक है, मैं इस बिंदु को देखता हूं, लेकिन मेरे दिमाग में ContactInfo के अंदर सामान के लिए गैर-गेटर/सेटर परिदृश्य होने जा रहे हैं। मान लें कि आप ग्राहक को किसी लिंक या बटन से ईमेल करना चाहते हैं। आप इसे ग्राहक की तरह लिख सकते हैं .getSomeParticularContactInfo (addressType) .sendEmail() या customer.sendEmail() जो तब (ग्राहक के अंदर) कॉल प्राप्त करता है SomomeicicContactInfo ("प्राथमिक")। SendEmail()। या कुछ प्रबंधक वर्ग जैसे अन्य विकल्प हैं जो कार्रवाई को संभालते हैं। उदाहरण तब गेटर्स या सेटर्स के बारे में नहीं बनता है और मैं इस संदर्भ में डिज़ाइन निर्णय लेने के बारे में उलझन में हूं। –