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

Appleman 12.12.2017 10:54

вопрос о статических константах
 
Друзья!

У меня вопрос скорее общего методического плана, нежели практический. Я уже прилично кода написал, но никак не могу понять логику в вопросе использования статических или "обычных" констант. Смотрите, например, у меня есть класс, который принимает строковый идентификатор и выдаёт фразу. Фраз может быть несколько. Для этого предусмотрено 2 режима выдачи: обычный или случайный. В втором варианте массив предварительно перемешивается.

Так вот, режим определяется константами: MODE_NORMAL и MODE_SHUFFLE, заявленными в классе LanguagePack. Сейчас я объявляю их статическими, и обращаюсь таким образом:

Код AS3:

var phrase:String = LanguagePack.getPhrase("phraseID", LanguagePack.MODE_NORMAL);

Но я бы мог (и кое-где так и делаю) создавать экземпляр класса LanguagePack (скорее всего "одиночку"), объявлять константы "обычными" пабликами и обращаться так:

Код AS3:

var language:LanguagePack = LanguagePack.getInstance();
var phrase:String = language.getPhrase("phraseID", language.MODE_NORMAL);

Вопрос, в чём принципиальная разница между этими вариантами? И каким образом рекомендуется решать вопрос с объявлением констант для "нестатических" классов? Если есть куда почитать, киньте ссылку плиз. У Мука написано, что если переменная или константа относится не к экземпляру, а к классу в целом, то её можно и нужно объявлять как статическую. До тех пор, пока такая константа не требуется за пределами класса, проблем не возникает - можно спокойно объявлять её как private static и не париться. Но чуть только она начинает использоваться вовне, сразу возникает вопрос.

ZergMaster 12.12.2017 11:32

Я б вообще тут сделал класс LanguageModes, в который положил бы
Код AS1/AS2:

public static const NORMAL:String = 'normal';
public static const NE_NORMAL:String = 'neNormal';

так как же как и класс PhrasesIDs c переменными
Код AS3:

public static const ID_1:String = 'id1';

если они стринги конечно

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

в общем, такой вид
Код AS3:

var phrase:String = LanguagePack.gi().getPhrase(PhrasesIDs.ID_1, LanguageModes.MODE_NORMAL);

мне бы понравился куда больше.

Godwarlock 12.12.2017 13:00

Кстати. Можно как то обратиться к свойству xml, через string? Ну например есть такая строчка
<txt_name>Ваня</txt_name>
Соответственно, получение этого свойства выглядит примерно так
Код AS3:

var xml:XML = lang.base;
trace(xml.txt_name);

Как вывести свойство txt_name, по string? Ну типо чтобы был метод
Код AS1/AS2:

var str:String = getLang("txt_name");
 
public function getLang(name:String):String
{
 
 return xml.name;//Правда это неправильно. Как будет правильно?
 
}


ZergMaster 12.12.2017 13:15

Godwarlock
а что,
Код AS3:

xml.attribute(name)

не работает?

caseyryan 12.12.2017 13:16

Цитата:

Кстати. Можно как то обратиться к свойству xml, через string?
В as3 обращение к динамическим свойствам выглядит так, правда хз работает ли это для XML. Не пригождалось ни разу.
Код AS3:

return xml[name];

Цитата:

Вопрос, в чём принципиальная разница между этими вариантами?
Не понимаю смысла этой темы. Ответ уже содержится в вопросе. Принципиальная разница в том, что к статикам можно обращаться не создавая экземпляр класса.

ZergMaster 12.12.2017 13:27

Цитата:

Сообщение от caseyryan (Сообщение 1203368)
В as3 обращение к динамическим свойствам выглядит так, правда хз работает ли это для XML. Не пригождалось ни разу.
Код AS3:

return xml[name];


работает! Тоже сразу пришло на ум именно это, так как для объектов это используется иногда, но почему-то подумал, что для xml не будет работать.

Appleman 12.12.2017 14:19

Цитата:

Сообщение от ZergMaster (Сообщение 1203364)
Я б вообще тут сделал класс LanguageModes, в который положил бы
Код AS1/AS2:

public static const NORMAL:String = 'normal';
public static const NE_NORMAL:String = 'neNormal';


В чём кайф создания отдельного класса со списком констант, использующихся в соседнем классе? Зачем их разрывать?

Цитата:

Сообщение от caseyryan (Сообщение 1203368)
Не понимаю смысла этой темы. Ответ уже содержится в вопросе. Принципиальная разница в том, что к статикам можно обращаться не создавая экземпляр класса.

Вопрос в чём разница с т.з. использования в практическом программировании. Так-то я и сам понимаю, что статики "живут" в самом классе и недоступны в экземпляре, и наоборот. Но вот в каких случаях какой вариант предпочесть?

Пример, который я привёл в первом сообщении, наверное, не самый удачный, т.к. сам класс "статический", он не приспособлен для создания экземпляров. Но если взять мой любимый класс Character и свойство _gender, на счёт которых уже столько копий было сломано, но какую предпочесть конструкцию. Такую:

Код AS3:

if (hero.gender == Character.GENDER_MALE)

или такую:

Код AS3:

if (hero.gender == hero.GENDER_MALE)

Или между ними совсем нет разницы?

Godwarlock 12.12.2017 14:44

ZergMaster
caseyryan

Спасибо)

Добавлено через 43 секунды
Цитата:

if (hero.gender == Character.GENDER_MALE)
Такая предпочтительней. Потому что hero состоит из - раса, пол, внешность, предпочтения и прочие характеристики, которые независимы от hero, а берутся из character и применяются к hero, ибо по этой модели может строится несколько типов hero с кучей разных свойств.

ZergMaster 12.12.2017 15:31

Цитата:

Сообщение от Appleman (Сообщение 1203373)
В чём кайф создания отдельного класса со списком констант, использующихся в соседнем классе? Зачем их разрывать?

кайф в упорядочивании. Чтобы был файлик-класс, где лежат все варианты mode языка. Понятное дело, что это имеет смысл, когда этих констант >= 10. Просто я придерживаюсь правила, что идеальный класс - это класс, который умещается в один экран. Вот и есть привычка разбивать все по классикам.

Цитата:

Сообщение от Appleman (Сообщение 1203373)
Такую:

Код AS3:

if (hero.gender == Character.GENDER_MALE)

или такую:

Код AS3:

if (hero.gender == hero.GENDER_MALE)

Или между ними совсем нет разницы?

разница смысловая в первую очередь. Во втором случае получается, что ты сравниваешь с полом данного конкретного экземпляра. Но на самом деле тебя интересует константа данного класса, а не его экземпляра. В общем, public static будет правильней.

undefined 12.12.2017 17:11

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

Appleman 12.12.2017 18:02

У меня тогда наверное уже совсем наивный вопрос. А когда вообще уместно использование констант экземпляров и уместно ли? Получается, что если возникает необходимость что-нибудь "отлить в граните" даже для использования экземпляром, то проще и правильнее создать константу на уровне класса как статическую. Или нет?

Wolsh 12.12.2017 18:41

Публичных? Ни разу не встречал, ибо это бессмыслица.
Константа это то, что задается один раз.
Соответственно, она не может быть разной у разных экземпляров, так как объявляется в теле Класса.
Тогда какой смысл хранить ее в экземплярах, если она не может быть индивидуальной "экземпляровской"?

caseyryan 12.12.2017 18:51

Цитата:

Сообщение от Appleman (Сообщение 1203380)
У меня тогда наверное уже совсем наивный вопрос. А когда вообще уместно использование констант экземпляров и уместно ли? Получается, что если возникает необходимость что-нибудь "отлить в граните" даже для использования экземпляром, то проще и правильнее создать константу на уровне класса как статическую. Или нет?

Статические константы одни для всех экземпляров класса. Так как это константа (в английском их правда называют constant variable, и на эту тему я встречал некоторые пояснения, но не суть), значит ее значение не изменится 100%, поэтому нет никакого смысла создавать их на уровне экземпляров и бесполезно забивать ими оперативку многократно дублируя. Конечно по меркам современных, даже не компов, а телефонов, это капля в море, но все же, как по мне - это моветон и бессмыслица.

Ещё есть устверждение, что обращение к константам проиходит быстрее, чем к переменным. Я встречал такое на некоторых форумах, особенно по JS, где есть куча любителей использовать const вместо var или let там где это вообще возможно. Но как по мне, так это довольно сомнительное утверждение, и лично я использую константы всегда только как статики. А если бы в as3 были enum'ы, то использовал бы их

Appleman 12.12.2017 19:01

Wolsh, caseyryan, спасибо. Исчерпывающе.

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

Сообщение от Wolsh (Сообщение 1203383)
Тогда какой смысл хранить ее в экземплярах, если она не может быть индивидуальной "экземпляровской"?

Вот именно эта мысль и стала причиной озвученного изначально вопроса.

Zebestov 13.12.2017 14:32

Цитата:

Сообщение от caseyryan (Сообщение 1203385)
Статические константы одни для всех экземпляров класса. Так как это константа … ее значение не изменится 100%

Да, именно потому что она статическая, потому что вот (см. п. 4)

0l3 23.12.2017 18:32

Кроме того, статики выносят отдельным классом для логического объединения однотипных объектов.
Пример: в классе MouseEvent собраны события CLICK, MOUSE_OVER и тд. Затем этот класс группируется в пакет events с аналогичными классами: KeyboardEvents, TextEvent.. помимо специфичных методов и свойств, у каждого из них общий признак - хранение событийных констант.
Иначе, если хранить константы CLICK, MOUSE_OVER в классе Mouse, что логически приходит на ум, тогда мы смешиваем котлеты и мухи. Так как класс Mouse задуман для манипуляций курсором мыши, его вынесли в пакет ui, события отделяются в свою логическую группу.
Вся эта детализация приходит с возрастанием сложности проекта и построение "правильной" структуры, тоже не простая штука..


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

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