ООП Новичок: прямой доступ к полям против передачи объектов в качестве параметров - PullRequest
5 голосов
/ 27 мая 2009

Предположим, что Object1 нужна информация от Object2. Я скажу, что это свойство Object2, но информация может быть легко возвращаемым значением из функции Object2. Когда я смотрю на код других, иногда вижу, что у них в Object1 будет метод, напрямую обращающийся к свойству. В других случаях я вижу, как люди передают Object2 как параметр в методе, а затем получают доступ к свойству из переданного Object2.

Эти сценарии кажутся мне практически одинаковыми. Прямой доступ к собственности кажется проще. Как вы, новичок, думаете, что я должен подумать, решая, как Object1 должен получать информацию от Object2? (Когда я хотел бы иметь параметр объекта вместо прямого доступа к свойству?)

Спасибо - Эл С.

Ответы [ 6 ]

9 голосов
/ 27 мая 2009

Одной из проблем при передаче Object2 в Object1 является то, что вы создаете зависимость между Object2 и Object1. Единственный способ, которым Object1 может получить необходимые данные, - это иметь ссылку на Object2.

Так вот, иногда вы этого хотите, но чаще всего нет. Поэтому вам, скорее всего, лучше просто передать нужное значение в качестве параметра методу, а не передавать экземпляр Object2.

3 голосов
/ 27 мая 2009

Если для метода требуется только одно значение свойства из Object2, было бы лучше передать значение этого свойства напрямую. Если для метода требуется доступ ко многим свойствам или другим функциям Object2, целесообразно передать ссылку на Object2.

Существуют исключения - если вам необходимо защитить сигнатуру метода (т. Е. Она является общедоступной), и вы предвидите дополнительное использование Object2 в методе в будущем, передача ссылки на объект может быть целесообразной.

Предыдущие ответы также дают действительные баллы - вы должны учитывать связь Объекта 1 и Объекта 2 при принятии этого решения.

2 голосов
/ 27 мая 2009

Обычно целью является минимизация связи между объектами.

Давайте рассмотрим простой пример, где у меня есть три объекта; AppController, который содержит ссылку на DataController и MainWindowController. Вам необходимо передать DataController.Data в MainWindowController, чтобы вы могли отобразить значения в таблице в главном окне. Вы можете передать DataController в MainWindowController в качестве параметра метода или сделать DataController переменной экземпляра в MainWindowController. Чтобы свести к минимуму связывание, самым чистым способом для AppController является передача данных непосредственно в MainWindowController, поэтому ему не нужно ничего знать о DataController.

1 голос
/ 27 мая 2009

Взгляните на Инкапсуляция в Википедии.

Инкапсуляция [..] защищает целостность компонента, не давая пользователям переводить внутренние данные компонента в недопустимое или несовместимое состояние.

1 голос
/ 27 мая 2009

Да, то, что говорит Рандольфо, правда.

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

Теперь ваш пример - второстепенный, но представьте, что 5, 10, 100 объектов вызывают друг друга через параметры, это неприятная работа.

1 голос
/ 27 мая 2009

Все дело в том, знает ли Object1 об Object2 или нет. В ООП частью хорошего дизайна является сохранение объектов в максимально возможной степени, что позволяет им вести себя должным образом. Таким образом, проблема в основном сводится к следующему: нужно ли Object1 знать о существовании Object2 (то есть нужно ли экземпляру Object2 для существования) или сообщать о существовании экземпляра Object2? Обычно в ООП вы хотите больше склоняться к последнему, чем к первому.

Однако, тем не менее, в ситуации, когда Object1 может работать с данными, поступающими из Object2, наилучшим способом, вероятно, было бы, чтобы Object1 имел метод, который работает с данными type свойства Object2 ; таким образом, вы разделяете Object1 и Object2, так как Object1 не имеет зависимость от Object2 для предоставления заданного свойства заданным способом; вызывающий код может соединить два.

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