2010-01-26 12 views
6
class Room{ 
    public: 
    void ColorRoom(){}; 
}; 

class House{ 
    public: 
    Room* GetRoom(){return &m_room;} 
    private: 
    Room m_room; 
}; 

1) कमरा घर के बिना अस्तित्व में नहीं हो सकता है, एक घर "एक कमरा" है। (संरचना)
2) रंगीन कमरे के लिए एक और तरीका हाउस में एक विधि होगी जो कक्ष विधि में रंगरूम का आह्वान करेगी लेकिन फिर यह प्रतिनिधिमंडल का अधिक होगा। (मैं इससे बचना चाहता हूं)

एकमात्र तरीका जो मैं देखता हूं वह उपर्युक्त है लेकिन निजी सदस्य के संदर्भ में लौटने जैसा लगता है ओओपी तोड़ रहा है। क्या यह एक अच्छा डिजाइन है?क्या शुद्ध संरचना ओओपी अवधारणाओं को तोड़ती है?

उत्तर

4

कुल मिलाकर, आप अच्छे हैं, क्योंकि House सदस्य चर m_room बनाता है - इसे किसी उपभोक्ता को तत्कालता के बाद कुछ कॉल करने की आवश्यकता नहीं होती है। यह इस पैटर्न का पालन करता है कि तत्कालता के तुरंत बाद एक आइटम उपयोग योग्य है (इसे विशेष कार्रवाई की आवश्यकता नहीं है जैसे कमरे या जो भी हो)।

मैं कुछ मामूली निट-उच्छिष्ट है:

class Room 
{ 
public: 
    // virtual method to allow overriding 
    virtual void ColorRoom(){}; 
}; 

class House 
{ 
public: 
    // Returning a non-const pointer in C++ is typically a bad smell. 
    const Room& Room() const { return m_room; } 
    // Allow for assignment and manipulating room, but breaks const-ness 
    Room& Room() { return m_room; } 
    // Facade method for houses with more than one room 
    // You can forward parameters or come up with room-painting schemes, but you should 
    // not require that a House has a Room called Room(). 
    virtual void ColorAllRooms() 
    { 
     m_room.ColorRoom(); 
    } 
private: 
    Room m_room; 
}; 
+0

यह अच्छी तरह से काम करता है, और एक संक्षिप्त स्पष्टीकरण के लिए, मेरा जवाब देखें। –

+0

ध्यान दें कि 'आभासी' * ओवरराइडिंग * को संदर्भित करता है * * ओवरलोडिंग * नहीं। – Dario

+0

क्या आप विरासत के बिना किसी फ़ंक्शन को ओवरराइड कर सकते हैं? दूसरा, यदि उपयोगकर्ता कमरे को संशोधित करना चाहता है तो ऐसा लगता है कि उन्हें सदन की एक विधि का आह्वान करने की आवश्यकता है जो बदले में प्रतिनिधि पद्धति के समान कमरे की विधि का आह्वान करेगा। –

2

आपरेशन कक्ष पर हो रहा है, और नहीं घर। यदि आप घर के माध्यम से कमरे के लिए एक अपरिवर्तनीय संदर्भ वापस कर सकते हैं जिसे तब संचालित किया जा सकता है, तो आप ओओपी तोड़ नहीं रहे हैं।

5

बात यह है कि आप स्पष्ट रूप से अपने निजी सदस्य को उजागर नहीं कर रहे हैं। आपका एपीआई सिर्फ एक कमरा पाने के लिए एक तरीका दिखाता है, और उपभोक्ता को पता नहीं है कि क्या घर उस कमरे का निर्माण कर रहा है, किसी निजी क्षेत्र में आयोजित कुछ लौटा रहा है, या वेब सेवा से कमरा प्राप्त कर रहा है। यह ठोस ओओ है।

+2

यह बिंदु के लिए बहुत अधिक है, लेकिन कृपया ध्यान दें कि यह बाहरी बलों को सत्यापन के बिना आपकी ऑब्जेक्ट स्थिति को संशोधित करने की अनुमति देने के लिए आम तौर पर खराब डिज़ाइन है। –

4

मैं NickLarsen का जवाब चाहते हैं, लेकिन मैं जोड़ने के लिए एक बात है:

मत एक वस्तु की एक निजी क्षेत्र है कि वस्तु के बाहर बदला जा। यदि आपको Room ऑब्जेक्ट उपयोग प्रतिनिधिमंडल को बदलना होगा। कमरे रंग (या रंग) खुद को नहीं है: यह अगर Room एक SetFloorColor(Color _color); विधि है तो आप

SetRoomFloorColor(Color _color){ m_room.SetFloorColor(_color); } 
2

हालांकि मैं NickLarsen का जवाब चाहते हैं, मैं एक दूसरी बात कहना चाहते हैं House एक फोन में डाल दिया जाना चाहिए। यह कार्रवाई आम तौर पर एक पेंटर द्वारा की जाती है, जो स्पष्ट रूप से एक कमरे का सदस्य नहीं है। अब एक चित्रकार पूरे घर को रंग सकता है या चित्रकार सिर्फ एक कमरे पर काम कर सकता है।

मैं इस मामले में सुझाव दूंगा कि कमरे में रंगीन संपत्ति है और उस रंग को बदलने का कार्य किसी अन्य वस्तु द्वारा बाहरी रूप से संभाला जाता है।

यह विचार सुझाव देगा कि रंग संपत्ति सार्वजनिक संपत्ति होनी चाहिए और आप कमरे के संदर्भ को पेंटर ऑब्जेक्ट में बदलने के लिए पास करेंगे।

0

निजी सदस्यों का खुलासा एकजुट हो जाता है और युग्मन बढ़ता है। आम तौर पर, अगर आप इस तरह कोड से रोकने चाहिए:

selection.getRecorder().getLocation().getTimeZone(); 

इस कोड को कम पोषणीय है और Law of Demeter उल्लंघन करती है।