Это хорошая практика объектно-ориентированного проектирования для отправки указателя на приватные данные в другой класс? - PullRequest
2 голосов
/ 20 марта 2010

Хорошо известна рекомендация не включать в интерфейс класса метод, который возвращает указатель (или ссылку) на приватные данные класса.

Но что вы думаете о методе класса, который отправляет другому классу указатель на приватные данные первого. Например:

class A  
{  
public:
    void fA(void) {_b.fB(&_var)};  

private:  
    B   _b;   
    int _var;  
};

Я думаю, что это какой-то вид сокрытия данных: частные данные определяют состояние своего класса, так почему один класс должен делегировать изменения своего состояния другому? Что ты думаешь?

Денис

Ответы [ 4 ]

3 голосов
/ 20 марта 2010

Да, это нарушает инкапсуляцию так же, как и ваши переменные как открытые. Только сложнее, так как его сложнее обнаружить.

Так что обычно этого следует избегать. Существуют случаи, когда это может быть необходимо, и если вы можете быть достаточно уверены, что вызываемый не будет делать неприятных действий с открытыми внутренними данными, это может быть приемлемым. Обратите внимание, что в этом случае он создает тесную связь между двумя классами, поэтому они становятся единым компонентом.

1 голос
/ 20 марта 2010

Если другой объект имеет прямую ссылку (указатель) на один из ваших внутренних объектов, они могут изменить его, даже если вы об этом не знаете.

Это означает, что это больше не личное.

Это нарушает инкапсуляцию.

0 голосов
/ 20 марта 2010

Если вы нарушаете инкапсуляцию, инкапсуляция нарушается.

Поскольку вы говорите абстрактно, предоставление другому классу доступа к частным данным означает, что классы связаны и, следовательно, могут не моделировать правильную абстракцию.

0 голосов
/ 20 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...