Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Брать свойство изнутри или через геттер (http://www.flasher.ru/forum/showthread.php?t=215646)

Tails 09.08.2018 12:25

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

Цитата:

Сообщение от СлаваRa (Сообщение 1205844)
Код:

Второе.
обязательно, если вы хотите сломать полиморфизм :)

Я озвучил тот вариант, что подойдёт в большинстве случаев. :)

Wormhole 09.08.2018 13:04

Цитата:

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

В чем проблема создать геттер у тех наследников, у кого он будет преобразовывать значение?

Цитата:

Сообщение от Wolsh (Сообщение 1205846)
Затем что он паблик, то есть свойство здесь read-only.

Сори, затупил. Пишу на Haxe довольно давно, уже привык к вот такому:
Код:

public var a(default, null):Int;
Добавлено через 5 минут
Цитата:

Сообщение от Appleman (Сообщение 1205851)
\Если всю дополнительную логику убирать из геттера, то выходит, что нужно отдельно получать "чистое" значение свойства, а отдельно (другим методом) - его модификаторы и собирать всё уже на уровне класса, запрашивающего данные. Так?

Вот так. Просто создать отдельный публичный метод calculateFinalStrength(). Свойство после этого можно и private сделать, если оно в чистом виде во внешнем коде не фигурирует.

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

Wolsh 09.08.2018 13:56

Цитата:

В чем проблема создать геттер у тех наследников, у кого он будет преобразовывать значение?
Как раз создать-то проблемы нет. Проблема будет, когда вместо долларов во ВНУТРЕННЕМ коде пройдут рубли из-за того, что использовался геттер this.money, выдающий _money, пересчитанный в рубли.

Добавлено через 6 минут
Цитата:

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

Wormhole 09.08.2018 16:03

Цитата:

Сообщение от Wolsh (Сообщение 1205856)
Проблема будет, когда вместо долларов во ВНУТРЕННЕМ коде пройдут рубли из-за того, что использовался геттер this.money, выдающий _money, пересчитанный в рубли.

Я не понял ситуацию, можно подробнее расписать?

Appleman 09.08.2018 17:41

Цитата:

Сообщение от Wolsh (Сообщение 1205852)
Ну, как-бы по-хорошему, свойства должны бы обновляться (пересчитываться) каждый раз при изменении того, от чего они зависят (надел кирасу — защитка пересчиталась, модификатор усталости при силовых атаках пересчитался и т.п.), а не в момент запроса. Тем более когда свойства зависят друг от друга

У нас есть свойство, которое по условиям игры неизменно от начала и до конца, пусть будет тот же интеллект. Но на него влияют статус-эффекты и снаряжение. Если например, шлем даёт +10%, а зелье - ещё +15%, означает ли это, что, надевая шлем, я должен пересчитывать оригинальное значение? И если у нас закончилось действие зелья, а шлем всё ещё на голове, то это же можно свихнуться с обратным пересчётом из процентов. Ведь база расчёта уже "уедет". Или мне придётся иметь одно "эталонное" значение в досье, а другое "оперативное" - в классе, которое я буду постоянно актуализировать?

Цитата:

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

Цитата:

Сообщение от Wormhole (Сообщение 1205854)
Просто создать отдельный публичный метод calculateFinalStrength(). Свойство после этого можно и private сделать, если оно в чистом виде во внешнем коде не фигурирует.

Наверное, зря я на формулировку "геттер" давил. В твоём комментарии как раз и показан паблик внутри класса, который собирает все модификаторы и выдаёт итоговое значение. Согласись, если изменить сигнатуру на public function get finalStrength() : Number, то получится то, о чём я спрашивал :)

caseyryan 09.08.2018 20:36

Цитата:

Наверное, зря я на формулировку "геттер" давил.
Если речь пошла о формулировках, то геттер/сеттер на самом деле называется "свойством" (property). А переменные объявляемые на уровне экземпляра класса называются полями (fields / field variable). Это так, просто к сведению :D

Wolsh 09.08.2018 21:44

Цитата:

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

Appleman 10.08.2018 01:08

caseyryan, буду знать, спасибо за ликбез :) Я верно понял, что свойство подразумевает доступность к нему извне, в отличие от полей?

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

СлаваRa 10.08.2018 04:47

Берем базовый "абстрактный" класс, где геттер возвращает экземпляр объекта дефолтного поведения, который является NullObject, ссылка на который хранится в "холдере", а "сверху" геттер переопределен и возвращает ссылку на экземпляр конкретного объекта поведения. И 99% логики лежит в базовом классе, вот и подумайте теперь, что нужно использовать.

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

и т.д. и т.д.

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

Tails 10.08.2018 13:01

Дети, не ходите в программирование гулять)


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

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