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

Psycho Tiger 08.11.2010 15:48

Цитата:

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

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

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

КорДум 08.11.2010 16:34

Тигер, вот смотри пример. Скажем, текстовая кнопка. Какие у нее важные параметры, которые нужно задавать сразу в конструкторе? Наверняка ты скажешь, что текст только. А все остальное уже делаем через сеттеры. Но человеку нужно в большинстве случаев еще и настройки шрифта. Ага, делаем обязательным параметром и текстФормат. Но для всех трех стейтов нужен свой стиль. Три текстФормата. Итого - 4 параметра. Кнопка должна работать же, не просто так. Пятый параметр - метод, что срабатывает по клику. Пять параметров. Конструктор перегружен?

alatar 08.11.2010 16:53

Цитата:

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

Добавлено через 7 минут
P.S. Я бы вынес в конструктор, только то, что наиболее часто используется. Но все равно найдутся ситуации в которых будет неудобен любой подход. В свое время в компонентах MinimalComps был пустой конструктор, но после того как они стали популярны и достаточное количество пользователей возопило о параметрах в конструкторе, параметры были добавлены. Вам нужен фидбек от пользователей :)

КорДум 08.11.2010 17:02

alatar, смотрите, я как вижу: чем меньше телодвижений, тем лучше.
Код AS3:

addChild(new NewClass(prop1, prop2, prop3, ..., propN));

записать намного проще, займет меньше места, чем
Код AS3:

var nc:NewClass = new NewClass();
nc.prop1 = prop1;
...
nc.propN = propN;

Оба подхода сделают одно и то же. Первый компактнее, он не требует создания локальной переменной.
Мы здесь спорим об удобстве. Мне удобен первый вариант с его возможными вариациями - обджекты, обязательные параметры, обязательные параметры с дефолтными значениями.

iNils 08.11.2010 17:08

Цитата:

В чем проблема задать эти параметры уже после инстанцирования объекта?
А в чем проблема задать их в конструкторе? Я про вообще, а не про пример КорДума, он плох. Аргументы могут быть ведь и не обязательными. Хочешь задавай в конструкторе, хочешь отдельно. Но если речь идет о визуальных объектах, то каждое изменение влияющие на визуалку и требующее полной перерисовки graphics, будет вызывать несколько раз, если не использовать событие Event.RENDER. А многие его используют?

alatar 08.11.2010 17:09

Реализуйте оба (как выше говорил Psycho Tiger). Есть ситуации, когда невозможно задать сразу все параметры (например они зависят от ввода пользователя или от другого компонента), ну или необходимо динамически менять параметры. В чем собственно проблема? Просто в конструкторе все параметры должны быть с дефолтными параметрами.

Psycho Tiger 08.11.2010 17:10

Если удобен - делай первый, конечно. Только мне кажется через 2-3 года он тебе станет неудобен :)

По поводу кнопки - только текст. Передавать текстформат чаще всего ненужно, нужно просто кнопку на которой уже будет отформатированный текст. (формат задаётся как то извне, а не при создании кнопки - 95% кнопок имеют один стиль текста на них). Когда я делаю кнопку - передаю ей только текст. Кнопка наследуется от компонентна кнопки, где ей задаётся этот самый текстформат и графика кнопки. Цвет, размер меняется сеттером, причем меняется не текстформат, а именно просто цвет - мне это куда удобнее, чем каждый раз делать новый текстформат и вбивать туда тучу параметров. Но опять же по ситуации - может, у тебя все кнопки разные.

Цитата:

если не использовать событие Event.RENDER. А многие его используют?
Ну вроде инвалидаторы есть у всех компонентов, даже самописных. А подобные штуки наследуются от компонентов...
Ну, или мне повезло :)

-De- 08.11.2010 17:12

Какая разница, сколько у конструктора кнопки параметров, если не вызывать его напрямую?
У меня два параметра (необходимых) у "дефолтной" функции добавления кнопки - ключ XML кнопки, коллбэк =)
addButton("MenuPlay", clickPlay) - у меня всех корочедлиннее =)

iNils 08.11.2010 17:15

Цитата:

Ну вроде инвалидаторы есть у всех компонентов
А кто сказал, что все используют компоненты?

alatar 08.11.2010 17:17

Цитата:

А в чем проблема задать их в конструкторе?
Я и не говорил, что это проблема. Видимо непонятно выразился. Я имел ввиду, что не считаю ни один из перечисленных параметров важным, для какого-либо выделения его среди остальных.
Цитата:

Но если речь идет о визуальных объектах, то каждое изменение влияющие на визуалку и требующее полной перерисовки graphics, будет вызывать несколько раз, если не использовать событие Event.RENDER. А многие его используют?
Я использую. Только не совсем так как вы описали, больше похоже на флекс, с инвалидацией и отрисовкой в отдельном методе. Я думаю нет смысла обсуждать удобство корявой реализации, которая будет 150000 раз перерисовывать экран, с прогонкой цикла на 150000 итераций.

КорДум 08.11.2010 17:36

Цитата:

Реализуйте оба (как выше говорил Psycho Tiger).
Конечно, будет оба.
Цитата:

Я про вообще, а не про пример КорДума, он плох.
Почему же плох?
Цитата:

Если удобен - делай первый, конечно. Только мне кажется через 2-3 года он тебе станет неудобен
Я делаю сейчас нужные параметры в конструкторе, остальное сеттерами. Это разве плохо?

iNils 08.11.2010 17:53

Цитата:

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

КорДум 08.11.2010 18:38

iNils, вы имеете в виду, что вот так делать не есть хорошо?
Код AS3:

var tf:TextFormat = new TextFormat();
addChild(new MyClass(tf));

Добавлено через 6 минут
А, ну да, сохраняется же ссылка на tf...

iNils 08.11.2010 18:55

Нет. Вы спокойно можете так сделать. Но речь шла о нескольких TextFormat. Для этого лучше создать отдельные класс Style и указать все TextFormat там. А в MyClass передать style.

Что касается ссылки на tf, то можно сделать хитрый ход. Так как TextFormat не имеет метода clone, то при задании tf задать его для текстового поля, а только потом с этого же поля и записать TextFormat в переменную, которая будет хранить его для данного состояния, при условии, что начальное значение _tf равно null.

Psycho Tiger 08.11.2010 19:24

Цитата:

Что касается ссылки на tf, то можно сделать хитрый ход. Так как TextFormat не имеет метода clone, то при задании tf задать его для текстового поля, а только потом с этого же поля и записать TextFormat в переменную, которая будет хранить его для данного состояния, при условии, что начальное значение _tf равно null.
Если честно не понял )
От себя - написать свой clone не сложно - я если надо для себя сделаю прослойку-патч TextFormat, или функцию cloneTextFormat.
Цитата:

Я делаю сейчас нужные параметры в конструкторе, остальное сеттерами. Это разве плохо?
Это как раз как надо.

@iNils: alatar прав, можно долго рассуждать кто что использует, а кто что нет. Опытные разработчики используют компоненты, а если что-то используется без компонента, но ему нужен инвалидатор - он пишется с нуля. Вообще реализация инвалидатора скрыта от того, кто использует этот класс/компонент, а речь идёт сейчас об интерфейсе - как удобней передавать.
Короче, спорить можно долго :)

iNils 08.11.2010 19:44

Цитата:

Если честно не понял )
Накидал пример.
Код AS3:

package {
        /*    IMPORT            *///{ /
        import flash.text.TextFormat;
        import flash.display.Sprite;
        import flash.text.TextField;
        //}
        public class Label extends Sprite {
                /*  - VAR PRIVATE        *///{ /
                private var _fmt:TextFormat = null;
                private var _tf:TextField = new TextField ();
                //}
                /*  * CONSTRUCTOR *      *///{ /
                public function Label (fmt:TextFormat) {
                        _tf.defaultTextFormat = fmt;
                        addChild (_tf);
                        _fmt = _tf.defaultTextFormat;
                }
                //}
        }
}

Обрати внимание на конструктор, передаваемый формат fmt используется для форматирования созданного текстового поля лишь единожды, затем используется везде _fmt, который является клоном fmt созданного самим текстовым полем.

Цитата:

Опытные разработчики используют компоненты
Я не использую, значит я не опытный?

Psycho Tiger 08.11.2010 19:53

Цитата:

Я не использую, значит я не опытный?
Используются когда они нужны, конечно. Когда тебе нужен скроллпейн, например, ты ведь берешь какие-то заготовки (свои, чужие) и кастомизируешь под себя? Вот тебе и компонент.
Ну и обратное не всегда верно. Это как если ты хороший повар и ты любишь делать салаты. Но если ты не любишь делать салаты - это не значит что ты плохой повар ;)

По поводу кода - я правильно понимаю что где-то в недрах TextField`а при установке defaultTextFormat происходит клонирование TextFormat? Спасибо, не знал )

silin 08.11.2010 20:13

>>затем используется везде _fmt, который является клоном fmt созданного самим текстовым полем.

выходит, что _fmt не нужен вовсе:
Код AS3:

public function get textFormat ():TextFormat {
        return _tf.defaultTextFormat;
}
public function set textFormat (value:TextFormat):void {
 
        _tf.defaultTextFormat = value;
        _tf.setTextFormat (value);
}


iNils 08.11.2010 20:16

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

Добавлено через 5 минут
silin, это зависит от задумки. Если ты будешь брать TextFormat несколько раз подряд, то каждый раз будет происходить копирования. Я хотя и не измерял, но думаю, что это будет более трудозатратно, чем хранить уже готовую копию.

Psycho Tiger 08.11.2010 20:41

Цитата:

Не при установке, а когда забираешь. Иначе бы можно было просто менять сам TextFormat, и его изменения должны сразу же отображается, а этого не происходит без переназначения его текстовому полю.
Хм.
Вообще мои рассуждения такие: TextFormat не наследуется от EventDispatcher`а, а значит путей что-то сказать TextFormat`у TextField`у нету. Поэтому изменяя поля TextFormat `а изменения в TextField`е не могут происходить. Поэтому обновление отображения текста в текстовом поле происходит в сеттере defaultTextFormat (ну и в setTextFormat).
Однако твоё утверждение что defaultTextFormat клонируется когда забираешь тоже верно:
Код AS3:

trace(textField.defaultTextFormat === textField.defaultTextFormat); //false

Однако:
Код AS3:

var textFormat:TextFormat = new TextFormat(null, 15, 0x51B5F7);
var textField:TextField = new TextField();
textField.defaultTextFormat = textFormat;
textField.text = "Hello ";
textFormat.color = 0xF751DA;
textField.appendText("world");

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

Код AS3:

var textFormat:TextFormat = new TextFormat(null, 15, 0x51B5F7);
var textField:TextField = new TextField();
textField.defaultTextFormat = textFormat;
textField.text = "Hello ";
//поменяли цвет на другой
var textFormat2:TextFormat = textField.defaultTextFormat;
textFormat2.color = 0x54F364;
textField.defaultTextFormat = textFormat2;
 
textField.appendText("world");

И снова Hello world выводится монотонным. Похоже я ничего не понимаю в текстформатах. Объясните, пожалуйста.

iNils 08.11.2010 20:49

Ты забыл про setTextFormat

Psycho Tiger 08.11.2010 20:56

Нет, не забыл.
defaultTextFormat должен применяться к новым символам, которые вводятся в поле.
С хэлпа:
Цитата:

Определяет формат, применяемый к новому вставленному тексту, такому как тексту, введенному пользователем, или тексту, вставленному с использованием метода replaceSelectedText().
Я правильно понимаю что оно не распространяется на appendText?

P.S. дак на чем решим, происходит клонирование в сеттере?

silin 08.11.2010 21:05

клонирование в геттере, ты же сам написал:
Цитата:

Сообщение от Psycho Tiger (Сообщение 948390)
Код AS3:

trace(textField.defaultTextFormat === textField.defaultTextFormat); //false



iNils 08.11.2010 21:26

А, ну так у тебя же appendText используется.

Psycho Tiger 08.11.2010 21:50

Цитата:

Сообщение от silin (Сообщение 948399)
клонирование в геттере, ты же сам написал:

Похоже ещё и в сеттере.

@iNils: просто странно это... раньше как-то не задумывался, делал defaultTextFormat и присваивал текст - ок было. А тут на тебе - appendText не работает.
Тут провел тестов несколько, разобрался почему. Сеттер text`а проверяет "бесстильные" символы и устанавливает им defaultTextFormat
Код AS3:

var field:TextField=new TextField();
var format:TextFormat=new TextFormat(null,15,0xFF0000);
field.defaultTextFormat=format;
field.text="Hello!";
super.addChild(field);
format.color=0x00FF00;
field.defaultTextFormat=format;
field.appendText(" world...");

Заменив appendText на += мы дёрнем сеттер, из за чего все символы станут зелеными. (стрикт мод офф, конечно же)

Теперь мы можем проверить создаётся клон в сеттере или нет:
Код AS3:

var field:TextField=new TextField();
var format:TextFormat=new TextFormat(null,15,0xFF0000);
field.defaultTextFormat=format;
field.text="Hello!";
super.addChild(field);
format.color=0x00FF00;
field.defaultTextFormat=format; //убрать
field.text+="world";

Если не убирать - текст зеленый. Если убрать - текст красный.

Резюме: клон TextFormat`а создаётся как в сеттере, так и в геттере.


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

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