ScorpioT1000
Работаем
online
Опыт: отключен
|
Повседневные приёмы в программировании. Специально для вармейкеров.
Начну с того, что статья рассчитана на людей (а не киборгов, хоть и написана одним из них), владеющих как минимум базовыми знаниями Jass, vJass и cJass. Она расскажет об интересных повседневных приемах программирования на варкрафте, о которых некоторые уже достаточно наслышаны, но их тема раскрыта не окончательно.
Но ведь вам скучно, вам нужно БОЛЬШЕ?! Тогда вам сюда: ru.wikipedia.org/wiki/Шаблоны_проектирования
Для практики требуется иметь установленными и рабочими:
Содержание:
Основные понятия ООПООП, как вы, конечно, все прекрасно знаете, расшифровывается как Объектно-Ориентированное Программирование. Это очень широкая тема и я не буду ее пересказывать, для этого есть вики.
Коротко о главном. ИнкапсуляцияЕсть такое фундаментальное понятие как Инкапсуляция. Это принцип ООП, которые подразумевает внешнее разделение данных между вашим объектом и другими внешними объектами.
Другими словами, вашим объектом извне могут управлять только так, как вы этого хотите. Обычный пример:
У нас есть какой-то квадрат, мы задаем его сторону. И зачем нам эта функция SetSide? Она только мешает.. почему бы не убрать private и не сделать
A.a = 2.0 ? А вот что стало когда вы скачали новую версию "квадрата" на следующий день:
А еще разработчик "квадрата" сказал что в будующем его можно будет запускать в космос.
А в вашей старой системе все еще полно простых присвоений. Конечно, все это зависит от ситуации, но в каждом случае следует задуматься наперед - "а хватит ли мне простого присвоения?".
Почти такая-же ситуация с библиотеками.
Все функции, которые не используются вне библиотеки, должны быть приватными. А данные вобще почти всегда должны быть приватными, кроме некоторых незначительных вещей. Обычный пример:
Также это дает понять пользователям библиотеки, какие функции предназначены для использования библиотеки, а какие - для внутренней работы. В C++ для этого существуют header-файлы, а здесь все не так красиво, зато быстро.
АбстракцияАбстракция - еще одно фундаментальное понятие ООП. Хотя о ней обычно, хоть и поверхностно, знает любой программист.
В целом Абстракция подразумевает физическое разделение внутренних и внешних данных во благо удобства. (В то время как Инкапсуляция подразумевала внешнее.) Пример покажет это подробнее:
Хотя здесь просто стоит учесть, что для объекта лучше изначально определить поведение внутри и снаружи, чем потом все переписывать.
НаследованиеПолезный механизм ООП, но сразу скажу, что в варкрафте не стоит им злоупотреблять.
Во-первых, варкрафт не настолько широк, чтобы создавать так много структур, содержащих одинаковые данные. Во-вторых, он очень ограничен возможностями Jass. Наследование позволяет одним структурам включать в себя все то, что содержат другие структуры.
Пример:
Создается общий класс "Оружие" и все другие классы используют его как родительский.
ПолиморфизмТакже есть такое понятие как Полиморфизм. Но в Jass он совсем не применим и я не буду о нем рассказывать.
КонтейнерыШирокое применение в общедоступных библиотеках получили контейнеры. Контейнером является конструкция, включающая в себя объекты изначально неопределенного типа и реализацию некоторых алгоритмов работы с ними. Другими словами, контейнер является полноценной структурой, которая работает с такими типами данных, которые задал пользователь.
Чаще всего, в языках типа C++, контейнеры задаются с помощью шаблонов(templates).
А у нас есть define из cJass :) И вот распространенный пример:
Кстати, небезызвестная XAT устроена примерно по такому-же принципу.
В результате для ArrayX10(int,50000) будет такой код:
Пример контейнера посложнее(часть взята из DGUI):
В итоге получаем структуру "M2M4", содержащую в себе MATRIX2 и MATRIX4, а также свои функции управления ими(в данном случае New и Multiply).
Классы-конфигурацииСам я не видел подробного описания таких классов, а название "Классы-конфигурации" было придумано мной, как наиболее подходящее.
Вон NETRAT говорит: en.wikipedia.org/wiki/Helper_Class_(computer_science) Классы-конфигурации - это "вспомогательные" классы, которые создаются для удобной передачи параметров в другие функции. После этого они почти всегда удаляются. Основная особенность такого класса - он имеет только несколько конструкторов и деструктор.
Я думаю, цветной пример все покажет:
Таким образом, одним аргументом может быть и набор целых, и число из перечисления, и даже hex строка.
Этот удобный способ передачи параметров очень поможет сделать вашу библиотеку "уникальнее". Пользователь может поступать в каждом случае по-своему. Я думаю, это даже частично можно отнести к Полиморфизму.
Стек и "Аттачи"В программировании есть такое понятие как "Стек". Это набор однотипных данных, добавление и удаление которых производится по типу LIFO (Last In - First Out).
В вармейкинге это используют чаще всего для Мультиприменения и Аттача.
Мультиприменение чего-либо означает, что какой-либо процесс может работать в нескольких экземплярах в один момент времени. Пример - заклинание.
Аттач применяется для "подсоединения" каких-либо дополнительных данных к объектам. Чаще всего такими объектами являются хэндлы из common.j, т.к. их структура неизменяема. МультиприменениеРассмотрим работу мультиприменения.
У нас есть процесс, который имеет свой набор данных и функций. Чтобы сделать его мультиприменяемым, мы должны организовать стек этих данных. С каждым вызовом процесса ему создается своя "область работы" в этом стеке. По завершению, ячейка стека очищается и мы удаляем процесс. Рассмотрим на простом примере. Стеком будет массив юнитов, а процессом - быстрое повышение здоровья этих юнитов.
Реализуем функции добавления, удаления и лечения юнитов, а также запустим таймер с периодом.
АттачиС аттачами не намного сложнее.
Цель аттача - привязка чего-либо куда-либо. Рассмотрим на примере юнита. На этот раз мы будем находить ячейку не перебором, а с помощью "Unit Custom Value". Для этого удобно создать структуру, содержащую хэндл этого юнита и дополнительные данные.
Попробуем привязать к юниту другого юнита.
В итоге достаточно простой интерфейс привязки.
Также вы можете почитать, как прикреплять данные с помощью Кэша, Хэш-таблиц и XAT..
Например, здесь: xgm.ru/articles.php?name=ex_jass Или здесь: xgm.ru/forum/showthread.php?t=12894 (и все это будет зависеть от версии варкрафта) ЗаключениеВ заключение я хочу сказать, хватит палить уже мою статью) Я и так сидел три часа..
Так о чем я, в наши тяжелые времена программистам приходится нелегко итп.. ну вобщем сами че-нибудь придумайте. Я пошел :)
Слушайте рок ! Отредактировано ScorpioT1000, 22.12.2009 в 19:41. |
14.12.2009, 02:34 | #1
+1/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FREEZE_ball
Cataclysm => жара
offline
Опыт:
15,247Активность: |
Весьма неплохо, и, вопреки моим ожиданиям перед прочтением, понятно.
Полиморфизм, все таки, это что? Кратенько. Немного не понятен только смысл статьи. Разве что раскрытие понятий? Ну, а вообще, интересно, и примеры вдохновляют =) FREEZE_ball добавил: Рок рулит. |
14.12.2009, 08:45 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FunkieFoO
offline
Опыт:
7,159Активность: |
рок правит миром
статья зачетная, та же инфа что и в книгах по с++, но в более краткой форме, в общем скорп1к - красафчег! список терминов будет дополняться? как я помню там есть еще какие то вкусности...
ГРАЦ |
14.12.2009, 08:53 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Да ладно? =) Hellfim добавил: Ну а в общем статья норм, я бы даже сказал хорошая, надеюсь кроме меня она пригодится еще какому-нибудь хомячку. |
14.12.2009, 09:33 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
ой, таки запарил)
спасибо :) ScorpioT1000 добавил:
FREEZE_ball, поищи на вики. в целом это различная реализация функций (виртуальные функции) и наборов данных в зависимости от типа объекта (обычно при наследовании) динамически (!). тоесть поведение объекта определяется по ходу работы программы FunkieFoO, просто я увлекся, рассказывая об ООП. в целом хотел раскрыть некоторые моменты |
14.12.2009, 11:13 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
XOR
offline
Опыт:
38,284Активность: |
Полезная статья. Все раскрыто и понятно. |
14.12.2009, 15:40 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Nekit1234007
offline
Опыт:
11,916Активность: |
Код:
|
14.12.2009, 17:23 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
да, я тут тоже запарил немного, но это чисто пример, такчто не критично) |
14.12.2009, 18:25 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
инкапсуляция есть в цинковом мануале. А так зачет, статья написана простым языком. |
15.12.2009, 12:40 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
кому он нужен?) |
15.12.2009, 16:42 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
txt2 в статьях вышел. статья добавлена в базу xgm.ru/project.php?id=100&pageid=6378 |
26.02.2010, 15:10 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
ваша страсть по пропихиванию никому не нужного цджаз поражает, ну что, идёте к успеху, гулдак. |
26.02.2010, 15:15 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
особенно когда систайл на ск2 ) |
26.02.2010, 15:21 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
Это только вы так думаете, еще никто не видел реальных скриптов на галакси и тем более не делал. |
26.02.2010, 15:26 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
щас не то время чтобы бета настолько круто отличалась от релиза) |
26.02.2010, 15:30 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
ты хочешь намекнуть что в релизе мы их тоже не увидим? |
26.02.2010, 15:33 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
krosaf4eg
offline
Опыт:
1,859Активность: |
Статья неплохая но имхо содержание не соответствует названию (я б назвал "Принципы ООП и их применение в cJass")
И почему бы в примерах не писать так:
раз в самой либе функции написаны через { }, а то так слегка каша получается) |
26.02.2010, 16:42 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
я просто привык "мощные" блоки писать на олдстайле)
ScorpioT1001 добавил: т.е. либы, скоупы и стракты |
26.02.2010, 22:20 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
XOR
offline
Опыт:
38,284Активность: |
Наоборот удобно, с {} лучше писать обычные функции, так понимать легче свой и чужой код позже. |
27.02.2010, 10:44 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
krosaf4eg
offline
Опыт:
1,859Активность: |
Кто как привык конешно, просто смешивать синтаксисы не принято для удобочитаемости и ясного представления структуры кода, а это все-таки пример из статьи)
P.S
XiMiKs:
кому как, мне например удобно чтобы все через { }, мне так понимать легче свой и чужой код пожже |
27.02.2010, 11:17 | #20
+0/−1
Профиль |
Приват |
Поиск |
IP: Записан
|