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

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

1)房间不能没有房子,房子“有一个房间”。 (构图)
2)另一种彩色房间的方法是在House中有一个方法来调用ColorRoom in Room方法,但这更像是委托。 (我想避免这个)

我看到的唯一方法是上面的一个,但看起来像私人会员的返回引用正在打破面向对象。这是一个很好的设计吗?纯组合是否会破坏OOP概念?

回答

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

这很好,对于一个简短的解释,请参阅我的答案。 – 2010-01-26 18:49:29

+0

请注意,'virtual'是指*覆盖*而不是*重载*。 – Dario 2010-01-26 18:58:49

+0

你可以重写一个没有继承的函数吗?其次,如果用户希望修改房间看起来像他们需要调用房屋的方法,反过来会调用房间的方法,类似于委托。 – 2010-01-26 19:02:17

2

的操作发生在室内,而不是房子。如果你可以通过房子返回一个不变的参考房间,那么你就不会破坏OOP。

5

问题是你没有明确暴露你的私人成员。你的API只是展示了一个获得空间的方法,而且消费者不知道House是否正在创建该房间,返回私人领域中的东西,还是从Web服务中获取空间。这是坚实的OO。

+2

这非常重要,但请注意,允许外部力量在未经验证的情况下修改对象状态通常是不好的设计。 – 2010-01-27 14:53:48

4

我喜欢NickLarsen的答案,但我有一点补充:

不要让一个对象的私有字段对象以外的区域被改变。如果您必须更改Room对象使用委派。也就是说,如果RoomSetFloorColor(Color _color);方法,那么你应该投入House调用

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

虽然我很喜欢NickLarsen的答案,我想指出一两件事:房间没有颜色(或涂料)本身。该行为通常由Painter完成,显然,这不是房间的成员。现在一位画家可以为整个房子涂上颜色,或者画家只能在一个房间里工作。

我会建议在这种情况下,房间有一个颜色属性,改变颜色的行为是由另一个对象外部处理。

这个想法暗示着Color属性必须是一个公共属性,并且你可以传递一个对房间的引用来改变为Painter对象。

0

揭露私人成员减少凝聚力并增加耦合。一般来说,你应该防止这样的代码:

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

此代码不易维护,违反Law of Demeter