Не так давно вышла книга "ActionScript 2: программирование во Flash MX 2004 (+CD). Для профессионалов" (автор книги -- Д. А. Гурский) (а в магазине Bolero эта же книга стоит на 100 рублей дешевле, подсказывает нам Авлин Анатолий). Книга вызвала споры в среде русскоязычного флэш-сообщества -- кто-то ее ругает, кто-то наоборот. Как бы там ни было, теперь у посетителей сайта Ф. Потрошителя есть возможность составить собственное мнение об этой книге, прочитав Главу 9, "Объектно-ориентированное программирование" и самостоятельно рассмотрев прилагающийся к ней практический пример "Проект 9. Модель идеального газа":
Скачать: ZIP-архив [Глава 9. Объектно-ориентированное программирование + пример "Проект 9. Модель идеального газа"] (219 Кб).
// Via Саня [ruFlash]
Мнда, судя по примеру, визуал как всегда отдыхает. Стыд да позор.
> а в магазине Bolero эта же книга > стоит на 100 рублей дешевле
А на книжной ярмарке эта книга стоит ещё на 100 руб. дешевле :)
Да путёвая книга... У нас, во всёком случае, и близко не с кем сравнивать. Жаль упорно не выкладываются три последние главы.
читаю, по ходу дела комменты: в общем неплохо. немного трудновато будет понять тем, кто не знает предмета. впрочем я предыдущих глав не читал, может поэтому такое мнение сложилось.
но есть и то, что очень не нравится:
- первая и очень раздражающая особенность это категорическое неиспользование постфиксов в коде. Как в исходнике, так и в книге. Если книга солидно-сурьезная, то уж не стоит учить тому, от чего потом приходится отучать. Использование постфиксов в AS - это стандарт. И коды должны быть написаны в этом стандарте. И в эту же тему: именование переменных на русском языке (типа: polzunok) - неуважение к коллегам. Я регулярно сталкиваюсь с корейскими исходниками, которые нужно локализовать. Они используют корейское именование переменных. Ненавижу. Использование английских именований переменных - тоже стандарт. И следует его придерживаться. Исключение может быть только для псевдокода.
- вторая особенность - небрежность кодов и иногда их неправильность. К примеру my_new. Это был первый код, который я тестанул, так мало того, что при компиляции флэш ругается, но еще и ошибка присутствует: вызов obj.constructor() должен быть последним перед return.
...читаю дальше.
Иногда вводят в ступор фразы типа: "Функции-конструкторы ведут себя как классы. Но настоящими классами они не являются." - конструктор класса в AS является лишь частью класса и никогда не является собственно классом. Как я понимаю, возможно, автор имеет ввиду классы в других языках программирования. Но как это понимать тем, для кого AS является первым и единственным языком? Идти учить другие языки, прежде чем взяться за чтение этой книги? Резюме: Ссылки на знание других языков программирования допустимы только в том случае, если вначале книги прямо указано, что, например, для понимания книги желательно знать С#. В противном случае утверждения типа: "Эта ситуация идентична ситуации с объектами класса Array. По своей структуре они не являются массивами – но внешне их поведение весьма схоже с массивами универсальных языков." Просто оставляют в непонятках. Класс Array в AS это и есть класс Array и ничто иное. Другого не дано. Он так реализован.
...читаю дальше
"Класс Object всегда завершает цепочку наследования." - плиз, не так категорично. не всегда: Object.prototype.bla = "bla"; myClass = function () { }; myClass.prototype = null; foo = new myClass(); trace(foo.bla);
или myClass.prototype.__proto__ = null
Цитата: "Интересной особенностью ActionScript является то, что на объект Global указывает свойство __proto__ прототипа конструктора Object, однако, при этом, объекты не наследуют его свойств и методов: trace(Object.prototype.__proto__ == _global);"
- неправильная интерпретация кода. Object.prototype.__proto__ возвращает undefined
т.е. фактически сравнение происходит такое: trace(undefined==_global); соответственно и выводы не должны иметь никакого отношения к Object.prototype.__proto__
Цитата: "Увы, но закрыть свойства также и от чтения извне невозможно (но это можно сделать при помощи атрибута private при использовании ООП в стиле ActionScript 2.0)."
- к сожалению, это распространенное заблуждение присутствует и здесь. AS1 гораздо мощнее и гибче AS2, который ни в коем случае не предоставляет каких то преимуществ перед AS1. Для того, чтобы посмотреть как делается private свойства и методы, достаточно заглянуть через ASV в код, который сгенерен с помощью AS2.
В AS1 на практие уже давно используются приватные методы. Прмер:
this.setMyClass = function() { _global.MyClass = function() { }; // private: var privateCall = function () { trace("hello"); }; // public: _global.MyClass.prototype.publicCall = function() { trace("private method calling:"); privateCall(); }; delete this.setMyClass; }; this.setMyClass(); my_instance = new MyClass(); my_instance.publicCall();
Цитата: "С другой стороны, введение getter/setter свойств снижает читабельность кода, а, следовательно, повышается сложность его отладки и внесения в него изменений."
- кто с этим согласен, поднимите руку. Я-то глупый всегда пользую addProperty для улучшения читабельности кода. :)
"valueOf(). В общем случае, данный метод возвращает величину свойства this собственного объекта активации. Обычно, это ссылка на объект, вызвавший метод. Но в случае экземпляров классов String, Boolean, Number возвращается связанная с объектом величина элементарного типа...."
- не совсем так. Во флэше объекты встроенных классов делятся на два типа: имеющие и не имеющие элементарный тип. Имеющие элементарный тип объекты не хранят никаких других свойств кроме элементарных. Все остальные свойства у них вычисляемые. Например, экземпляр класса Date хранит только время в тиках. все остальные свойства при обращении к ним вычисляются на базе этого значения.
toLocaleString планировался возвращать (а может уже и возвращает, но только те языки, которые поддерживаются макромедией) строку в национальном языке. Речь идет не об он-лайн переводчике :) Например new Date().toLocaleString() в китайской интерпретации должен был бы вернуть название месяца на китайском. Но это не официальная инфа. Т.е. не точная :).
пока остановился на 9.3
Общее впечатление:
Книга ОФИГИТЕЛЬНАЯ! Невзирая на всё мое старческое брюзжание. Автор не побоялся рассмотреть такие области, которые обычно "официальные" авторы обходят стороной. Разумеется, инициатива наказуема, что повлекло за собой ряд неточностей. Но это фигня, по сравнению с тем, какую исследовательскую работу проделал автор. Молодца.
Iv, анализ как всегда неплох, но ты вот сразу правильно написал - что судишь только по отрывкам из этой главы. Не знаю как кто, а я уже освоил эту книгу в полном объеме. И скажу вот что...
Большинство из первой половины комментов Iv-а, это суждение по фразам вырванным из контекста.
Автор где-то подробно останавливался на основных вещах, а по ходу изложения - лишь напоминает что-то, для полной ясности и для забывчивых (я сам такой). Так что манера изложения - выше всяких похвал. Спокойно, обстоятельно, сразу же соотв. пример, хоть и по самому маленькому вопросу.
Это все к тому, что если Iv прочитал в этой главе "хвостики" от предыдущих глав, то... (а иногда автор пишет, что сейчас мы коротко остановимся на чем-то, а подробное объяснение будет потом в соотв. главе).
Книга изначально рассчитана, как пишет автор в первой :-) главе - на знающих хорошо Flash. Если бы не мое участие в RuFlash, если бы не вникал раньше в скрипты от Iv, наверное не смог бы разобраться с этой книгой.
Что касательно преимуществ AS2 от AS1, то хотя, Iv, и весьма интересное замечание на счет атрибута private, но как пишет автор - AS2 дает НЕпривязку кода к временной шкале, на которой пишем код. Это сущий анахронизм был, имхо, даешь AS2 и долой тех, в ком силен профессиональный консерватизм! ;-)
Iv, прочитай всю книгу. :-) Потом напишешь окончательное свое мнение. :-)
Но вообще критика - весч хорошая. Все только на пользу.
Хотелось бы еще такую же книгу по JSFL, от этого же автора. :-)
Так обстоятельно разобрать вопрос - сможет только он.
;-)
ок, как прочитаю всю книгу, может по-новому взгляну на всё это. НО: "НЕпривязку кода к временной шкале" - это очень круто сказано. Еще раз напомню: AS1 и AS2 в итоге могут давать одинаковый байткод. На AS1 можно сделать любой AS2 класс так, что байткод будет совпадать байт в байт. И это просто делается: ASV. Если речь идет об #include, то есть #import. Ну или я совсем не понимаю о чем речь. %)
Господин Iv со своей нелюбовью к AS2 скоро превратится в Катона-старшего. :)
2 Iv: не могли бы вы напомнить мне — где именно указано что использование постфиксов в AS2 - это стандарт? А то мне почему-то кажется что это пережиток AS1. :)
И вот ещё. По поводу фразы "Еще раз напомню: AS1 и AS2 в итоге могут давать одинаковый байткод.". Код, написанный на Ассемблере и на C++ после компиляции может давать одинаковый машинный код. Но писать в наше время более-менее сложное приложение на Ассемблере, особенно если потом его нужно будет саппортить, может только человек со сквозным ранением в голову. Вот такое вот моё имхо.
Дорогой Колин,
1. Любовь и ненависть.
В текущих комментариях я не давал повода к тому, чтобы сделать заключение о моей нелюбви к AS2. Для меня AS2 - это лишь инструмент. В этом смысле не многим отличающийся от молотка. Как и AS1. Инструмент нужно знать и уметь им пользоваться. Если нужно сверлить дыру - нужно брать дрель а не молоток. Не любить молоток за то, что он не умеет сверлить - глупо. В AS2 есть свои преимущества. Есть недостатки. Как и у AS1. Вот так я отношусь к AS2. Это чтобы не возникало свободных трактовок о том, что я люблю, что не люблю. Хм... Раз уж такие трактовки возникают.
2. Использование постфиксов.
Открываем новый .as файл во Flash. Пишем: my_mc. - выпадает подсказка. Поддержка постфиксов никуда не делась. - Объявляла ли макромедия о том, что Венгерская натация deprecated? - Нет. Ни в коем случае. То, что при указании типа подсказка выпадает на любое слово это здорово, но действует только в рамках данного документа. Суффиксы - где угодно. - Выпадание подсказки не показатель? - Согласен. Для меня показатель хорошо написанного кода - его читабельность. Повышают ли постфиксы читабельность кода? - Да. Этого достаточно. Возможно, с введением объявления типов, нет такой острой необходимости именовать локальные переменные с постфиксами. Ок. Право автора. Но соряйте, там ведь не только AS2. Полно AS1. И ни намека на постфиксы. А если взглянуть на практику именования переменных автором - всё становится на свои места и в УК квалифицируется как преступная халатность :).
3. Ассемблер vs С++
Проводить параллель в данном случае - бред. Утверждения, что преимущества структурной организации AS2 перед AS1 настолько большой шаг впреред - только вызывают улыбку. AS2 более удобен в больших проектах. AS1 в маленьких. Ни больше ни меньше. Саппортить маленький проект, в котором есть ссылка на огромную библиотеку классов с разветвленной системой инклудов тоже занятие не из приятных. Случайно заинклудить пару десянков ненужных классов - запросто. Встречаюсь с такими исходниками через раз. Я не против AS2. Но хороша ложка к обеду.
PS: Мне искренне жаль людей, которые в силу тех или иных обстоятельств вынуждены скрывать свою личность. Удачи Вам, уважаемый Колин, на поприще подпольщика.
Упорно игнорируется вопрос про обещанные три последних главы книги... Качайте мол ребята, качайте... Откуда качать, если нигде нет? При некотором упорстве, можно отсудить у автора гонорар и передать Флэшерам далёкой Африки для приобретения лицензионного софта от Макромедии...
2 Iv
"Саппортить маленький проект, в котором есть ссылка на огромную библиотеку классов с разветвленной системой инклудов тоже занятие не из приятных. Случайно заинклудить пару десянков ненужных классов - запросто. Встречаюсь с такими исходниками через раз."
- во Flash XM 2004 можно сделать указание пути до библиотек с классами. Как в глобальных настройках установленной программы, так и для конкретного fla-файла.
Лично для меня проблемы выбора ВООБЩЕ НЕТ. AS1 в первоначальном варианте MX-исходников - НЕ работает в пр-ме Flash MX 2004.
Поэтому я указываю пути к каталогам с классами в MX 2004, и как только упоминается любой класс в моем fla-файле, он автоматически подключается на стадии компиляции.
Лишнее - НЕ включается. И не нужно ничего самостоятельно инклудить.
Ну и понятно, что если есть какая-то модификация класса (например) - все варьируется только на уровне установок путей до библиотек с классами. Добавлением новой строки поиска классов и перетаскиванием ее на самый верх.
Обрати внимание на цитату: "Встречаюсь с такими исходниками через раз." Что именно имеется ввиду: в небольшом проекте требуется, например, одна функция, которая есть в неком классе. В этом классе, совсем в другой функции где-то в коде, ненароком встречается ссылка на другой класс, например обращение к синглетону: заметить крайне трудно. Этот класс содержит в себе инклуды еще пяти классов. "Лишнее - НЕ включается" - согласен. В идеальном проекте не может быть ничего лишнего. Но автоматическое включение - потенциальная дыра, в которую в реальной жизни лезут ненужные классы. Еще раз: "Встречаюсь с такими исходниками через раз."
>> Для меня показатель хорошо написанного кода - его читабельность.
Ив, один вопрос, из каких соображений класс Path был написан в том виде в котором он написан? :))
(прошу меня простить за оффтопик)
Из тех же, что и придуманы логарифмы, интегралы и прочая. Ты там как хочешь назови переменные, понятней код не станет. Уж поверь.
Кстати, выложены для скачивания недостающие дополнительные главы к книге Гурского. Там же можно скачать и файлы к книге.
Что-то ссылка ведёт в интернет магазин, а глав усё равно нема. И кстати нифига не правда, что AS1 классы не работает в МХ2004. Я в своё время столкнулся с проблемой - перекомпилировал старый fla(v5) файл в MX2004. И ОНО перестало работать. Чуть позже, когда я внимательно посмотрел на свой код допёр, что там регистры разные. В AS1 это никакой роли не играет, а вот в 2... %)
Люди, у меня диск к книге сгорел - у кого-нить есть исо, или ещё что-нибудь?
а кое где ее можно нахалява скачать!!!
Народ а есть у кого-нибудь к этой книге cd. Выложите пожалуйста