Маленькие секреты профессионалов или как упростить написание кода.
Здесь, я бы хотел рассказать о том, как не плодить лишние классы.
Многие начинающие программисты, начитавшись об ООП, начинают разбивать (код на множество классов), подменяя понятие класс – функция.
Классы нужны только, если для вызова одной или нескольких функции, из этого класса, сами функции вызывают множество функции и переменных, этого класса, тем самым мы облегчаем читаемость нашего кода, но надо задать себе вопрос этот класс универсальный.
Универсальный класс, тот который, не меняя можно вставить в другое приложение.
Классы лучше использовать только в тех случаях, когда надо разбить программу на блоки или код настолько универсален, чтоб его не меняя можно вставить в другое приложение.
Что такое Блок?
В блок могут входить несколько классов, но желательно, чтоб эти классы были универсальны, или улучшали читаемость и поддержку кода в будущем.
Блоки - это независимые классы, например, создается игра.
1) Делаем Prealader, блок независимый от того какая игра загружается.
2) Делаем Экран - Начало Игры, здесь игрок может перейти к просмотру рекордов, зарегистрироваться или выбрать своё имя, для новой игры или для загрузки игры, выбрать в какой режим игры играть, если есть такой выбор (здесь нужно создать сохранения и загрузку игроков, которые уже играли в игру или собираются в неё играть).
3) Рекорды – Он считывает результаты, достигнутые в игре, и отображает их на экране.
4) Сама игра – Здесь тоже, можно и нужно разбивать игру на классы, например класс - инвентарь , это отдельный блок, в котором персонаж может менять экипировку, рыться в рюкзаке и так далее, класс - магазин, класс - монстр, класс - ещё чего ни будь, главное не путать Блок-Класс, Класс-функция, и ещё ООП дело хорошее и нужное, но только если, игра большая, или код будет использоваться в продолжении игры, или в поддержке игры долгое время, типа онлайновых игр.
Разбив приложение на блоки, можно каждый блок программировать отдельно, блок получает какие-то данные и сам делает с этими данными что нужно, в не зависимости, от других блоков, и если нужно отдаёт преобразованные данные другому блоку.
Теперь я бы хотел перейти к заглавию статьи.
Все мы знаем, что это такое, но не все знают, как это может упростить написание кода.
Вроде всё правильно!
А теперь, создадим 10 MovieClip или Sprite.
Ага! понимаете.
Вот функция, которая упростит нам жизнь.
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); //Не правда ли что так лучше выглядит.
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]); } }
Всего комментариев 117
Комментарии
15.01.2012 14:24 | |
Из названия не ясно, о чем пойдет речь.
|
15.01.2012 19:44 | |
Оно, конечно, fAddChild(_mcClip,100,100); выглядит компактнее, но не всегда удается вспомнить, что именно делает fAddChild, а код:
хоть и длиннее, выглядит понятнее. Хотя, если добавляется больше 10 объектов однотипным образом - сам так делаю. Еще выручают локальные фабрики, например: var tf:TextField; tf = newText("Label text"); addChild(tf); tf = newText("Label text 2"); tf.y = 20; addChild(tf); tf = new TextField(); tf.selectable = false; tf.autoSize = TextFieldAutoSize.LEFT; ... tf.format = new TextFormat("Tahoma"); P.S.2: Больше всего этот момент удивляет, зачем может понадобиться добавлять кучу объектов в одну точку? Цитата:
P.S.3. Вообще дробление на мелкие функции - это один из распространенных и полезныx типов рефакторинга, только добавление ребенка через вызов функции - перегиб палки. |
|
Обновил(-а) expl 15.01.2012 в 19:56
|
15.01.2012 20:05 | |
я, например, не понимаю супер удобности fAddChild,...
тут вообще все как-то странно, например ситуация //код автора 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) И почему нет типизации? Очевидно же, что mcClip это DOC, а mcClip1 это какой-то DO. А, например, метод fAddChildArray, может создать проблем, если какого [i] - нет, ну нет его и все, Метод 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 | |
Кстати, а чем плоха венгерская нотация?
|
15.01.2012 20:13 | |
http://ru.wikipedia.org/wiki/%D0%92%...86%D0%B8%D1%8F
Почти все плюсы исчезают для языка со статической типизацией. А недостатков - вагон. Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста» Как-бы вещи очевидные, как и очевидно то, что адептов этой нотации так же просто переубедить, как обратить мармона в ислам (или в атеисты). Плюсы тоже ведь есть. |
|
Обновил(-а) expl 15.01.2012 в 20:15
|
15.01.2012 20:46 | |
Эти функции я создавал в основном для Sprite и MovieClip.
Цитата:
и к тому же будет работать с массивом, который где-то должен создаться и заполнится.
|
|
Обновил(-а) Vektor 15.01.2012 в 20:53
|
15.01.2012 21:08 | |
Это все извращение.
Запросить объект откуда-то (будь то фабрика, директор, пул и т.д.) и потом с ним работать. |
15.01.2012 22:19 | |
Пробуют, на вкус ООП, все с чего-то начинали. Сам вначале пробовал, разбивал код на несколько классов, а кода всего 400строчек, но быстро опомнился.
|
15.01.2012 22:32 | |
Цитата:
Сообщение от Tails
Не пойму, кому может понадобиться помещать функцию в класс, веть что-бы её потом использовать, придется создать объект этого класса, затем использовать метод, затем удалить. Так серьёзно кто-то делает?
|
15.01.2012 22:33 | |
Vektor, я бы вам посоветовал ознакомиться вот с этой книгой http://www.amazon.com/AdvancED-Actio.../dp/1430236140 ,а потом уже выдумывать "вилисапеды".
|
|
Обновил(-а) CEBEP 15.01.2012 в 22:37
|
15.01.2012 22:44 | |
Увы, в Английском я не так силен, как переведут, обязательно прочитаю.
Цитата:
а потом уже выдумывать "вилисапеды"
|
|
Обновил(-а) Vektor 15.01.2012 в 22:57
|
15.01.2012 23:46 | |
У меня есть функции которые вынесены отдельно.
|
16.01.2012 09:17 | |
http://habrahabr.ru/blogs/cpp/129202/
Вот об этом я и писал, что функцию подменяют Классом, можете и комментарии почитать. Цитата:
сделать статическими в отдельном классе (а-ля Math)
А выносить, каждую такую функцию в отдельный класс…. Тем более, это ваши функции, и вы их можете подправлять как, нужно не меняя, логики кода функции. Вот тут я слышу, много возгласов, что если залезть, в код то можно его испортить, но я повторюсь, это ваши функции. И ни кто и нечто не помешает, вам их подправлять под нужную, задачу. Универсальный класс, это класс, который, выполняет, свою задачу, и его можно улучшить, наследованием, но не тем, чтоб туда залезть и чего-нибудь там дописать. Если так называемый Универсальный класс, содержит какие-то ошибки, то язык не повернется его назвать универсальным. Блок – это не Универсальный класс, Универсальный класс это не Блок. Диски автомобиля – это Универсальный класс. Шины - Универсальный класс. Колесо автомобиля это Блок. Если, только Диски не для Жигулей, а шины не для БелАЗа. Хотя по отдельности они могут быть лучшими в своём виде. В обсуждении рождается истина, ни кто, ни кого не заставляет, переучиваться, просто у меня сложилась такая концепция, Функция - Универсальный класс – Блок – Законченный продукт. Универсальный класс – состоит из Функций и других Универсальных классов. Блок – состоит только из Универсальных классов. Законченный продукт - состоит только из Блоков. З.Ы – Хотя по-моему,не чего нового я не открыл, всё давно уже открыто. |
|
Обновил(-а) Vektor 16.01.2012 в 09:53
|
16.01.2012 10:14 | |
Цитата:
А выносить, каждую такую функцию в отдельный класс….
|
16.01.2012 14:16 | |
Цитата:
Math – это универсальный класс, который работает с математическими данными, и у него нет не чего лишнего. У нас же, могут быть универсальные функции, которые выполняют разные функции в коде, но которые было бы безумием выносить, в отдельный класс, тогда вообще будет не понятно, что этот класс делает.
А выносить, каждую такую функцию в отдельный класс…. |
16.01.2012 14:26 | |
И вообще, код нужно стараться делать по возможности универсальным - это называется повторное использование. Понятно что такое не всегда возможно, но нужно по крайней мере стремится, а не плодить кучу файликов с кусками кода которые потом копировать - это изврат в чистом виде. Вы бы сначала с текущими подходами в программировании ознакомились, прежде чем свои изобретать.
|
|
Обновил(-а) Stitch512 16.01.2012 в 14:29
|
16.01.2012 14:58 | |
Читаю и чувствую, что становлюсь секретным профессионалом.
|
16.01.2012 17:46 | |
Это было в друзьях:
http://www.youtube.com/watch?v=wsVqP4_kAT0 |
16.01.2012 18:07 | |
Цитата:
И вообще, код нужно стараться делать по возможности универсальным - это называется повторное использование. Понятно что такое не всегда возможно, но нужно по крайней мере стремится, а не плодить кучу файликов с кусками кода которые потом копировать - это изврат в чистом виде. Вы бы сначала с текущими подходами в программировании ознакомились, прежде чем свои изобретать.
выделенную точку в центр экрана, я знаю, что она ещё не раз пригодится, что я должен сделать, чтоб повторно её использовать в другом проекте. Напишите подробней, чтоб другие могли воспользоваться этой информацией. 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:23 | |
Vektor - называть методы с большой буквы, а особенно переменные - есть быдлокодство.
|
16.01.2012 18:33 | |
16.01.2012 18:35 | |
Цитата:
if(so.data.logins != [] && (so.data.logins as Array).length < 5 )
|
|
Обновил(-а) cleptoman 16.01.2012 в 18:42
|
16.01.2012 18:40 | |
16.01.2012 18:40 | |
Может у них конвенция требует имен переменных и методов с большой буквы?
|
16.01.2012 18:46 | |
Цитата:
Может у них конвенция требует имен переменных и методов с большой буквы?
|
16.01.2012 18:48 | |
to cleptoman согласен вы правы. Гг target на Rectangle заменить и еще общнее получится
|
16.01.2012 18:55 | |
Не то, чтобы это принципиально важно, но для этого используют слово sibling. Брат - немного не то.
|
16.01.2012 18:57 | |
спс учту)
|
16.01.2012 19:25 | |
Цитата:
Когда кол-во строк в классе близко к 500 скорее всего что то идет не так - надо дробить.
|
16.01.2012 19:31 | |
Цитата:
Хорошо. Повторное использование, у меня есть вот такая вот функция, она центрирует
выделенную точку в центр экрана, я знаю, что она ещё не раз пригодится, что я должен сделать, чтоб повторно её использовать в другом проекте. Напишите подробней, чтоб другие могли воспользоваться этой информацией. Цитата:
Надеюсь, этот блог поможет, начинающим программистам понять как нужно и как не нужно программировать, насколько я знаю, многие не любят читать книги, а вот такие вот форумы для них и создаются, и я не говорю что это плохо, только форум не панацея и не замена книгам.
|
|
Обновил(-а) Stitch512 16.01.2012 в 19:34
|
Последние записи от Vektor