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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.01.2011, 01:33
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 41  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
2dimarik
Цитата:
Пример приведёте с "переборщить легко" такой, чтобы он был "до абсолютной невменяемости"?
на самом деле влёгкую)
Мне неоднократно встречались такие проекты. Особенно ими грешат бывшие /или по совместительству/ яверы.
Вместо возможного компактного кода - куча стратегий, команд, каких то ассертов и юнит-тестов..
Я не то что против всего этого, просто очень часто чрезмерные абстракции чрезмерны)

из последнего:
Сравните исходники FlowPlayer и osmf
Разница существенная, хотя функционал очень близкий.
Может быть FlowPlayer специально запутывают код ибо продают бинарники за большие деньги, но факт остаётся фактом.
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 25.01.2011 в 01:39.
Старый 25.01.2011, 02:25
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 42  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
У нас - нет. Не поленитесь, поищите пост Блуда. Желание использовать отбивает на раз.
Если вы говорите об этой теме: http://www.flasher.ru/forum/showthread.php?p=831877
то я ее читал. Меня, если честно, не напугало...
for each...in и for .. in тоже намного медленнее обычного for, это же не повод от них отказываться.

Кста, если порыться во флексе, то можно найти несколько мест, где adobe используют анонимные методы. Так же есть и в greensock.

Цитата:
Сообщение от mikhailk Посмотреть сообщение
На мой взгляд, анонимные функции по своей природе противоречат принципу многократного использования кода. В принципе, уже этого достаточно. Выигрыша же никакого очевидного нет.
Инкапсуляция, кстати тоже, противоречит этому принципу Давайте все всегда делать public, protected - уже плохо, а private - вообще ужасно
А у меня довольно часто возникают места которые никогда не будут вызываться, кроме отдельно взятого места...
Более того, код практически любого обработчика события всегда нужен в одном и только в одном месте...
Если уже на то пошло, ситуации, когда обработчик события будучи подписанным, никигода не потребует отписывания возникает куда чаще, чем наоборо... По крайней мере в моей практике...

В качестве иллюстрации приведу пример окна аля MsgBox или Alert, хотелось бы услышать, что в его реализации может оказаться критичным?

Код AS3:
package  
{
	import flash.display.DisplayObjectContainer;
	import assets.gMessageBox;
	import flash.events.Event;
	import flash.events.MouseEvent;
	/**
	 * ...
	 * @author Denis `Jack` Vinogradsky
	 */
	public class MsgBox extends assets.gMessageBox
	{
		private static var _instance:MsgBox;
		private var _onClose:Function;
		///Применение callback вместо события. Событие при такой архитектуре не подходит. 
		///Окно сродни синглтону. Создается по требованию, существует толкьо  одном экземпляре. Никогда не уничтожается.
		public static function show(owner:DisplayObjectContainer, text:String,onClose:Function):void
		{
			if (!_instance)
				new MsgBox();
			_instance.init(owner,text,onClose);
		}
 
		private function init(owner:DisplayObjectContainer,text:String,onClose:Function):void 
		{
			visible = false;
			owner.addChild(_instance);
			_textField.text = text;
			_onClose = onClose;
			visible = true;
		}
 
		public function MsgBox() 
		{
			if (_instance)
				throw new Error("MsgBox должен существовать только  одном экземпляре");
			_instance = this;
			//конечно, тут можно не делать анонимный метод. с другой стороны, из сех недостатков анонимного метода
			//которые могут проявится - класс будет весить на 600 байт больше, если верить тестам...
			//не самое страшное что пожет случится, если учесть сколько может весить графическая часть этого окна...
			//Да, здесь анонимный метод не нужен, но и его наличие ни на что особо не повлияет...
			_closeButton.addEventListener(MouseEvent.CLICK, function(e:Event):void { visible = false; } );
		}
 
		override public function set visible(value:Boolean):void 
		{
			if (super.visible == value)
				return;
			super.visible = value;
			if (!value)
			{
				if(parent)
					parent.removeChild(this);
				if (_onClose != null)
				{
					var f:Function = _onClose;
					_onClose = null;
					f();
				}
			}
		}
 
	}
 
}

Хотя, безусловно, чаще всего анонимные функции нужны при применении замыкания. Во всех остальных случаях их можно легко избежать.
С другой стороны, плодить функции, аля:
Код AS3:
function ok(e:Event):void
{
	result=OK;
	visible=false;
}
function cancel(e:Event):void
{
	result=CANCEL;
	visible=false;
}
function continue(e:Event):void
{
	result=CONTINUE;
	visible=false;
}
Тоже мало красивого...
__________________
Искренне Ваш, Джек.

Старый 25.01.2011, 02:42
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 43  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
ужасный код у вас получился.. даже не считая анонимов.
по кнопке closeButton должен вызываться метод close, можно даже protected или даже public.
а никак не public function set visible
__________________
Отряд Котовскага

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от Котяра Посмотреть сообщение
ужасный код у вас получился.. даже не считая анонимов.
по кнопке closeButton должен вызываться метод close, можно даже protected или даже public.
а никак не public function set visible
А что ужасного? В замечании вы как раз указали на аноним...

А close я не сделал намеренно. Я хочу гарантировать корректное закрытие по смене свойства visible. Максимум, можно сделать приватный close который будет вызвать из сетера, хотя не вижу в этом особого смысла.

Кроме того, "почти" никакого способа добраться до класса извне нет(была бы возможность пометить конструктор как private, пометил бы). Т.е. класс является в принципе закрытым от всех, связность с остальным проектом сокращено до абсолютного минимума.
Соответственно public метод close не нужен. Наследовать данный класс тоже особого смысла нет, если бы в AS3 был атрибут sealed, я бы его указал. Класс уже унаследован от графического виджета, и соответственно реально изменен быть не может.

Желаю конструктивную критику

Добавлено через 16 минут
Если кого то смущает
Код AS3:
new MsgBox();
могу пояснить. В начале я написал:
Код AS3:
_instance=new MsgBox();
Но потом убрал. Потому что добавил в конструктор _instance=this. А делать одну и ту же операцию дважды, смысла особого нет. Если бы была какая то возможность объявить конструктор приватным, это было бы не нужно.
На счет вынесения функции close, да, согласен, для повышения читабельности смысл ее сделать был. Но исключительно ради этого...
Но в любом случае, класс вмещается на 2 экрана, и достаточно хорошо читаем. При этом максимально изолирован от внешней среды, имея единственный публичный интерфейс show.

Добавлено через 22 минуты
Пример, в общем то, академический. Конкретно MsgBox я бы реализовывал более универсально + обязательно добавил функционал lock, т.е. максимально приблизил бы его к модальному окну.
В тоже время похожая архитектура подходит для большинства игровых окон. Чаще всего они нужны в единственном экземпляре. Обычно нет смысла их удалять. При желании можно вынести публичный функционал для закрытия окна, если этом есть необходимость.
Она может хранить в себе модель, или просто получать какие то данные для отображения через функцию show. Чаще всего они не требуют возможность наследования от них, потому как наследуются от визуального клипа, созданного художниками.
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 25.01.2011 в 03:24.
Старый 25.01.2011, 10:10
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 45  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
if (_onClose != null)
{
	var f:Function = _onClose;
	_onClose = null;
	f();
}
вот это называется "сам себя запутал" А вообще, нет никакого преимущества в вашем коде по сравнению с нормально написаным, только незначительные недостатки - слушаетля _closeButton будет тяжело найти (outline panel), и вообще неряшливо оформленный код. Кроме того, этот слушатель будет каждый раз создаваться по-новой, что может привести к непредвиденым последствиям.
__________________
Hell is the possibility of sanity

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Погодите, погодите...

Цитата:
Сообщение от wvxvw Посмотреть сообщение
Код AS3:
if (_onClose != null)
{
	var f:Function = _onClose;
	_onClose = null;
	f();
}
вот это называется "сам себя запутал"
Никто никого не путал... Будь реализаиция close в функции close конструкция была таже... Я постаил условие задачи, окно в одном экземпляре, не удаляется. Соотественно при вызове callback, я его сохранил отдельно и обнулив - вызвал. Это было сделано, что бы MsgBox мог быть запущен по заркытию MsgBox. Не вижу тут ничего "запутанного", "неряшливого"...

Цитата:
Сообщение от wvxvw Посмотреть сообщение
А вообще, нет никакого преимущества в вашем коде по сравнению с нормально написаным, только незначительные недостатки - слушаетля _closeButton будет тяжело найти (outline panel), и вообще неряшливо оформленный код.
Т.е. теперь недостаток анонимной функции - тот факт что ее не видно в панели outline?
Хорошо, принимается.
Кроме этого, что понимается под "неряшливо оформленный код", можно расшифровать?

Цитата:
Сообщение от wvxvw Посмотреть сообщение
Кроме того, этот слушатель будет каждый раз создаваться по-новой, что может привести к непредвиденым последствиям.
А вот эту мысль не понял... Кто создается повторно, и как можно создать тут не предвиденную ситуация...
__________________
Искренне Ваш, Джек.

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Код AS3:
		override public function set visible(value:Boolean):void 
		{
			if (super.visible == value)
				return;
			super.visible = value;
			if (!value)
			{
				if(parent)
					parent.removeChild(this);
				if (_onClose != null)
				{
					var f:Function = _onClose;
					_onClose = null;
					f();
				}
			}
		}
Какое-то умопомрачительное зубодробильное построение на пустом месте.
Кстати, проверка наличия родителя перед ритуальным самоубийством ("папа, убей меня") - потому что мы не знаем, существуем или нет?


На мой взгляд, функционал такого типа (MsgBox) пишется и компактнее и проще.


Последний раз редактировалось mikhailk; 25.01.2011 в 11:45.
Старый 25.01.2011, 11:46
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 48  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от mikhailk Посмотреть сообщение
Какое-то умопомрачительное зубодробильное построение на пустом месте.
Кстати, проверка наличия родителя перед ритуальным самоубийством - потому что мы не знаем, существуем или нет?
Что-то типа того На самом деле тут я как раз перестраховался... В данном классе можно было бы от них избавиться, тут все прозрачно и управляемо... Но для будь у нас буличный close все эти проверки все равно вернулись бы...
__________________
Искренне Ваш, Джек.

Старый 25.01.2011, 12:17
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 49  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Имеем:
Код AS3:
if (_onClose != null)
{
	var f:Function = _onClose;
	_onClose = null;
	f();
}
А теперь то же самое, но проще:
Код AS3:
if( _onClose != null )
    _onClose();
_onClose = null;
Конечно если планируется при onClose снова вызывать алерт и вешать на его закрытие callback, то первый вариант конечно больше подходит.
Но тут подход в реализации изначально неверный. Нужно вынести по крайней мере статичный геттер аля currentInstance и уже с ним колдовать. Тогда внутри самого экземпляра можно вообще убрать зануление _onClose, оставив только:
Код AS3:
if( _onClose != null )
    _onClose();
_onClose сделать пабликом и переименовать в onClose, если не планируется как то ограничивать модификацию. Либо сделать геттер и сеттер onClose.
Тогда при вызове колбака, в нем и зануляем onClose:
Код AS3:
private function _msgBox$onClose():void
{
    MsgBox.currentInstance.onClose = null;
 
    // some actions
}
или можно с проверкой колбака:
Код AS3:
private function _msgBox$onClose():void
{
    if( MsgBox.currentInstance.onClose == arguments.callee )
        MsgBox.currentInstance.onClose = null;
 
    // some actions
}


Последний раз редактировалось i.o.; 25.01.2011 в 12:42.
Старый 25.01.2011, 12:35
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 50  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Если вы говорите об этой теме: http://www.flasher.ru/forum/showthread.php?p=831877
то я ее читал. Меня, если честно, не напугало...
for each...in и for .. in тоже намного медленнее обычного for, это же не повод от них отказываться.
"А, ну тогда всё нормально " (с)

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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