Форум 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)

Appleman 08.08.2018 17:39

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

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

Код AS3:

public class SomeClass
{
private var _someVar: Number = 0;
 
public function get someVar() : Number {return _someVar}
}

У нас внутри этого класса есть метод, который использует в своих расчётах значение свойства _someVar. Как обычно принято обращаться за значением: this.someVar или _someVar?

Tails 08.08.2018 18:09

Второе.

СлаваRa 08.08.2018 18:22

Код:

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

Wormhole 08.08.2018 21:16

В зависимости от того, что именно требуется. Ведь если свойство и псевдо-свойство (симулируемое геттером) ничем не отличаются, зачем геттер?

Wolsh 08.08.2018 22:07

Цитата:

зачем геттер?
Затем что он паблик, то есть свойство здесь read-only.

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

Appleman 08.08.2018 22:55

Цитата:

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

Да, но это не главное. :) Просто сеттер не относится к сути вопроса, поэтому я его не написал.

Цитата:

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

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

Wolsh 09.08.2018 00:21

Ну адекватные программисты конечно не станут пихать в геттер логику, логика и должна работать во "внутренних" единицах измерений; а вот конвертацию в другую валюту и т.п. — запросто. Не путай внутренние дела Класса с тем, что от него ждут. Например, класс для круговых диаграмм может вести все рассчеты в полярной системе координат (угол + длина), но выдавать точки в ортогональной (х, у) — пригодной для отрисовки. Или (похожая история) класс-компонент для выбора цвета в рисовалке все рассчеты "внутри" ведет в системе HSV, потому что это удобно для элементов управления, но на выходе от него ждут цвет в системе RGB, так как флэш работает в ней. И в конце рисования потребуют картинку в JPEG или PNG, хотя во время рисования эти форматы не использовались вообще никак.

caseyryan 09.08.2018 09:00

Цитата:

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

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

Что ты имеешь в виду?

Appleman 09.08.2018 10:13

Цитата:

Сообщение от Wolsh (Сообщение 1205848)
Ну адекватные программисты конечно не станут пихать в геттер логику

Посоветуйте, плиз, более адекватное решение. У меня пока как было. Нужно кому-то значение силы персонажа - обращаемся к экземпляру Character. Там условный "геттер" (на самом деле не геттер в чистом виде, а метод, принимающий ID нужного свойства, за что меня тут все мэтры нещадно критикуют) берёт текущее значение силы из свойств персонажа, проверяет модификаторы в менеджере статус-эффектов, проверяет модификаторы в менеджере экипировки, всё собирает, применяет и выдаёт вовне окончательное значение.

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

Wolsh 09.08.2018 11:15

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


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

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