Какой-то "Эстет" или "правильные" и способ получить доступ к объекту's свойства внутри метода объекта, который не является геттер/сеттер?
Я знаю, что снаружи объекта, вы должны использовать геттер/сеттер, а изнутри вы бы просто сделать:
Ява:
String property = this.property;
РНР:
$property = $this->property;
или вы сделали бы:
Ява:
String property = this.getProperty();
РНР:
$property = $this->getProperty();
Простите меня, если мой Java-это немного, это'ы уже год, как я программировал на Java...
Редактировать:
Кажется, люди думают, что я говорю о частных или защищенных переменных/свойств только. Когда я узнал ОО меня учили использовать геттеры/сеттеры для каждого отдельного имущества, даже если оно не было публичным (и вообще мне сказали никогда не делать любую переменную/общественная собственность). Так, я, может быть, начав с ложного предположения с самого начала идти. Похоже, что люди, отвечая на этот вопрос, пожалуй, сказать, что вы должны иметь общие свойства и те, что Дон'т нужна геттеры и сеттеры, который идет против того, что меня учили, и о чем я говорил, хотя может это и надо обсуждать, а также. Что'ы, наверное, хорошая тема для другой вопрос, хотя...
Это религиозные войны, но мне кажется, что если вы're через геттер/сеттер, вы должны использовать его внутри, а также - с использованием как приведет к ремонт проблемы на дороге (например, кто-то добавляет код сеттера, который должен работать каждый раз, когда свойство имеет значение, а свойство устанавливается внутри ж/о, сеттер называется).
Лично я чувствую, что это's важно, чтобы оставаться последовательным. Если у вас есть геттеры и сеттеры, используйте их. Единственный раз, когда я получить доступ к полю напрямую, это когда аксессу имеет много накладных расходов. Он может чувствовать себя, как вы'повторно коптить свой код без надобности, но он, безусловно, может спасти много головной боли в будущем. Классический пример:
Позже, вы, возможно, захотите изменить способ полевых работ. Может быть, она должна быть рассчитана на лету или, может быть, вы хотите использовать другой тип для резервного хранилища. Если вы не доступ к свойствам напрямую, изменение как, что может сломать слишком много кода в одном зыбь фооп.
Я'м довольно удивлен тем, как единодушное мнение, что геттеры и сеттеры прекрасно и хорошо. Я предлагаю зажигательные статьи Аллен Голуб " и на<а href="и http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html">геттеры и сеттеры такие злые</а> наша". Согласен, название для эпатажа, но автор делает верные вещи.
По сути, если у вас есть геттеры и сеттеры для каждого частного поля, вы делаете эти поля так хорошо, как общественные. Вы'd быть очень трудно изменить тип собственной сфере без последствий для каждого класса, который вызывает этот добытчик
.
Кроме того, с ОО точки зрения, объекты должны реагировать на сообщения (методов), которые соответствуют их (надеюсь) единая ответственность. Подавляющее большинство геттеров " и " сеттеров
Дон'т иметь смысл для их составные объекты; Пэн.dispenseInkOnto(поверхности) делает больше смысла для меня чем ручку.хеттолог()`.
Геттеры и сеттеры также призываем пользователей класса, чтобы задать объект для данных, выполнять вычисления, а затем установить другое значение в объект, более известный как процедурное программирование. Вы'd быть лучше, чтобы просто сообщить объекту, чтобы делать то, что вы собирались на первое место; также известен как экспертная информация идиома.
Геттеры и сеттеры, однако, лишь необходимое зло на границе слоев -- пользовательский интерфейс, настойчивость и так далее. Ограниченный доступ к классу'ы внутренних органов, таких как c++'друг сайта с Ява's пакет защищенного доступа .Чистый'с внутренним доступом, и в <а href="и http://moffdub.wordpress.com/2008/09/17/friend-classes-in-java-and-c-sharp/">В другом классе узором</а> может помочь вам уменьшить видимость `геттеры и сеттеры, чтобы только те, кто в них нуждается.
Это зависит от того, как используется недвижимость. Например, скажем, у вас есть студенческий объект, который имеет имя. Вы могли бы использовать GET метод, чтобы вытащить имя из базы данных, если он еще'т уже получены. Таким образом, Вы сократить ненужные обращения к базе данных.
Теперь давайте'ы сказать, что у вас частная целочисленный счетчик в объекте, который подсчитывает, сколько раз было названо имя. Вы можете не использовать GET метод внутри объекта, потому что он будет производить недопустимое число.
PHP предлагает множество способов, чтобы справиться с этим, в том числе и магических методовGETи
сеть, но я предпочитаю явные геттеры и сеттеры. Здесь's почему:
я просто идти за борт здесь?
Возможно ;)
Другой подход мог бы использовать частный/защищенный метод для их получения (кэширование/БД/и т. д.), а также общественных обертка для него, что увеличивает число:
РНР:
public function getName() {
$this->incrementNameCalled();
return $this->_getName();
}
protected function _getName() {
return $this->name;
}
а затем изнутри самого объекта:
РНР:
$name = $this->_getName();
Таким образом, вы все еще можете использовать, что первый аргумент для чего-то еще (например, отправив флаг, является ли или не использовать кэшированные данные здесь возможно).
Я должен быть то недопонимаете, почему бы вам использовать геттер внутри объекта доступ к свойству этого объекта?
Принимая это до конца геттер должен вызывать геттер, которая должна вызвать геттер.
Поэтому я'd не сказать, внутри объекта метод доступа к свойству напрямую, особенно видя, как вызов другого метода в том, что объект (который как раз непосредственно к комплексу все равно потом вернуть) - это просто бессмысленно, расточительно упражнения (или я неправильно понял вопрос).
я бы сказал, что лучше использовать методы доступа даже внутри объекта. Вот несколько пунктов, которые приходят в голову сразу:
это должно быть сделано в интересах поддержания соответствия обращается за пределами объекта.
в некоторых случаях эти методы-аксессоры могли бы сделать больше, чем просто доступ к полю, они могли бы сделать некоторые дополнительные обработки (редких правда). Если это так, заходя на поле непосредственно вы пропускаете, что дополнительная обработка и ваша программа может пойти наперекосяк, если эта обработка всегда должна быть выполнена в течение этих доступах
Если на "Эстет" Вы имеете в виду, что "большинство инкапсуляции" и я обычно заявляю, все мои поля, как частные, а затем использовать это.поле из класса сам, но и все другие классы, включая подклассы, к примеру, используя геттеры.
Пурист ОО путь, чтобы избежать этого и последующих закон Деметры с помощью сказать Дон'т спросить подход.
Вместо того, чтобы получать стоимость объекта'с имущества, которое тесно два класса, использовать объект в качестве параметра, например
doSomethingWithProperty() {
doSomethingWith( this.property ) ;
}
Где собственность была родной тип, например int и использовать метод доступа, имя для домена проблемы не в области программирования.
doSomethingWithProperty( this.daysPerWeek() ) ;
Это позволит вам поддерживать инкапсуляцию и любой пост-условия или зависимого инварианты. Вы также можете использовать метод метода Set для сохранения каких-либо предварительных условий или зависящие от инвариантов, однако Дон'т попасть в ловушку, называя их сеттеры, вернуться к принципу Голливуда для именования при использовании идиомы.
Я могу ошибаться, потому что я'м самоучка, но я никогда не пользовательских свойств в мой Java-классы, они всегда private или protected, так что за код должен получить доступ через геттеры/сеттеры. Это's лучше для обслуживания / модификации целей. И внутри кода класса... если геттер тривиально я использовать свойство напрямую, но я всегда использую сеттер, потому что я мог бы легко добавить код, чтобы огонь события, если я желаю.
я'вэ нашел через сеттеры/геттеры сделал мой код легче читать. Мне тоже нравится контролировать его дает, когда другие классы использовать методы и если я изменить свойство будет хранить.
Частные поля с публичных или защищенных свойств. Доступ к значениям должны пройти через свойства, и скопировать в локальную переменную, если они будут использоваться более чем один раз в способ. Если и только если у вас остальные приложения полностью изменен, качали оттуда, а иначе оптимизированы для получения значений, где, копаясь в их assosciated свойства становится "узким местом" (и это никогда не случится, я гарантирую) если вы даже начнете рассматривать давая ничего иного, кроме свойства коснуться их поддержка переменных напрямую.
.Net разработчики могут использовать автоматические свойства, чтобы осуществить это, так как вы можете'т даже видеть поддержку переменных во время разработки.
Если я выиграл'т изменение свойств Я'будете использовать get_property()
открытый метод, если он'С особых событий, таких как в mysqli объект внутри другого объекта в этом случае я'МР всего общественного имущества, а относятся к нему как $obj-файлы->object_property
.
Внутри объекта он's всегда $это->в собственность на меня.
Это зависит от того. Это's больше вопрос стиля, чем все остальное, и нет жесткого правила.
Ну, кажется, с C# 3.0 свойства' реализация по умолчанию, данное решение принято для вас; вы должны установить свойство использовать (возможно, частный) сеттер собственность.
Я лично использовать только собственный член сзади, когда не делаешь так что бы вызвать объект, чтобы упасть в менее желательное состояние, например, при инициализации или при кэшировании/ленивая загрузка идет речь.
Мне нравится ответ на cmcculloh, но кажется, что наиболее правильным является ответ на Грег Hurlman. Использовать геттер/сеттеры все время, если вы начали использовать их по ходу и/или используются для работы с ними.
Кроме того, я лично считаю, что с помощью геттеров/сеттеров делает код легче читать и отлаживать позже.
Как говорится в некоторых комментариях: иногда ты должен, иногда ты должен'т. Большая часть об частные переменные заключается в том, что вы сможете увидеть все места, которые они используются, когда вы что-то изменить. Если ваш геттер/сеттер делает то, что вам нужно, используйте его. Если это не'т важно, вы решите.
В противном случае может быть сделано, что если использовать геттер/сеттер, а кто-то меняет геттер/сеттер, они должны проанализировать все места, геттер и сеттер используется внутренне, чтобы увидеть, если он напутает что-нибудь.