Зачем вообще использовать открытые переменные-члены? - PullRequest
3 голосов
/ 23 февраля 2012

Я не понимаю, почему мы должны даже использовать общедоступные члены.

Почему мы не можем всегда устанавливать их в private и использовать вместо них getter / setters?Возможность использовать функции, в которых я могу делать больше, чем просто обращаться к переменной, кажется всегда лучше, чем просто обращаться к переменной напрямую, а затем выяснить, что вам нужно что-то изменить позже.

Когда целесообразно когда-либо использовать публичные

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Довольно субъективно.

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

Иногда это считается «благоразумным», когда вы просто используете класс в качестве «объекта передачи данных», иногда известного как «объект значения». Сама их природа заключается в том, что они стройные и не содержат поведения и только состояния. Если вы не знакомы с этим шаблоном, он просто группирует объекты / примитивы в контейнер, и это его единственная функция.

За исключением этого, как представляется, считается общепринятой практикой, когда публичные поля не используются по указанным вами причинам. Другая причина - контроль доступа . Иногда потребители должны иметь возможность только прочитать значение, а его можно установить только локально. Использование геттеров / сеттеров позволяет вам делать такие вещи. (Некоторые языки также позволяют вам делать это через постоянные / доступные только для чтения поля, которые можно установить один раз при инициализации)

Кажется, что Фаулер помещает функциональность сериализации в сам DTO, но одна школа мысли не должна существовать в полях объекта DTO / Value. http://martinfowler.com/eaaCatalog/dataTransferObject.html

1 голос
/ 23 февраля 2012

Если вы гарантируете, что ваши классы с открытыми переменными-членами остаются внутренними (то есть невидимыми для другой библиотеки / исполняемого файла), это нормально, потому что все находится под вашим контролем. Особенно, если вы хотите быстро разработать что-то или быстро перенести код C на языки OO, такие как Java, C #, ...

Если классы видны снаружи, лучшая инкапсуляция может быть достигнута получателями / установщиками.

Если вы используете C # в качестве языка программирования, вы можете использовать «свойство». Когда вы изменяете поле на свойство, вам не нужно менять какой-либо ссылочный код (за исключением того, что вы использовали поле с ref / out).

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