2013-02-10 6 views
4

Я изучаю программирование, и хотя я чувствую, что у меня хорошие знания в программировании (я пишу PHP, Javascript и т. Д. В течение многих лет) никогда не погружались в мир ООП. Из-за этого я прошу дать общий ответ на ситуацию, в которой я нахожусь. Я знаю, что всегда будут какие-то исключения, но я ищу наиболее правильный подход в этом случае.Используйте общедоступные геттеры/сеттеры для доступа к приватным переменным в одном классе или напрямую к переменным.

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

Но когда я хочу получить доступ к переменным Game внутри класса Game, следует ли использовать общедоступные методы или просто получить доступ к переменным напрямую? Каков наиболее правильный подход к этому?

Я развиваюсь на Java, если это имеет значение. И, пожалуйста, извините мою нехватку ООП-опыта.

+0

Proof-by-Jon-Skeet: http://stackoverflow.com/a/565117/814576 – ecbrodie

+0

Кто-то, кого я знаю, настаивает на использовании геттеров для доступа к приватным переменным из своего класса. Я ненавижу это ... – Alnitak

ответ

1

Две основные причины, используя методы доступа (методы получения и установки), чтобы получить доступ к переменным других классов

  • Способность представить аксессоров в качестве членов интерфейса, и
  • Возможность переопределить Аксессуар в подклассе.

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

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

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

+0

Функция переопределения здесь ключевая, особенно на языке Objective-C, где компилятор будет генерировать методы «по умолчанию» getter/setter, но вы можете переопределить их, если хотите (Java может сделать то же самое) , – Joe

0

Это скорее вопрос личных предпочтений, чем что-либо еще.

Причина, по которой вы используете getters \ seters, в основном скрывает реализацию от вызывающего класса (в вашем случае GameGraphics). Что приятно, когда другие разработчики должны использовать ваш код. И ваши геттеры \ сеттеры получают доступ к членам напрямую, поэтому их вызов, пока они вызывают переменные экземпляра, немного избыточно.

Однако, если ваши getters \ seters делают что-то еще, кроме исключительно изменяющих значения, например, logging \ etc, вам, очевидно, всегда нужно их использовать.

0

Это нормально использовать либо. Пункт getters/setters заключается в обеспечении безопасного доступа к полям для клиентов, которые не знают о внутренних компонентах класса, но сам класс знает о его внутренних компонентах. Если геттеры/сеттеры делают что-то дополнительное, что нужно сделать, даже если они вызваны изнутри класса, позвоните им. В противном случае вы можете просто получить доступ к полям напрямую.

0

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

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

1

Я бы рекомендовал вам всегда использовать методы доступа. Позднее ваша программа будет легче отлаживать.

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

  • Если вы последовательно использовать сеттер для обновления значения. Вы можете просто найти способ настройки этого поля один раз по всему проекту, и все готово. Там может быть no другие места в ваших кодах, где значение будет обновляться. Даже внутри самого класса (помните: нет прямого доступа к полям, кроме аксессуаров).

  • Если вы измените значение как с использованием как метод установки и доступа прямого поля, Вам придется искать Ваш проект дважды. Во-первых, методом setter. А во-вторых, на поле. И обратите внимание, что все результаты, перечисленные в этом 2-м, вероятно, будут смешаны (этот атрибут может быть там в результатах поиска, потому что он либо находится , либо обратился к, либо был обновлен).

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

Смежные вопросы