2017-02-23 52 views
5

जब मैं मेरा एक परियोजना पर काम कर रहा था और नेस्टेड वस्तुओं का एक बहुत का उपयोग करने के लिए किया था, मैं जावा में संरचना के अपने डिजाइन के बहुत अनिश्चित है जब मैं एक उदाहरण चर सेट करना चाहता था बन गया ऊपरी वस्तु से गहराई से घोंसला वाली वस्तु का। ऐसा लगता है कि मुझे जावा में संरचित डिज़ाइन की बुनियादी समझ याद आती है। इसमें कोई अंतर्दृष्टि की सराहना की जाती है।जावा डिजाइन: का दोहराव तरीकों उप वस्तुओं

कल्पना कीजिए मैंने किसी चीज़ जो चर के रूप में नेस्ट उप वस्तुओं होने के एक तार्किक संरचना है की है। उदाहरण के लिए:

Country 
    Capital 
    Palace 
     King 

मैं अब मुख्य उद्देश्य (देश) से एक निजी स्ट्रिंग वैरिएबल राजा में 'nameOfKing' सेट करना चाहते हैं, मैं राजा के सभी उच्च वर्गों में हर विधि को परिभाषित करना होगा। इस तरह तो कुछ:

public class Country { 
    private Capital capital; 

    public void setNameOfKing(String n) { 
     capital.setNameOfKing(n); 
    } 
} 

public class Capital{ 
    private Palace palace; 

    public void setNameOfKing(String n) { 
     palace.setNameOfKing(n); 
    } 
} 

public class Palace{ 
    private King king; 

    public void setNameOfKing(String n) { 
     king.setNameOfKing(n); 
    } 
} 

public class King{ 
    private String nameOfKing; 

    public void setNameOfKing(String n) { 
     this.nameOfKing = n; 
    } 
} 

ताकि मैं country.setNameOfKing(n); कॉल कर सकते हैं। अगर आप बस कुछ ही चर है, लेकिन क्या हुआ अगर कक्षाओं राजा, पैलेस, कैपिटल प्रत्येक कई अन्य चर और तरीकों परिभाषित और उन सभी के लिए है देश से के नाम से जाना है अब इस ठीक है। क्या होगा अगर पैलेस भी तरह (सिर्फ सामान को बनाने अब) अन्य वर्ग ऑब्जेक्ट हैं ThroneRoom, ट्रेजरी, रानी, ​​आदि ... यह उप कक्षाओं में लगभग सभी तरीकों के लिए मतलब यह होगा कि, एक देश वर्ग में मौजूद है, जो कर सकते थे संभावित रूप से मतलब है कि आपको उप-वस्तुओं को जानकारी देने के लिए बस एक बड़ी मात्रा में विधियां बनाना पड़ता है जिसके परिणामस्वरूप बहुत बड़ी देश वर्ग होती है।

अब मुझे लगता है कि आप तकनीकी रूप से कह सकते हैं कि राजा को देश में भी परिभाषित किया जा सकता है, जो पैलेस और राजधानी में अतिरिक्त तरीकों से दूर हो रहा है, लेकिन इसका मतलब यह भी होगा कि देश वर्ग में विधियों को मौजूद होना चाहिए और क्या होगा इस संरचना को समझ में आता है कि तर्क समूह में एक साथ समूहित है, इसके लिए सबसे अच्छा तरीका क्या होगा? मुझे यकीन नहीं है कि एक बेहतर तरीका है, लेकिन मैं महसूस नहीं कर सकता कि मुझे कुछ याद आ रहा है।

+0

तो 'getPalace()। SetFoo()' कोई विकल्प नहीं है? –

+0

तो क्या आप इस तरह देश वर्ग में मेथिड बदलना चाहते हैं? 'capital.getPalace()।setNameOfKing (n); 'यह इस तथ्य को बदल देगा कि आप देश वर्ग – lokipoki

उत्तर

4

यह एक जिम्मेदारी मुद्दा है।

अपने आप से पूछें: "कौन जानते हुए भी जो राजा है के लिए जिम्मेदार है?"। जब आप महल हैं, तो क्या आप राजा के लिए ज़िम्मेदार हैं? बेशक नहीं। राजा आपके महल द्वारा प्रबंधित नहीं है, लेकिन वह कानून द्वारा आपके देश से जुड़ा हुआ है।

क्वेरी palace.setNameOfKing() आपके घर को अपने नवजात शिशु को देने के लिए पूछने के समान है। आपके घर में यह responbility नहीं है, और इसे करने की अनुमति नहीं दी जानी चाहिए।

ऐसा करने का सही तरीका King उदाहरण पुनर्प्राप्त करना है, और इसका नाम सीधे सेट करना है।


अब इस दृष्टिकोण के साथ एक मुद्दा है: आप King उदाहरण खोजने के लिए कई टिककर खेल का उपयोग हो सकता है। लेकिन आप इस कक्षा को अपने वर्गों के कार्यात्मक दृष्टिकोण के साथ हल कर सकते हैं।

palace.getOwner()King implements Owner के साथ एक इंटरफ़ेस Owner वापस कर सकता है।

वही नियम आपके अन्य वर्गों पर लागू किए जा सकते हैं।

+2

में संभावित रूप से बड़ी मात्रा में विधियों के साथ हो सकते हैं हां, यह एक ज़िम्मेदारी मुद्दा है और मैं एक कदम आगे भी जाऊंगा और राजा के नाम को स्थापित करने की अनुमति भी नहीं दूंगा सैद्धांतिक रूप से हर जगह सार्वजनिक सेटर विधि की आपूर्ति करके। –

संबंधित मुद्दे