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

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

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну адекватные программисты конечно не станут пихать в геттер логику, логика и должна работать во "внутренних" единицах измерений; а вот конвертацию в другую валюту и т.п. — запросто. Не путай внутренние дела Класса с тем, что от него ждут. Например, класс для круговых диаграмм может вести все рассчеты в полярной системе координат (угол + длина), но выдавать точки в ортогональной (х, у) — пригодной для отрисовки. Или (похожая история) класс-компонент для выбора цвета в рисовалке все рассчеты "внутри" ведет в системе HSV, потому что это удобно для элементов управления, но на выходе от него ждут цвет в системе RGB, так как флэш работает в ней. И в конце рисования потребуют картинку в JPEG или PNG, хотя во время рисования эти форматы не использовались вообще никак.
__________________
Reality.getBounds(this);

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Ну адекватные программисты конечно не станут пихать в геттер логику
Посоветуйте, плиз, более адекватное решение. У меня пока как было. Нужно кому-то значение силы персонажа - обращаемся к экземпляру Character. Там условный "геттер" (на самом деле не геттер в чистом виде, а метод, принимающий ID нужного свойства, за что меня тут все мэтры нещадно критикуют) берёт текущее значение силы из свойств персонажа, проверяет модификаторы в менеджере статус-эффектов, проверяет модификаторы в менеджере экипировки, всё собирает, применяет и выдаёт вовне окончательное значение.

Если всю дополнительную логику убирать из геттера, то выходит, что нужно отдельно получать "чистое" значение свойства, а отдельно (другим методом) - его модификаторы и собирать всё уже на уровне класса, запрашивающего данные. Так? И если так, то во всех внешних объектах придётся добавлять логику, применяющую модификаторы к значениям.
__________________
Не сломано - не чини!

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну, как-бы по-хорошему, свойства должны бы обновляться (пересчитываться) каждый раз при изменении того, от чего они зависят (надел кирасу — защитка пересчиталась, модификатор усталости при силовых атаках пересчитался и т.п.), а не в момент запроса. Тем более когда свойства зависят друг от друга: получается, запросили силу удара, а она зависит в том числе от эффекта каких-то зелий, но их еще не пересчитывали? Конечно же в идеале все свойства должны быть всегда актуальными на данный момент. Технически это означает, что перерасчеты делаются на уровне "сеттеров", а не в геттерах))) Когда что-то изменяется (сеттером, но не только), то сразу же изменяются все зависимые свойства. Как раз для сеттеров более чем нормально запускать какие-то логические цепочки, ведь в отличие от геттеров, сеттеры меняют значения внутренних свойств, то есть производят действия а не просто констатируют состояния каких-то свойств на данный момент. Геттер ни в коем случае не должен менять внутренние свойства, это противоречит всем здравым смыслам. Он может только представить какое-то свойство в другом формате и ВЫДАТЬ наружу модифицированное значение, не меняя внутреннее.
__________________
Reality.getBounds(this);

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

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

Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Код:
Второе.
обязательно, если вы хотите сломать полиморфизм
Я озвучил тот вариант, что подойдёт в большинстве случаев.
__________________
Дети не должны знать о своих родителях

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
В чем проблема создать геттер у тех наследников, у кого он будет преобразовывать значение?
Как раз создать-то проблемы нет. Проблема будет, когда вместо долларов во ВНУТРЕННЕМ коде пройдут рубли из-за того, что использовался геттер this.money, выдающий _money, пересчитанный в рубли.

Добавлено через 6 минут
Цитата:
Возможно, обновлять все игровые значения будет удобнее в игровых тиках.
В данном случае игра пошаговая а не RT.
__________________
Reality.getBounds(this);

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

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Проблема будет, когда вместо долларов во ВНУТРЕННЕМ коде пройдут рубли из-за того, что использовался геттер this.money, выдающий _money, пересчитанный в рубли.
Я не понял ситуацию, можно подробнее расписать?
__________________
В прошлом - AS3 программист, в данный момент пишу на Haxe

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Наверное, зря я на формулировку "геттер" давил.
Если речь пошла о формулировках, то геттер/сеттер на самом деле называется "свойством" (property). А переменные объявляемые на уровне экземпляра класса называются полями (fields / field variable). Это так, просто к сведению
__________________
Ко мне можно и нужно обращаться на ты)

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Я не понял ситуацию, можно подробнее расписать?
1. Прочитай первое сообщение в теме.
2. Итак, ситуация, когда в расчетах внутри класса используется не приват _someVar, а паблик геттер this.someVar (о чем и спрашивает топикстартер).. То есть, есть еще какие-то методы, оперирующие этим свойством в своих расчетах.. И вот мы создали наследника, который делает все то же самое, но результат (для внешнего кода) возвращает в других единицах измерения. Например, это какие-то денежные операции, и вся система работает в долларах, НО иногда клиенту требуется другая валюта, и мы подставляем другую стратегию вместо дефолтного супер-класса, который все хранит, считает и выдает в долларах: заменяем его наследником, который все считает и хранит в долларах, а результат отдает в пересчете на рубли (например). Не спрашивай сейчас, почему именно такая архитектура в данной задаче, я на ходу выдумываю. Итак, паблик геттер someVar отдает не _someVar, который в долларах, а _someVar * courseModifier. Что произойдет со всеми внутренними расчетами, которые вместо _someVar используют this.someVar? Они насчитают какую-то фигню, ибо вместо долларов будут получать рубли. Потому что блин паблик — он для внешней среды, это интерфейс вашего класса, его работа для других. А для себя существует приват, на что названия довольно недвусмысленно намекают.
__________________
Reality.getBounds(this);

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
caseyryan, буду знать, спасибо за ликбез Я верно понял, что свойство подразумевает доступность к нему извне, в отличие от полей?

Wolsh, как всегда всё прояснил и разложил по полочкам.
__________________
Не сломано - не чини!

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Берем базовый "абстрактный" класс, где геттер возвращает экземпляр объекта дефолтного поведения, который является NullObject, ссылка на который хранится в "холдере", а "сверху" геттер переопределен и возвращает ссылку на экземпляр конкретного объекта поведения. И 99% логики лежит в базовом классе, вот и подумайте теперь, что нужно использовать.

Или есть у вас базовая команда, у которой есть геттер isValid, который по дефолту возвращает _isValid, значение которого false, зачем _isValid не спрашивайте, тут много отговорок(IDE сгенерировал, "ну как же, есть геттер - значит нужен холдер" и т.д.), а каждый наследник переопределяет этот геттер и на основании чего-то выдает значение, а еще и геттеры-lazy, значение которых необходимо рассчивать при каждом обращении

и т.д. и т.д.

@Wolsh, а если все внутренние расчеты будут использовать методы/свойства, которые могут быть переопределены, тогда они все по идее вернут все в рублях и проблем не будет, но вот если будет использован, какой-то переопределенный метод, который может вернуть что-то в рублях, но вот вместо геттера, будет использован его холдер(который почему-то все хранит в долларах) - вот тут-то и будет ошибка. Я таких примеров за свою практику встречал сотни
__________________
местонахождение


Последний раз редактировалось СлаваRa; 10.08.2018 в 05:01.
Создать новую тему Ответ Часовой пояс GMT +4, время: 11:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


 


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


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