Чистый состав повреждает понятия ООП?

class Room{
  public:
    void ColorRoom(){};
};

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

1) Комната не может существовать без дома, дом "имеет" комнату. (состав)
2) Другой способ окрасить комнату состоял бы в том, чтобы иметь метод в Доме, который вызовет ColorRoom в методе Помещения, но затем это - больше делегации. (я хочу избежать этого),

Единственным путем я вижу, тот выше, но похож на возврат ссылки на члена парламента, не занимающего официального поста, повреждает ООП. Действительно ли это - хороший дизайн?

6
задан S.Lott 26 January 2010 в 19:15
поделиться

6 ответов

В целом, вы хорошо, с Дом создает переменную элемента m_room - это не требует потребителя, чтобы позвонить что-то после достижения экземпляра. Это следует за шаблон, который элемент используется сразу после создания экземпляра (он не требует специальных действий, таких как установка комнаты или что-то еще).

У меня есть несколько незначительных выборок NIT:

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;
};
4
ответ дан 8 December 2019 в 13:46
поделиться

Дело в том, что вы не явно обнаруживаете свой частный член. Ваш API просто показывает способ получения комнаты, а потребитель не знает, что дом создает эту комнату, возвращая что-то в частном поле или получить номер из веб-сервиса. Это твердое oO.

5
ответ дан 8 December 2019 в 13:46
поделиться

Если вы используете Java 5 или выше, то используйте AtomicBoolean

-121--1235553-

В целом, вы хороши, поскольку 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;
};
-121--4167091-

Операция происходит в комнате, а не в доме. Если вы можете вернуть неизменяемую ссылку на комнату через дом, который затем может быть прооперирован, вы не нарушаете ООП.

2
ответ дан 8 December 2019 в 13:46
поделиться

Выставление частных членов Reduses сплоченность и повышает муфту. Как правило, вам следует предотвратить подобное коду:

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

Этот код менее поддержан и нарушает Закон Деметера .

0
ответ дан 8 December 2019 в 13:46
поделиться

Хотя мне нравится ответ Ника Ларсена, я бы указал еще на одну вещь: комнаты сами по себе не окрашиваются (или не красятся). Это действие обычно совершает Художник, который, очевидно, не является членом комнаты. Теперь художник может раскрасить весь дом, или же он может работать только над одной комнатой.

Я бы предположил, что в этом случае у комнаты есть свойство цвета, а акт изменения этого цвета обрабатывается извне другим объектом.

Эта идея предполагает, что свойство "Цвет" должно быть общественным свойством, и вы должны передать ссылку на комнату, которая будет изменена, объекту Художника.

2
ответ дан 8 December 2019 в 13:46
поделиться

Мне нравится ответ НикаЛарсена, но я хочу добавить одну вещь:

Не позволяйте изменять приватное поле объекта вне этого объекта. Если вы должны изменить объект Room, используйте делегирование. То есть если Room имеет метод SetFloorColor(Color _color);, то в House необходимо вписать вызов на

SetRoomFloorColor(Color _color){ m_room.SetFloorColor( _color ); }
4
ответ дан 8 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: