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

Вернуться   Форум Flasher.ru > Блоги > Vektor

Рейтинг: 1.57. Голосов: 7.

Маленькие секреты профессионалов или как упростить написание кода.

Запись от Vektor размещена 15.01.2012 в 10:21
Обновил(-а) Vektor 15.01.2012 в 14:34

Здесь, я бы хотел рассказать о том, как не плодить лишние классы.

Многие начинающие программисты, начитавшись об ООП, начинают разбивать (код на множество классов), подменяя понятие класс – функция.
Классы нужны только, если для вызова одной или нескольких функции, из этого класса, сами функции вызывают множество функции и переменных, этого класса, тем самым мы облегчаем читаемость нашего кода, но надо задать себе вопрос этот класс универсальный.
Универсальный класс, тот который, не меняя можно вставить в другое приложение.
Классы лучше использовать только в тех случаях, когда надо разбить программу на блоки или код настолько универсален, чтоб его не меняя можно вставить в другое приложение.

Что такое Блок?
В блок могут входить несколько классов, но желательно, чтоб эти классы были универсальны, или улучшали читаемость и поддержку кода в будущем.
Блоки - это независимые классы, например, создается игра.
1) Делаем Prealader, блок независимый от того какая игра загружается.
2) Делаем Экран - Начало Игры, здесь игрок может перейти к просмотру рекордов, зарегистрироваться или выбрать своё имя, для новой игры или для загрузки игры, выбрать в какой режим игры играть, если есть такой выбор (здесь нужно создать сохранения и загрузку игроков, которые уже играли в игру или собираются в неё играть).
3) Рекорды – Он считывает результаты, достигнутые в игре, и отображает их на экране.
4) Сама игра – Здесь тоже, можно и нужно разбивать игру на классы, например класс - инвентарь , это отдельный блок, в котором персонаж может менять экипировку, рыться в рюкзаке и так далее, класс - магазин, класс - монстр, класс - ещё чего ни будь, главное не путать Блок-Класс, Класс-функция, и ещё ООП дело хорошее и нужное, но только если, игра большая, или код будет использоваться в продолжении игры, или в поддержке игры долгое время, типа онлайновых игр.

Разбив приложение на блоки, можно каждый блок программировать отдельно, блок получает какие-то данные и сам делает с этими данными что нужно, в не зависимости, от других блоков, и если нужно отдаёт преобразованные данные другому блоку.



Теперь я бы хотел перейти к заглавию статьи.

Код AS3:
addChild();
Все мы знаем, что это такое, но не все знают, как это может упростить написание кода.
Код AS3:
addChild(mcClip);
mcClip.x=100;
mcClip.y=100;
Вроде всё правильно!

А теперь, создадим 10 MovieClip или Sprite.
Ага! понимаете.

Вот функция, которая упростит нам жизнь.
Код AS3:
private function fAddChild(mcClip:*,x:int=0,y:int=0,bMouseEnabled:Boolean=true):void {
	addChild(mcClip);
	mcClip.x=x;
	mcClip.y=y;
	mcClip.mouseEnabled=bMouseEnabled;
}
mcClip.mouseEnabled = false; // Отключает реакцию на мышь.
 
А вот её вызов.
fAddChild(_mcClip);
fAddChild(_mcClip,100,100);
fAddChild(_mcClip,0,0, false);
//Не правда ли что так лучше выглядит.
Теперь создайте Текстовый документ и назовите, к примеру, Заготовки.as и сохраните, там эти функции и их вызов, и каждый раз, когда они вам понадобятся, вы можете скопировать и вставить в свой код.

Код AS3:
private function fAddChildInSprite(mcClip:*,mcClip1:*,x:int=0,y:int=0,bMouseEnabled:Boolean=true):void {
	mcClip.addChild(mcClip1);
	mcClip1.x=x;
	mcClip1.y=y;
	mcClip1.mouseEnabled=bMouseEnabled;
}
fAddChildInSprite(_mcClip, mcClip1,200,200);
 
private function fAddChildArray(amcAddChild:Array,x:int=0,y:int=0,bMouseEnabled:Boolean=true):void {
	for (var i:uint=0; i<=amcAddChild.length-1; i++) {
		addChild(amcAddChild[i]);
		amcAddChild[i].x=x;
		amcAddChild[i].y=y;
		amcAddChild[i].mouseEnabled=bMouseEnabled;
	}
}
private function fAddChildInSpriteArray (mcClip:*,amcAddChild:Array,x:int=0,y:int=0,bMouseEnabled:Boolean=true):void {
	for (var i:uint=0; i<=amcAddChild.length-1; i++) {
		mcClip.addChild(amcAddChild[i]);
		amcAddChild[i].x=x;
		amcAddChild[i].y=y;
		amcAddChild[i].mouseEnabled=bMouseEnabled;
	}
}
private function fRemoveChildInSpriteArray(mcClip:*,amcRemove:Array):void {
	for (var i:uint=0; i<=amcRemove.length-1; i++) {
		mcClip.removeChild(amcRemove[i]);
	}
}
private function fRemoveChildIArray(amcRemove:*):void {
	for (var i:uint=0; i<=amcRemove.length-1; i++) {
		removeChild(amcRemove[i]);
	}
}
Для тех, кто не понимает, как пользоваться Array – функциями, пускай будет домашним заданием.
Всего комментариев 117

Комментарии

Старый 15.01.2012 14:24 iNils вне форума
iNils
 
Аватар для iNils
Из названия не ясно, о чем пойдет речь.
Старый 15.01.2012 19:44 expl вне форума
expl
Оно, конечно, fAddChild(_mcClip,100,100); выглядит компактнее, но не всегда удается вспомнить, что именно делает fAddChild, а код:
Код AS3:
_clip.x = 100;
_clip.y = 100;
addChild(_clip);
хоть и длиннее, выглядит понятнее.
Хотя, если добавляется больше 10 объектов однотипным образом - сам так делаю.
Еще выручают локальные фабрики, например:
Код AS3:
var tf:TextField;
tf = newText("Label text");
addChild(tf);
tf = newText("Label text 2");
tf.y = 20;
addChild(tf);
вместо многократных повторений блоков:
Код AS3:
tf = new TextField();
tf.selectable = false;
tf.autoSize = TextFieldAutoSize.LEFT;
...
tf.format = new TextFormat("Tahoma");
P.S. О ужас! Наши ряды косит венгерская нотация. Остается только молиться, чтобы это не стало мейнстримом.

P.S.2: Больше всего этот момент удивляет, зачем может понадобиться добавлять кучу объектов в одну точку?
Цитата:
Код AS3:
private function fAddChildArray(amcAddChild:Array,x:int=0,y:int=0,bMouseEnabled:Boolean=true):void {
	for (var i:uint=0; i<=amcAddChild.length-1; i++) {
		addChild(amcAddChild[i]);
		amcAddChild[i].x=x;
		amcAddChild[i].y=y;
		amcAddChild[i].mouseEnabled=bMouseEnabled;
	}
}
Ну, может потребуется раз в пятилетку, зачем тогда позиционировать этот код как удобное решение на каждый день.

P.S.3. Вообще дробление на мелкие функции - это один из распространенных и полезныx типов рефакторинга, только добавление ребенка через вызов функции - перегиб палки.
Обновил(-а) expl 15.01.2012 в 19:56
Старый 15.01.2012 20:03 Vektor вне форума
Vektor
 
Аватар для Vektor
Точно, здесь мой недосмотр, вот как должно быть.
Код AS3:
private function fAddChildArray(amcAddChild:Array,amcAddChildCoord:Array,bMouseEnabled:Boolean=true):void {
	for (var i:uint=0; i<=amcAddChild.length-1; i++) {
		addChild(amcAddChild[i]);
		amcAddChild[i].x=amcAddChildCoord[i].x;
		amcAddChild[i].y=amcAddChildCoord[i].y;;
		amcAddChild[i].mouseEnabled=bMouseEnabled;
	}
}
private function fAddChildInSpriteArray(mcClip:*,amcAddChild:Array,amcAddChildCoord:Array,bMouseEnabled:Boolean=true):void {
	for (var i:uint=0; i<=amcAddChild.length-1; i++) {
		mcClip.addChild(amcAddChild[i]);
		amcAddChild[i].x=amcAddChildCoord[i].x;
		amcAddChild[i].y=amcAddChildCoord[i].y;;
		amcAddChild[i].mouseEnabled=bMouseEnabled;
	}
}
Старый 15.01.2012 20:05 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
я, например, не понимаю супер удобности fAddChild,...

тут вообще все как-то странно, например ситуация
Код AS3:
 
//код автора
private function fAddChildInSprite(mcClip:*,mcClip1:*,x:int=0,y:int=0,bMouseEnabled:Boolean=true):void {
	mcClip.addChild(mcClip1);
	mcClip1.x=x;
	mcClip1.y=y;
	mcClip1.mouseEnabled=bMouseEnabled;
}
 
//использую, скажем так
const b:Bitmap = new Bitmap()
fAddChildInSprite(anyConatainer, b)
Че будет? у битмапы нету mouseEnabled.
И почему нет типизации? Очевидно же, что mcClip это DOC, а mcClip1 это какой-то DO.

А, например, метод fAddChildArray, может создать проблем, если какого [i] - нет, ну нет его и все, да и даже если все они есть, то на выходе все объекты встанут в один x и y, зачем это надо? Написал раньше, чем автор переопубликовал статью.

Метод fAddChildInSpriteArray, делает тоже самое что и fAddChildArray, за исключением того что использует какой-то mcClip, а fAddChildArray суперкласс, зачем тогда два метода разных, когда достаточно fAddChildInSpriteArray(super, ...)?

метод fRemoveChildIArray выполняет removeChild(amcRemove[i]);, а если суперкласс не парент для amcRemove[i], или amcRemove[i] - null.

"Мы не ищем легких путей"
Обновил(-а) СлаваRa 15.01.2012 в 20:10
Старый 15.01.2012 20:10 expl вне форума
expl
Кстати да,
Цитата:
Код AS3:
private function fAddChildInSpriteArray(mcClip:*,amcAddChild:Array,amcAddChildCoord:Array,bMouseEnabled:Boolean=true):void {
	for (var i:uint=0; i<=amcAddChild.length-1; i++) {
		mcClip.addChild(amcAddChild[i]);
		amcAddChild[i].x=amcAddChildCoord[i].x;
		amcAddChild[i].y=amcAddChildCoord[i].y;;
		amcAddChild[i].mouseEnabled=bMouseEnabled;
	}
}
Змена * на DisplayObjectContainer никак не ограничивает применение метода - если вы _не_ DisplayObject подсуните - метод все равно упадет, а так хотя-бы подсунуть не сможете.
Старый 15.01.2012 20:10 Vektor вне форума
Vektor
 
Аватар для Vektor
Кстати, а чем плоха венгерская нотация?
Старый 15.01.2012 20:13 expl вне форума
expl
http://ru.wikipedia.org/wiki/%D0%92%...86%D0%B8%D1%8F
Почти все плюсы исчезают для языка со статической типизацией.
А недостатков - вагон.
Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста»

Как-бы вещи очевидные, как и очевидно то, что адептов этой нотации так же просто переубедить, как обратить мармона в ислам (или в атеисты). Плюсы тоже ведь есть.
Обновил(-а) expl 15.01.2012 в 20:15
Старый 15.01.2012 20:18 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
По сути, если сортировка по x, y будет в своем методе, а отключение mouseEnable убрать, чтобы, например, ошибки не было, или потому что проще тогда у контейнера mouseChildren выставить в false, то ваш метод становится избыточным, потому что его функционал будет подразумевать лишь вызов addChild, да и к тому же будет работать с массивом, который где-то должен создаться и заполнится.
Старый 15.01.2012 20:37 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Почти все плюсы исчезают для языка со статической типизацией.
А недостатков - вагон.
Выдумки тех, кому больше нечем заняться. Особенно про недостатки.
Типизация не отменяет потребности набирать имя переменной, и венгерская нотация помогает на первых шагах отбросить лишние в автокомплите. Зрительно помогают разделять перемененные. А когда переменные еще и связаны... Например поля формы, которые имеют лейбл, поле ввода и кнопку: lblSave, inputSave, btnSave.
Старый 15.01.2012 20:46 Vektor вне форума
Vektor
 
Аватар для Vektor
Эти функции я создавал в основном для Sprite и MovieClip.

Цитата:
и к тому же будет работать с массивом, который где-то должен создаться и заполнится.
Например, при создании игрового уровня вам нужно создать много игровых объектов, то переведя координаты и (MovieClip) в массив, и вызвав функцию fAddChildArray() или fAddChildInSpriteArray(), можно собрать уровень.
Обновил(-а) Vektor 15.01.2012 в 20:53
Старый 15.01.2012 20:57 fish_r вне форума
fish_r
 
Аватар для fish_r
Цитата:
Что такое Блок?
В блок могут входить несколько классов, но желательно, чтоб эти классы были универсальны, или улучшали читаемость и поддержку кода в будущем.
Пруф можно на определение "блок"?
Старый 15.01.2012 21:04 in4core вне форума
in4core
 
Аватар для in4core
Вообще то это называется утилитные функции, а в вашем случае если еще return сделать вообще фабрика будет. Ничего нового здесь нет. Это старинные постулаты, и средний программист на душу населения таких методов в свои проектах пишет постоянно.

Vector а вы например знали , что можно так еще ?
Код AS3:
public class SuperPuperStaticShmatic {
 
    private static var _clip:Sprite = new Sprite();
    _clip.x = 100;
    _clip.y = 200;
    private static var _mc:MovieClip = new MovieClip();
    _mc.addChild(_clip);
 
    public function SuperPuperStaticShmatic {  trace(' все отдефайнено уже до конструктора !!! ' ) }
}
Старый 15.01.2012 21:08 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Это все извращение.
Запросить объект откуда-то (будь то фабрика, директор, пул и т.д.) и потом с ним работать.
Старый 15.01.2012 21:17 Vektor вне форума
Vektor
 
Аватар для Vektor
Фактически Блок это законченный Класс, который выполняет свою функцию в приложении, но это и не функция которую некоторые начинающие программисты пытаются, выносить в отдельный Класс, только потому, что она вроде бы универсальна.
Старый 15.01.2012 21:59 Tails вне форума
Tails
 
Аватар для Tails
Не пойму, кому может понадобиться помещать функцию в класс, веть что-бы её потом использовать, придется создать объект этого класса, затем использовать метод, затем удалить. Так серьёзно кто-то делает?
Старый 15.01.2012 22:19 Vektor вне форума
Vektor
 
Аватар для Vektor
Пробуют, на вкус ООП, все с чего-то начинали. Сам вначале пробовал, разбивал код на несколько классов, а кода всего 400строчек, но быстро опомнился.
Старый 15.01.2012 22:32 samana вне форума
samana
 
Аватар для samana
Цитата:
Сообщение от Tails
Не пойму, кому может понадобиться помещать функцию в класс, веть что-бы её потом использовать, придется создать объект этого класса, затем использовать метод, затем удалить. Так серьёзно кто-то делает?
Возможно имелись ввиду глобальные функции
Старый 15.01.2012 22:33 CEBEP вне форума
CEBEP
 
Аватар для CEBEP
Vektor, я бы вам посоветовал ознакомиться вот с этой книгой http://www.amazon.com/AdvancED-Actio.../dp/1430236140 ,а потом уже выдумывать "вилисапеды".
Обновил(-а) CEBEP 15.01.2012 в 22:37
Старый 15.01.2012 22:44 Vektor вне форума
Vektor
 
Аватар для Vektor
Увы, в Английском я не так силен, как переведут, обязательно прочитаю.

Цитата:
а потом уже выдумывать "вилисапеды"
Всегда кто-то выдумывает велосипед, другой вопрос становится он от этого хуже или лучше.
Обновил(-а) Vektor 15.01.2012 в 22:57
Старый 15.01.2012 22:58 CEBEP вне форума
CEBEP
 
Аватар для CEBEP
Цитата:
Теперь создайте Текстовый документ и назовите, к примеру, Заготовки.as и сохраните, там эти функции и их вызов, и каждый раз, когда они вам понадобятся, вы можете скопировать и вставить в свой код
Раз уж токое дело, вот ещё один мой плохой совет Необязательно каждый раз копировать, можно обойтись вот такой строчкой в теле кода:

Код AS3:
include "Заготовки.as"
Старый 15.01.2012 23:27 fish_r вне форума
fish_r
 
Аватар для fish_r
Признак выделения кода в отдельный класс уже сформулирован, на мой взгляд достаточно удачно: "Один класс - одна задача".

Когда кол-во переменных или методов в классе подбирается к десятку "меня начинают терзать смутные сомнения" ). Когда кол-во строк в классе близко к 500 скорее всего что то идет не так - надо дробить.
Это не догма, но достаточно верные признаки необходимости рефакторинга.

Цитата:
Фактически Блок это законченный Класс, который выполняет свою функцию в приложении
и опять же

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

Цитата:
Не пойму, кому может понадобиться помещать функцию в класс, веть что-бы её потом использовать, придется создать объект этого класса, затем использовать метод, затем удалить. Так серьёзно кто-то делает?
У меня так часто случается в работе с анимацией виз. объектов, такие операции могут быть достаточно многострочными, я их выношу в специально созданный для этого статик (или создаю специальный объект/класс, так тоже бывает - в зависимости от обстоятельств). Таким образом код основного класса не обрастает "ненужными подробностями". Не знаю - насколько это хорошо или плохо? Если кто-то
видит в этом минусы - пусть выскажется )
Старый 15.01.2012 23:46 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
У меня есть функции которые вынесены отдельно.
Старый 16.01.2012 00:07 expl вне форума
expl
Цитата:
Теперь создайте Текстовый документ и назовите, к примеру, Заготовки.as и сохраните, там эти функции и их вызов, и каждый раз, когда они вам понадобятся, вы можете скопировать и вставить в свой код.
Ухты, а я и не увидел, думал Vektor рассказывает про то как надо правильно разбивать код внутри класса, когда встечаются одинаковые куски.
Да, круто Похапе-подход - страшная сила.
Старый 16.01.2012 00:46 Stitch512 вне форума
Stitch512
Цитата:
Теперь создайте Текстовый документ и назовите, к примеру, Заготовки.as и сохраните, там эти функции и их вызов, и каждый раз, когда они вам понадобятся, вы можете скопировать и вставить в свой код.
COPY/PASTE ??? а почему нужные и полезные функции не сделать статическими в отдельном классе (а-ля Math) и затем использовать этот класс в разных проектах... Или опять же, как уже было сказанно, ипользовать фабрики... Что-то "секретами профессионалов" тут и отдаленно не пахнет...
Старый 16.01.2012 01:41 Stitch512 вне форума
Stitch512
Цитата:
Всегда кто-то выдумывает велосипед, другой вопрос становится он от этого хуже или лучше.
Ну тому кто выдумывает это может и идет на пользу (по крайней мере в качестве опыта), но не вижу смысла писать статьи про свои велосипеды, коих уже сотни. Новичкам от них пользы не будет (если уж и учиться на велосипедах, то на своих), профессионалам тем более. И как то весь смысл статьи укладывается в "пишите классы правильно, классы группируйте в блоки правильно, пишите функции правильно". Практическая польза от нее минимальна, не понимаю зачем вообще писать подобную информацию, плюс одна статья из серии "я понял как писать программы, сейчас я вам расскажу" и минус к процентному соотношению полезеной инфомации на форуме к "наборубукав"... грусть, печаль(
Старый 16.01.2012 09:17 Vektor вне форума
Vektor
 
Аватар для Vektor
http://habrahabr.ru/blogs/cpp/129202/
Вот об этом я и писал, что функцию подменяют Классом, можете и комментарии почитать.
Цитата:
сделать статическими в отдельном классе (а-ля Math)
Math – это универсальный класс, который работает с математическими данными, и у него нет не чего лишнего. У нас же, могут быть универсальные функции, которые выполняют разные функции в коде, но которые было бы безумием выносить, в отдельный класс, тогда вообще будет не понятно, что этот класс делает.
А выносить, каждую такую функцию в отдельный класс….
Тем более, это ваши функции, и вы их можете подправлять как, нужно не меняя, логики кода функции.
Вот тут я слышу, много возгласов, что если залезть, в код то можно его испортить, но я повторюсь, это ваши функции.
И ни кто и нечто не помешает, вам их подправлять под нужную, задачу.
Универсальный класс, это класс, который, выполняет, свою задачу, и его можно улучшить, наследованием, но не тем, чтоб туда залезть и чего-нибудь там дописать. Если так называемый Универсальный класс, содержит какие-то ошибки, то язык не повернется его назвать универсальным.
Блок – это не Универсальный класс, Универсальный класс это не Блок.
Диски автомобиля – это Универсальный класс.
Шины - Универсальный класс.
Колесо автомобиля это Блок.
Если, только Диски не для Жигулей, а шины не для БелАЗа.
Хотя по отдельности они могут быть лучшими в своём виде.

В обсуждении рождается истина, ни кто, ни кого не заставляет, переучиваться, просто у меня сложилась такая концепция, Функция - Универсальный класс – Блок – Законченный продукт.
Универсальный класс – состоит из Функций и других Универсальных классов.
Блок – состоит только из Универсальных классов.
Законченный продукт - состоит только из Блоков.

З.Ы – Хотя по-моему,не чего нового я не открыл, всё давно уже открыто.
Обновил(-а) Vektor 16.01.2012 в 09:53
Старый 16.01.2012 10:14 BuKT вне форума
BuKT
 
Аватар для BuKT
Цитата:
А выносить, каждую такую функцию в отдельный класс….
package some.utils?
Старый 16.01.2012 12:00 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
По поводу венгерской нотации: у Джоела Спольски была по этому поводу чуть ли не серия статей, сейчас искать влом, кому нужно - сами знают
В смысле автокомплита - раз на раз не приходится, может получиться больше вариантов, а может и менше, так что тут выигрыша нет. Я всегда пишу подчерк перед полями клсасса (это тоже своего рода венгерская нотация), но преимущества в смысле автокомплита это дает только если полей класса очень мало. Я могу понять когда префикс или суффикс в имени переменной нужен для чего-то другого, что нельзя выразить через класс (например, если функция - предикат, или обработчик события, или функция создающая новый экземпляр объекта / изменяющая объект - обычно применимо к коллекция и т.п.). А записывать тип... ну так типов в приложении может быть очень много, и такая информация будет бесполезной.

Что до addChild, мне недавно понадобилось переписать кучу MXML компонент в AS (отладчик в IDEA очень плохо работает с MXML кодом). Врезультате появилась функция addChildren(container, ...children) - по очевидным причинам, чтобы не писать по 100 раз addChild(container, child0), addChild(container, child1) и т.п. Сразу задавать координаты в addChild() было бы избыточно, особенно во флексовом коде т.как там очень часто расположение элементов диктуется какими-нибудь другими факторами типа леяутов, паддингов, скинов и т.п.
Старый 16.01.2012 14:16 Stitch512 вне форума
Stitch512
Цитата:
Math – это универсальный класс, который работает с математическими данными, и у него нет не чего лишнего. У нас же, могут быть универсальные функции, которые выполняют разные функции в коде, но которые было бы безумием выносить, в отдельный класс, тогда вообще будет не понятно, что этот класс делает.
А выносить, каждую такую функцию в отдельный класс….
Про выносить каждую функцию в отдельный класс никто и не говорил. А в вашем примере функции легко группируются в MovieClipUtils к примеру. Если в нем функции специфичные для конкретного проекта - и ну хорошо, в другой их выносить и не надо. А то что вы предлагаете - классический COPY/PASTE. Скопировали из одного места, вставили в другое, немного подправили. От такого как раз наоборот пытаются избавляться путем рефакторинга. (http://www.ozon.ru/context/detail/id/2909721/ стр. 69 к примеру).
Старый 16.01.2012 14:26 Stitch512 вне форума
Stitch512
И вообще, код нужно стараться делать по возможности универсальным - это называется повторное использование. Понятно что такое не всегда возможно, но нужно по крайней мере стремится, а не плодить кучу файликов с кусками кода которые потом копировать - это изврат в чистом виде. Вы бы сначала с текущими подходами в программировании ознакомились, прежде чем свои изобретать.
Обновил(-а) Stitch512 16.01.2012 в 14:29
Старый 16.01.2012 14:58 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
Читаю и чувствую, что становлюсь секретным профессионалом.
Старый 16.01.2012 15:31 artcraft вне форума
artcraft
 
Аватар для artcraft
Цитата:
Признак выделения кода в отдельный класс уже сформулирован, на мой взгляд достаточно удачно: "Один класс - одна задача".

Когда кол-во переменных или методов в классе подбирается к десятку "меня начинают терзать смутные сомнения" ). Когда кол-во строк в классе близко к 500 скорее всего что то идет не так - надо дробить.
Это не догма, но достаточно верные признаки необходимости рефакторинга.
Согласен с каждым словом. Кстати процесс разделения классов на части называется декомпозиция

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

А вот если эта утилита, в свою очередь, намертво зависит от чего-то ещё, тогда вы ступили на скользкую тропинку.
Старый 16.01.2012 17:46 crazyone вне форума
crazyone
 
Аватар для crazyone
Это было в друзьях:
http://www.youtube.com/watch?v=wsVqP4_kAT0
Старый 16.01.2012 18:07 Vektor вне форума
Vektor
 
Аватар для Vektor
Цитата:
И вообще, код нужно стараться делать по возможности универсальным - это называется повторное использование. Понятно что такое не всегда возможно, но нужно по крайней мере стремится, а не плодить кучу файликов с кусками кода которые потом копировать - это изврат в чистом виде. Вы бы сначала с текущими подходами в программировании ознакомились, прежде чем свои изобретать.
Хорошо. Повторное использование, у меня есть вот такая вот функция, она центрирует
выделенную точку в центр экрана, я знаю, что она ещё не раз пригодится, что я должен сделать, чтоб повторно её использовать в другом проекте. Напишите подробней, чтоб другие могли воспользоваться этой информацией.
Код AS3:
private var sw:int = stage.width/2;
private var sh:int = stage.height/2;
private function fAlign(mcPoint:MovieClip):void {
	  mcMap.x = (mcPoint.x-( mcPoint.x*2-sw));
	  mcMap.y = (mcPoint.y-( mcPoint.y*2-sh));
}
Надеюсь, этот блог поможет, начинающим программистам понять как нужно и как не нужно программировать, насколько я знаю, многие не любят читать книги, а вот такие вот форумы для них и создаются, и я не говорю что это плохо, только форум не панацея и не замена книгам.
Цитата:
А то что вы предлагаете - классический COPY/PASTE. Скопировали из одного места, вставили в другое, немного подправили. От такого как раз наоборот пытаются избавляться путем рефакторинга.
Это не совсем ясно, зачем избавляться, от нормальной функции, которая делает свою работу, а вот если вы её вынесите в другой класс, вот тогда придет рефакторинг, и вернет туда где она и должна быть.

P.S - Поменял, опять не досмотрел, я знаю, что с большой буквой нельзя, хотяяя, это мой код, что хочу то и делаю, это шутка.
Обновил(-а) Vektor 16.01.2012 в 20:47
Старый 16.01.2012 18:22 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
Если так называемый Универсальный
класс, содержит какие-то ошибки, то язык
не повернется его назвать
универсальным.
В 95% кода содержится хоть одна ошибка(а там где есть хоть одна ошибка,можно и еще одну найти). получается универсальных классов вообще нет. По идеи универсальный класс-это класс к. многое умеет(как перачиный нож),что не очень хорошо(за всё хватается и ничего не может). Может лучше побольше почитать и посветить время практике, а не писать в блог, имхо конечно же.
Старый 16.01.2012 18:23 in4core вне форума
in4core
 
Аватар для in4core
Vektor - называть методы с большой буквы, а особенно переменные - есть быдлокодство.
Старый 16.01.2012 18:33 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
приведенная функция Align все таки частное решение(кто сказал, что ширина/высота стейдж не меняется?).Как то так надо:
Код AS3:
public static function centerize(value:DisplayObject,container:DisplayObjectContainer=null):void{}
запихнули эту функцию в DOUtils и пользуйтесь, без постоянного копипаста
Старый 16.01.2012 18:35 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
Цитата:
if(so.data.logins != [] && (so.data.logins as Array).length < 5 )
вот это быдлокодство, а имя свойства с большой буквы - несоблюдение конвенции.
Обновил(-а) cleptoman 16.01.2012 в 18:42
Старый 16.01.2012 18:40 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
Код AS3:
container:DisplayObjectContainer
в качестве аргумента тоже частный случай..
что-то типа
Код AS3:
public static function align(target:DisplayObject,viewport:Rectangle,align:String = "topLeft")
Старый 16.01.2012 18:40 crazyone вне форума
crazyone
 
Аватар для crazyone
Может у них конвенция требует имен переменных и методов с большой буквы?
Старый 16.01.2012 18:45 crazyone вне форума
crazyone
 
Аватар для crazyone
Цитата:
Хорошо. Повторное использование, у меня есть вот такая вот функция, она центрирует
выделенную точку в центр экрана, я знаю, что она ещё не раз пригодится, что я должен сделать, чтоб повторно её использовать в другом проекте. Напишите подробней, чтоб другие могли воспользоваться этой информацией.
Код AS3:
private var Sw:int = stage.width/2;
private var Sh:int = stage.height/2;
private function Align(mcPoint:MovieClip):void {
	  mcMap.x = (mcPoint.x-( mcPoint.x*2-Sw));
	  mcMap.y = (mcPoint.y-( mcPoint.y*2-Sh));
}
Прости, а что такое mcMap? Не должен ли метод "Align" быть методом этого самого mcMap?
Старый 16.01.2012 18:46 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Может у них конвенция требует имен переменных и методов с большой буквы?
Тогда это peace deads конвенция ))
Старый 16.01.2012 18:47 Aloran вне форума
Aloran
Цитата:
Хорошо. Повторное использование, у меня есть вот такая вот функция, она центрирует
выделенную точку в центр экрана, я знаю, что она ещё не раз пригодится, что я должен сделать, чтоб повторно её использовать в другом проекте. Напишите подробней, чтоб другие могли воспользоваться этой информацией.
Код AS3:
private var Sw:int = stage.width/2;
private var Sh:int = stage.height/2;
private function Align(mcPoint:MovieClip):void {
	  mcMap.x = (mcPoint.x-( mcPoint.x*2-Sw));
	  mcMap.y = (mcPoint.y-( mcPoint.y*2-Sh));
}
Код AS3:
// относительно любого объекта (brother) внутри общего контейнера
public static function alignCenterByBrother(target:DisplayObject, brother:DisplayObject):void
{
    target.x = int(brother.x + (brother.width - target.width) * 0.5);
    target.y = int(brother.y + (brother.height - target.height) * 0.5);
}
 
// относительно родителя
public static function alignCenterByParent(target:DisplayObject):void
{
    target.x = int((target.parent.width - target.width) * 0.5);
    target.y = int((target.parent.height - target.height) * 0.5);
}
Старый 16.01.2012 18:48 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
to cleptoman согласен вы правы. Гг target на Rectangle заменить и еще общнее получится
Старый 16.01.2012 18:55 crazyone вне форума
crazyone
 
Аватар для crazyone
Цитата:
Код AS3:
public static function alignCenterByBrother(target:DisplayObject, brother:DisplayObject):void
{
    target.x = int(brother.x + (brother.width - target.width) * 0.5);
    target.y = int(brother.y + (brother.height - target.height) * 0.5);
}
Не то, чтобы это принципиально важно, но для этого используют слово sibling. Брат - немного не то.
Старый 16.01.2012 18:57 Aloran вне форума
Aloran
спс учту)
Старый 16.01.2012 19:25 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Когда кол-во строк в классе близко к 500 скорее всего что то идет не так - надо дробить.
Вместе с комментами и asdoc'ми?
Старый 16.01.2012 19:31 Stitch512 вне форума
Stitch512
Цитата:
Хорошо. Повторное использование, у меня есть вот такая вот функция, она центрирует
выделенную точку в центр экрана, я знаю, что она ещё не раз пригодится, что я должен сделать, чтоб повторно её использовать в другом проекте. Напишите подробней, чтоб другие могли воспользоваться этой информацией.
Собственно выше уже написали достаточно примеров ). А вообще надо стараться писать реентерабельные функции, тогда не будет проблемм с их повторым использованием. В вашем же примере функция зависит от внешних переменных, чего по возможности нужно избегать, и тем более не копировать в отдельный файл для повторного использования.
Цитата:
Надеюсь, этот блог поможет, начинающим программистам понять как нужно и как не нужно программировать, насколько я знаю, многие не любят читать книги, а вот такие вот форумы для них и создаются, и я не говорю что это плохо, только форум не панацея и не замена книгам.
Именно, а в вашей статье достаточно много спорных моментов, поэтому она никаким образом не является "секретами профессионалов" и тем более не дает представление о правильном программировании, а начинающего может только запутать.
Обновил(-а) Stitch512 16.01.2012 в 19:34
Старый 16.01.2012 19:58 fish_r вне форума
fish_r
 
Аватар для fish_r
Цитата:
Цитата:
Цитата:
Когда кол-во строк в классе близко к 500 скорее всего что то идет не так - надо дробить.
Вместе с комментами и asdoc'ми?
Нет, конечно. Я, вообще, пишу сначала без комментов, добавляю их только в "тонкие" места. А потом... да и потом не добавляю, ленюсь, стараюсь, только добавлять описание назначения класса, остальное ясно из кода.

asdoc-и только в классы для повторного использования, это отдельная история... но опять же уже после того как класс написан и "прокачан"...
Старый 16.01.2012 20:48 goodguy вне форума
goodguy
Конструкция for цикла приколола
Код AS3:
for (var i:uint=0; i<=amcRemove.length-1; i++) {
	mcClip.removeChild(amcRemove[i]);
}
Зачем там -1? Когда можно так:
Код AS3:
for (var i:uint = 0; i < amcRemove.length; i++) {
	mcClip.removeChild(amcRemove[i]);
}
И вообще, может со мной некоторые не согласятся, но я считаю что код от операторов надо отделать пробелами всегда. Иначе получается каша в которую даже заглядывать не хочется. Код без пробелов - моветон.
 

 


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


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