Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.08.2018, 17:39
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 1  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
По умолчанию Брать свойство изнутри или через геттер

Ребята, у меня такой вопрос забавный и незначимый, просто любопытно.

Имеем в классе свойство и простой геттер (без каких-либо преобразований) для него:

Код AS3:
public class SomeClass
{
private var _someVar: Number = 0;
 
public function get someVar() : Number {return _someVar}
}
У нас внутри этого класса есть метод, который использует в своих расчётах значение свойства _someVar. Как обычно принято обращаться за значением: this.someVar или _someVar?
__________________
Не сломано - не чини!

Старый 08.08.2018, 18:09
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Второе.
__________________
Дети не должны знать о своих родителях

Старый 08.08.2018, 18:22
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 3  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Код:
Второе.
обязательно, если вы хотите сломать полиморфизм
__________________
местонахождение

Старый 09.08.2018, 09:00
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Код:
Второе.
обязательно, если вы хотите сломать полиморфизм
Что ты имеешь в виду?
__________________
Ко мне можно и нужно обращаться на ты)

Старый 08.08.2018, 21:16
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 5  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
В зависимости от того, что именно требуется. Ведь если свойство и псевдо-свойство (симулируемое геттером) ничем не отличаются, зачем геттер?
__________________
В прошлом - AS3 программист, в данный момент пишу на Haxe

Старый 08.08.2018, 22:07
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
зачем геттер?
Затем что он паблик, то есть свойство здесь read-only.

Разные отклонения могут возникнуть при наследовании, например у наследников геттер станет возвращать преобразованное значение (не в сантиметрах а в дюймах например). Заранее трудно предусмотреть))
__________________
Reality.getBounds(this);

Старый 08.08.2018, 22:55
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 7  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Затем что он паблик, то есть свойство здесь read-only.
Да, но это не главное. Просто сеттер не относится к сути вопроса, поэтому я его не написал.

Цитата:
Заранее трудно предусмотреть))
Я по ходу путаться начал. Например, есть геттер какого-нибудь свойства, которое не просто возвращает значение, но тут же применяет к нему какие-то модификаторы (типа штрафов/бонусов от экипировки). Удобно для использования извне. Но если для внутренних расчётов требуется "чистое" свойство, то нужно держать это в голове и обращаться к "внутренней" переменной. Со временем, все эти нюансы из головы вымываются и начинается полная каша.

Прихожу к выводу, что не надо ничего пихать в геттер кроме непосредственно значения, за которым обращаются.
__________________
Не сломано - не чини!

Старый 09.08.2018, 13:04
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 8  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Разные отклонения могут возникнуть при наследовании, например у наследников геттер станет возвращать преобразованное значение (не в сантиметрах а в дюймах например). Заранее трудно предусмотреть))
В чем проблема создать геттер у тех наследников, у кого он будет преобразовывать значение?

Цитата:
Сообщение от Wolsh Посмотреть сообщение
Затем что он паблик, то есть свойство здесь read-only.
Сори, затупил. Пишу на Haxe довольно давно, уже привык к вот такому:
Код:
public var a(default, null):Int;
Добавлено через 5 минут
Цитата:
Сообщение от Appleman Посмотреть сообщение
\Если всю дополнительную логику убирать из геттера, то выходит, что нужно отдельно получать "чистое" значение свойства, а отдельно (другим методом) - его модификаторы и собирать всё уже на уровне класса, запрашивающего данные. Так?
Вот так. Просто создать отдельный публичный метод calculateFinalStrength(). Свойство после этого можно и private сделать, если оно в чистом виде во внешнем коде не фигурирует.

На мой взгляд, в большинстве случаев геттер должен выполнять незначительные преобразования, связанные со спецификой кода
__________________
В прошлом - AS3 программист, в данный момент пишу на Haxe


Последний раз редактировалось Wormhole; 09.08.2018 в 13:16.
Старый 09.08.2018, 17:41
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 9  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Ну, как-бы по-хорошему, свойства должны бы обновляться (пересчитываться) каждый раз при изменении того, от чего они зависят (надел кирасу — защитка пересчиталась, модификатор усталости при силовых атаках пересчитался и т.п.), а не в момент запроса. Тем более когда свойства зависят друг от друга
У нас есть свойство, которое по условиям игры неизменно от начала и до конца, пусть будет тот же интеллект. Но на него влияют статус-эффекты и снаряжение. Если например, шлем даёт +10%, а зелье - ещё +15%, означает ли это, что, надевая шлем, я должен пересчитывать оригинальное значение? И если у нас закончилось действие зелья, а шлем всё ещё на голове, то это же можно свихнуться с обратным пересчётом из процентов. Ведь база расчёта уже "уедет". Или мне придётся иметь одно "эталонное" значение в досье, а другое "оперативное" - в классе, которое я буду постоянно актуализировать?

Цитата:
Геттер ни в коем случае не должен менять внутренние свойства, это противоречит всем здравым смыслам. Он может только представить какое-то свойство в другом формате и ВЫДАТЬ наружу модифицированное значение, не меняя внутреннее.
Строго говоря, геттер у меня и не меняет ничего, только собирает инфо о фактически имеющихся на момент запроса факторах.

Цитата:
Сообщение от Wormhole Посмотреть сообщение
Просто создать отдельный публичный метод calculateFinalStrength(). Свойство после этого можно и private сделать, если оно в чистом виде во внешнем коде не фигурирует.
Наверное, зря я на формулировку "геттер" давил. В твоём комментарии как раз и показан паблик внутри класса, который собирает все модификаторы и выдаёт итоговое значение. Согласись, если изменить сигнатуру на public function get finalStrength() : Number, то получится то, о чём я спрашивал
__________________
Не сломано - не чини!

Старый 10.08.2018, 17:55
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 10  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Appleman Посмотреть сообщение
У нас есть свойство персонажа, пусть будет тот же интеллект. На него влияют статус-эффекты и снаряжение. Если например, шлем даёт +10%, а зелье - ещё +15%, означает ли это, что, надевая шлем, я должен пересчитывать оригинальное значение? И если у нас закончилось действие зелья, а шлем всё ещё на голове, то это же можно свихнуться с обратным пересчётом из процентов. Ведь база расчёта уже изменится. Или мне придётся иметь одно "эталонное" значение в досье, а другое "оперативное" - в классе, которое я буду постоянно актуализировать?
Простите мне моё самоцитирование, вопрос для меня архиважный. Я капитально начал "тонуть" в свойствах персонажей, их хранении, обновлении и т.п. Придумал решение, гляньте опытным глазом, плиз. На примере всё того же интеллекта (любимое свойство)

Перенёс все поля во внутренний класс Parameters, вместе с сеттерами и геттерами. В Character имеем:
Код AS3:
private var _params: Parameters = new Parameters();
Но поле _intelligence в классе Character остаётся, в нём теперь будет храниться read-only значение интеллекта, но уже со всеми модификаторами. Забрать его можно геттером.

При изменении интеллекта (любым методом класса Character) не избежим вот такой записи, т.к. нет другого способа установки нового значения:
Код AS3:
_params.intelligence += value;
Сеттер в классе Parameters посылает событие об изменении значения (он его и так посылает, чтобы поймать и отразить изменения во Вью), это событие ловит класс Character (опять же он его и сейчас ловит). В приёмнике события ставим:

Код AS3:
_intelligence = _params.intelligence;
// Вызываем методы, проверяющие статусы и экипировку на предмет модификаторов интеллекта
// Их же вызываем при смене статусов или экипировки
Таким образом, больше не парюсь с актуальностью свойств и чётко понимаю, где брать модифицированное, а где - "чистое". Цена решения: фактическое дублирование всех полей и геттеров в и без того распухшем Character.

Что думаете?
__________________
Не сломано - не чини!

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:39.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:39.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.