Просмотр полной версии : Битва гигантов: AVM1 vs. AVM2. Спешите видеть! Только у нас!
BlooDHounD
28.06.2008, 02:42
да. есть. особенно радует реализация инкапсуляции. а ещё больше меня радует реализация полиморфизма. 2 программера "поймут" друг друга обменявшись АС1 кодом. ага. там "очень наглядно" эти принципы передаются.
Chas:
Ну это всего 5 месяцев рабочего времени... чесно говоря я не думаю, что в Максе это было бы на много быстрее... Как ни странно... я даж не знаю, может это дань традиции или может есть какие-то другие причины, но почему-то принято делать такие вещи вручную. Когда учился в академии - часто заглядывал к промышленному дизайну (сосед по комнате там учился), ну и немного был знаком с тамошними преподавателями. Один из них работал какое-то время в Тойоте, так вот не смотря на то, что естесственно, все машинки моделируют на компьютере и технологии там самые что ни на есть передовые - все равно подачи такого плана рисуются. Так что, картинки потрясные, но пример не совсем в тему =) Я более чем уверен, что у тех, кто проектировал все это было в Каде / Солидворкс или еще чем =) Более того, художник, скорее всего пользовался рендерами из этих редакторов.
KidsKilla
28.06.2008, 10:32
BlooDHounD что не устраивает в инкапсуляции? создавай переменную со своей объастью видимости, будет тебе инкапсуляция. а тот факт, что паблики можно поудалять к черту -- так это вопрос организации кода. про аспект-ориентированое программирование слышал? оно, кстати, решает некоторые проблемы ооп (например, логирование).
†‡Paladin‡†
28.06.2008, 12:49
про аспект-ориентированое программирование слышал? оно, кстати, решает некоторые проблемы ооп (например, логирование).
Какой молодец слышал про АОП. Давай рассказывай про метаязыки что-ли и как плохо что их поддержка не добавлена в avm1.
BlooDHounD
28.06.2008, 13:35
KidsKilla, собственно в АС1 все методы паблики :)
chingachgoog
28.06.2008, 21:44
представь себе проект на 100000+ строк...над которой трудятся несклько флэшеров? ...без ООП и нормального редактора кода, дебаггера и т.д. тут никак.
...для каждой работы есть свой инструмент. Когда нужно собрать "мультик", я воспользуюсь AS1-2. Если нужен быстрый 3д-движок, буду копаться в байт-коде, оптимизируя каждую мелочь. Если это игрушка класса TimeZero/Dofus - без ООП, AS3 - тяжело.
Парни, ну наконец-то вы со мной согласились :)
Только зачем повторять то, что я писал выше?
KidsKilla, собственно в АС1 все методы паблики
Это не совсем так (все же не знает народ AS1 :) )
BlooDHounD
29.06.2008, 01:07
chingachgoog, О! великий АС1-гуру поведуйте мне, как сделать метод приватным.
var d:String = "bla-bla" //приватное свойство
var e:Boolean;
//конструктор класса
function Class1(a, b){
var c:Number = 1;//приватное свойство
this.a = a;//паблик свойство
this.b = b;//паблик свойство
this.e = e;//паблик свойство
}
А в чем проблема то? А есть еще и ASSetPropFlags().
BlooDHounD
29.06.2008, 11:32
riden, где тут приват? тут мешанина с областью видимости.
ASSetPropFlags - точно! как я мог забыть этот "чудо метод, описанный во всех спецификациях языка"?
кстати, давно этот метод начал запрещать вызывать "другие методы"?
Да что не понятно?... Локальная переменная - это и есть приват-свойство. Функция - будет локальным методом. А если функцию присвоить свойству класса (this.prop), тогда это уже будет паблик метод.
Да что не понятно... Локальная переменная - это и есть приват-свойство.
И как вы эту «приватную» переменную будете использовать в других методах? И с чего вы взяли, что переменная, объявленная вне «конструктора» вашего чудо-класса на AS1 будет приватной?
И как вы эту «приватную» переменную будете использовать в других методах?
pvar2 используется "в других методах".
var pvar1:String; pvar1 = "bla-bla";//приватное свойство
var e:Boolean; e=true;
var g:Number;g=4;
//конструктор класса
function Class1(a, b){
var pvar2:Number; pvar2 =1;//приватное свойство
function pMet(){}//приватный метод
function pmet1(){
// pvar2 доступна в паблик методе
}
this.a = a;//паблик свойство
this.b = b;//паблик свойство
this.e = e;//паблик свойство
this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод, свойство по ссылке
Class1.prototype.met3 = pmet1;// создание метода через прототип, внутри тела класса
}
function pmet2(){
// если нужна функция вне конструктора...
// хотя она уже не будет копироватся вместе с объектом (новым экземпляром), на нее будут ссылатся свойства класса.
//доступно приват свойство pvar1
}
Class1.f="static prop" // статическое свойство
Class1.prototype.g=g; // свойство по ссылке, наследуется подклассами
И с чего вы взяли, что переменная, объявленная вне «конструктора» вашего чудо-класса на AS1 будет приватной?
pvar1 - для функций вне "тела класса". Она приватная для класса Class1. Но ведь не обязательно функцию вне класса писать (а значит и переменные). Ведь в AS1 - функция - это и есть объект активации, играет роль и конструктора и тела класса. Так что не вижу противоречий.
var ob = new Class1(2,3);
///traces
trace(ob.a);//2
trace(ob.e);//true
trace(ob.pvar2);//undefined - нет такого свойства у класса
trace(ob.pvar1); //undefined - нет такого паблик свойства
trace(ob.met3); //[type Function] - паблик метод: свойство созданное в прототипе,
//в теле класса и ссылающееся на локальную функцию
riden, что за ерунду вы написали?
riden, ваше pvar1 и не принадлежит классу вовсе, это внешняя переменная и уж точно не приватная. И с какого перепугу у вас метод вдруг стал приватным, когда вы его потом пабликом делаете?
2 iNinls
Не ерунда. pvar2 (посмотрите в коде) - будет "приватным свойством" в смысле AS3 (то есть свойство которое видно, только в теле класса и не видно вне класса). В AS2 private = protected AS3.
2 __etc
Не принадлежит, но доступно ее использование в теле класса. Ладно, забили на pvar1, смотрте на pvar2.
с какого перепугу у вас метод вдруг стал приватным, когда вы его потом пабликом делаете
С того, что любая локальная функция пока не будет присвоено свойству класса в AS1 не сможет стать методом (то есть паблик). Где стал приватным? Это разные методы
function pMet(){}//приватный метод
function pmet1(){
// pvar2 доступна в паблик методе
}
this.met1=pmet1;//паблик метод, свойство по значению
Не ерунда. pvar2 (посмотрите в коде)Я не буду смотреть, после моего сообщения вы уже 7 раз отредактировали текст своего :D
В AS2 private = protected AS3.
Обычный public.
Ладно, забили на pvar1, смотрте на pvar2.
Это единственное, что более менее попадает под понятие приватности. Только она тоже не принадлежит вашему экземпляру.
С того, что любая локальная функция пока не будет присвоено свойству класса в AS1 не сможет стать методом (то есть паблик).
А работать с ней как тогда? Нет, конечно, есть шаманства с call и apply в своей области видимости, но опять же, такой метод не принадлежит вообще никому.
А ваш met1 — обычная ссылка на ваш «приватный» метод, вызвать по этой ссылке ваш метод может кто угодно и откуда угодно.
И перестаньте редактировать по 10 раз посты, сначала вы одно пишете, потом другое.
2 iNils
Код я практически не редоктировал. Надо было внимательно смотреть. Там две "приватные" переменные, так что смысл с самого начала сохранялся.
2 __etc
Это единственное, что более менее попадает под понятие приватности. Только она тоже не принадлежит вашему экземпляру.
А зачем он должен принадлежать экземпляру? (Кстати как вы это узнали? поверю вам на слово). Когда вы создадите экземпляр, то в другом теле класса будут доступны только паблик.
А работать с ней как тогда?
Так же как и с приватным методом в теле класса (напомню, тело функции == тело класса в АС3, функция внутри функции == приватная функция АС3)
А зачем он должен принадлежать экземпляру? (Кстати как вы это узнали? поверю вам на слово).
Я не могу написать this.pvar1.
Так же как и с приватным методом в теле класса (напомню, тело функции == тело класса в АС3, функция внутри функции == приватная функция АС3)
Ага, только вам придется для вызова этого метода воспользоваться call или apply, чтобы не светить вашим «приватным» методом наружу. Очень технологично.
А главное, непонятно, все ваши извращения автоматически реализует компилятор в AS2, но вы уперлись и использовать его не хотите…
2 __etc
главное, непонятно, все ваши извращения автоматически реализует компилятор в AS2, но вы уперлись и использовать его не хотите…
Это вы счас с кем говорите?
Я давно уже сижу на АС3.
Про АС1 вспомнил, так как я прогю в синтаксисе java-script на Директоре 10. Хоть какое-то более-менее божеское ООП, в бэйсико-подобный Lingo не хочу лезть (11 еще не скачивал, не знаю что там с языком).
Я давно уже сижу на АС3.
Ах, извините, таких подробностей я не знал…
Про АС1 вспомнил, так как я прогю в синтаксисе java-script на Директоре 10. Хоть какое-то более-менее божеское ООП, в бэйсико-подобный Lingo не хочу лезть (11 еще не скачивал, не знаю что там с языком).
Так вы так пишете из-за того, что у вас просто нет нормального языка, а вот наш краснокожий индеец делает это специально из принципа.
А ваш met1 — обычная ссылка на ваш «приватный» метод, вызвать по этой ссылке ваш метод может кто угодно и откуда угодно.
Не верно - met1 - паблик метод.
А вот pMet - приватный метод, и его никак не вызвать. Читайте же внимательно. #262 (http://www.flasher.ru/forum/showpost.php?p=748610&postcount=262)
В остальном вроде все понятно. Функция АС1 (Class1) == тело класса в АС3, функция внутри функции (pMet) == приватный метод в АС3. Поэтому вопрос "А работать с ней как тогда?" - не уместен.
Свойство (met1) которое ссылается на функцию (pmet1) - паблик метод. Локальная функция(на которую нет ссылки свойства класса) - приват метод. Все функции и переменные распологаются в теле класса(функции) (хотя не обязательно).
Так что public и private AS3, полностью реализуемы в AS1.
Есть принципиальная разница между локальными функциями и приватными свойствами класса - то, что вы описали, это локальная функция, ее область видимости не совпадает с обласью видимости класса.
function TClass () {
function toBePrivate () { trace("Should be TClass: "+ this) };
this.toString = function () { return "[TClass]" };
this.callPrivateMethod = function() {toBePrivate()};
}
var t = new TClass();
trace(t);
t.callPrivateMethod();
[TClass]
Should be TClass: undefined
Кроме того, эта функция не будет доступна другим паблик методам класса объявленным на прототипе - это так же не является правильным поведением приватного метода.
function TClass () {
function toBePrivate () { trace("Should be TClass: "+ this) };
....................................
function TClass () {
var d = this
function toBePrivate () { trace("Should be TClass: "+ d) };
this.toString = function () { return "[TClass]" };
this.callPrivateMethod = function() {toBePrivate()};
}
var t = new TClass();
trace(t);
t.callPrivateMethod();
//trace
/*
[TClass]
Should be TClass: [TClass]
*/
Работает. Не понял, что вы хотели написать. this - это указатель на объект активации. В вашем случае, такой объект - function toBePrivate. Ну и где вы создаете ее экземпляр? Не создаете?, тогда что вы хотите получить от this?
Ок, пользуясь вашей терминологией - объект активации приватного метода обязан быть классом, к которому этот метод принадлежит, иначе это не приватный метод. В ситуации вами описанной этого не проиcxодит, что мой пример и демонстрирует.
То что вы трейсите другую локальную переменную - не имеет к смыслу вопроса никакого отношения. Т.как значение этой локальной переменной можно изменить, а область видимости метода изменить нельзя - в этом разница.
Ок, пользуясь вашей терминологией - объект активации приватного метода обязан быть классом, к которому этот метод принадлежит, иначе это не приватный метод. В ситуации вами описанной этого не проиcxодит, что мой пример и демонстрирует.
Зачем вам из метода делать класс?
Нет, я такого не говорю. Я вам обяснил смысл this в AS1. Объяснил почему вы получаете undefined, ведь эта функция не является классом грубо говоря. Не происходит создание экземпляра.
обязан быть классом, к которому этот метод принадлежит, иначе это не приватный метод
Не могу понять, извините. Классом к которому этот метод принадлежит? То есть два класса одинаковых? Как вы себе это придставляете?
Добавлено в 16:48
Короче говоря, у каждой функции свой this, по этому вы получаете undefined. Область видимости локальной функции распространяется на все тело класса и даже более. Но в объектном программировании этого "более" не нужно.
Не верно - met1 - паблик метод.
А вот pMet - приватный метод, и его никак не вызвать. Читайте же внимательно. #262 (http://www.flasher.ru/forum/showpost.php?p=748610&postcount=262)
И где там работа с этим методом, какая у него область видимости, где его вызовы?
Свойство (met1) которое ссылается на функцию (pmet1) - паблик метод.
Значит я могу вызвать ваш приватный метод извне, так ведь? У меня есть ссылка (met1 на pmet1) на него, снаружи. Значит это уже не приватный метод.
Именно не приватный. Приватным является метод (функция) pMet. Посмотрите еще раз. Ну и надеюсь вам известен смысл приватности в АС3...
Именно не приватный. Приватным является метод (функция) pMet. Посмотрите еще раз. Ну и надеюсь вам известен смысл приватности в АС3...
Прочитайте мои два вопроса ещё раз и дайте мне на них ответы. То, что вы написали — не ответ.
riden:
Вы предложение с начала прочитайте, подумайте больше 5 минут, а потом пишите ответ... вы путаете подлежащее и обстоятельство места.
И где там работа с этим методом, какая у него область видимости, где его вызовы?
Работа с этим "методом", функцией осуществляется в теле класса (функции). Он анологичен по назначению private function в AS3, которая видна только в теле класса.
Значит я могу вызвать ваш приватный метод извне, так ведь? У меня есть ссылка (met1 на pmet1) на него, снаружи. Значит это уже не приватный метод.
Именно потому что вы имеете ссылку, этот метод паблик.
Добавлено в 17:03
2 wvxvw: Вам я уже сказал, что выиспользуете this для другой функции, поэтому и получаете undefined. Такде я расписал вам смысл this в AS1.
Работа с этим "методом", функцией осуществляется в теле класса (функции). Он анологичен по назначению private function в AS3, которая видна только в теле класса.
Покажите пример работы с этим методом.
Именно потому что вы имеете ссылку, этот метод паблик.
Следовательно, метод не является приватным, потому что он торчит наружу. По ссылке или нет, без разницы, с тем же успехом можно было написать this.privateMethod = function() {}.
riden:
Вы не поняли вопрос и упорно отвечаете на вопрос, который вам никто не задавал, игнорируя действительно заданый.
Представьте себе, что метод, это такая функция область видимости которой обязана совпадать с областью видимости объекта, чьим методом она является - что либо не удовлетворяющее условиям выше приведенного тезиса не может считаться методом. То что вы написали не соответствует определению метода - и поэтому не может быть ни приватным ни паблик методом, вообще никаким. Для етого явления существует другое понятие его описывающее - локальная функция.
__etc pMet,pmet1 - две разные функции. У вас что глаз нету? Пост 262 прочитайте.
При этом вы получаете доступ к pmet1, через свойство met1. Но pMet - остается приватным. То есть - он виден только в теле класса.
__etc pMet,pmet1 - две разные функции. У вас что глаз нету? Пост 262 прочитайте.
При этом вы получаете доступ к pmet1, через свойство met1. Но pMet - остается приватным. То есть - он виден только в теле класса.
Боже мой, вы читаете мои посты вообще или нет? Покажите мне пример работы с методом pMet в теле класса. Не простого объявления локальной функции (чем и является pMet), а именно работа с этим методом.
А pmet1 у вас не есть приватный, это мы уже выяснили.
2 wvxvw
Функция имеет область видимости класса. То чты вы напсали в начале - непонять для чего. Это по причине того что вы не пониматете что такое this. Вызывате this локальной функции, ну и конечно получаете undefined.
Простите... вы не понимаете, что вы пишите... область видимости pMet и Class1 не совпадают. Но вы это оспариваете в первом предложении, а во втором с этим соглашаетесь.
2 __etc:
function Class1(a){
var pvar2:Number;//приватное свойство
this.a = a;//паблик свойство по значению
//приватный метод
function pMet(){
return Math.random()*a;
}
//паблик метод
function pmet1(){
return "Вот так я работаю "+pMet();
}
this.met1=pmet1;//паблик метод, свойство по значению
}
////////////////////////////////////////
var obj = new Class1(2);
trace(obj.met1()); //Вот так я работаю 0.312059603631496
2 wvxvw:
Добавлено в 16:48
Короче говоря, у каждой функции свой this, по этому вы получаете undefined. Область видимости локальной функции распространяется на все тело класса и даже более. Но в объектном программировании этого "более" не нужно.
Вы трэйсите this не TClass, а toBePrivate. То есть вы хотите узнать видимость "внутри" toBePrivate? this - не для этого служит. Для чего он служит в AS1 я уже писал.
2 __etc
//конструктор класса
function Class1(a){
var pvar2:Number;//приватное свойство
this.a = a;//паблик свойство по значению
//приватный метод
function pMet(){
return Math.random()*a;
}
//паблик метод
function pmet1(){
return "Вот так я работаю "+pMet();
}
this.met1=pmet1;//паблик метод, свойство по значению
}
////////////////////////////////////////
var obj = new Class1(2);
trace(obj.met1()); //Вот так я работаю 0.312059603631496
То, что вы написали — использование локальной функции, это вовсе не метод. Поставьте трейc this внутри вашего метода и посмотрите, что он вам вернет.
//конструктор класса
function Class1(a){
var pvar2:Number;//приватное свойство
this.a = a;//паблик свойство по значению
//приватный метод
function pMet(){
trace('я есть приватный метод класса '+this); // я есть приватный метод класса undefined
return Math.random()*a;
}
//паблик метод
function pmet1(){
return "Вот так я работаю "+pMet();
}
this.met1=pmet1;//паблик метод, свойство по значению
}
////////////////////////////////////////
var obj = new Class1(2);
trace(obj.met1()); //Вот так я работаю 0.312059603631496
2 wvxvw:
Вы трэйсите this не TClass, а toBePrivate. То есть вы хотите узнать видимость "внутри" toBePrivate? this - не для этого служит. Для чего он служит в AS1 я уже писал.
Если область видимости одинаковая у двух объектов - this у этих двух объектов обязан указывать на один и тот же объект - это азы понимания ОО. Вы спорите с аксиомами...
Поставьте трейc this внутри вашего метода и посмотрите, что он вам вернетДа вы что все сговорились?
Еще раз... процетирую себя:
this - это указатель на объект активации. В вашем случае, такой объект - function toBePrivate. Ну и где вы создаете ее экземпляр? Не создаете?, тогда что вы хотите получить от this?
function toBePrivate замените на function pMet
Да вы что все сговорились?
Еще раз... процетирую себя:
function toBePrivate замените на function pMet
Да что вы говорите? А в AS3 трейс this в приватном методе на кого ссылку выдает? Правильно, на экземпляр этого класса. А у вас вообще метод в анонимной области вызывается и совсем не принадлежит экземпляру. Т.е. опять же, это не приватный метод, а локальная функция, коей и была всю дорогу.
Если уж вы так не соглашаетесь относительно this, то расскажите (точнее, покажите) мне, каким образом я могу работать с публичными переменными данного класса внутри приватного метода pMet?
Если область видимости одинаковая у двух объектов - this у этих двух объектов обязан указывать на один и тот же объект - это азы понимания ОО. Вы спорите с аксиомами...
Азы? Где же вы такое прочитали?
АС3 я знаю, не надо мне про "Азы" говорить.
Что бы обратится к приватному свойству/методу в AS1 мне достаточно обратится к локальной переменной/функции.
В AS1 совершенно другое значение функции, более широкое. У каждой функции свой this. Так что, что вы мне свою пургу несете про "азы". Вы будите мне доказывать, что прототипное ООП - вовсе не ООП?
AS1 очень гибок это факт. А AS3 очень эффективен.
2 __etc
Если уж вы так не соглашаетесь относительно this, то расскажите (точнее, покажите) мне, каким образом я могу работать с публичными переменными данного класса внутри приватного метода pMet?
Хватит меня напрегать, если не знаете, полно литературы по АС1 :)
Как?
var pa;
this.a = 34;
pa = this.a;
function pMet(){
trace(a); // первый способ
trace(pa); // второй способ
}
Хватит меня напрегать, если не знаете, полно литературы по АС1 :)
А, я уже вас напрягаю? Т. е. все-таки что-то не так? :quiet:
Давайте расставим все точки над i, не уходите от разговора:
Как?
var pa;
this.a = 34;
pa = this.a;
function pMet(){
trace(a); // первый способ
trace(pa); // второй способ
}
Ага, как мне изменить значение публичной переменной «a» в приватном методе pMet? Мне же не просто надо смотреть на переменную, а ещё и изменять её.
Да вы что все сговорились?
Вот именно :D все сговорились и решили называть функцию с той же областью видимости, что и объект, в котором она была создана, методом. А вы как-то пропустили этот момент =)
Т.е. посмотрите на это так:
существует класс Функция, он может быть использован, как метод другого класса, но не обязан. Метод обязан быть функцией. Из этого следует, что не все функции - методы, но все методы - функции.
То что вы создали не является методом, потому что не соответствует определению метода, но является функцией. Чтобы эта функция была методом она должна соответствовать следующим условиям:
- она должна быть доступна любому другому методу объекта, чьим методом она является. (Ваша функция этому требованию не соответствует, т.как методы объявленные на прототипе класса не смогут к ней обратиться).
- она должна быть в состоянии обратиться к любому другому методу класса, чьим методом она является. (Ваша функция не соответствует этому требованию, т.как любой метод / свойство объявленное после ее оъявления будут ей недоступны).
Вот именно :D все сговорились и решили называть функцию с той же областью видимости, что и объект, в котором она была создана, методом. А вы как-то пропустили этот момент =)
Т.е. посмотрите на это так:
существует класс Функция, он может быть использован, как метод другого класса, но не обязан. Метод обязан быть функцией. Из этого следует, что не все функции - методы, но все методы - функции.
То что вы создали не является методом, потому что не соответствует определению метода, но является функцией. Чтобы эта функция была методом она должна соответствовать следующим условиям:
- она должна быть доступна любому другому методу объекта, чьим методом она является. (Ваша функция этому требованию не соответствует, т.как методы объявленные на прототипе класса не смогут к ней обратиться).
- она должна быть в состоянии обратиться к любому другому методу класса, чьим методом она является. (Ваша функция не соответствует этому требованию, т.как любой метод / свойство объявленное после ее оъявления будут ей недоступны).
Я бы ещё добавил, что все методы должны объекта иметь ту же область видимости, что и сам объект.
Чтобы эта функция была методом она должна соответствовать следующим условиям:
- она должна быть доступна любому другому методу объекта, чьим методом она является. (Ваша функция этому требованию не соответствует, т.как методы объявленные на прототипе класса не смогут к ней обратиться).
- она должна быть в состоянии обратиться к любому другому методу класса, чьим методом она является. (Ваша функция не соответствует этому требованию, т.как любой метод / свойство объявленное после ее оъявления будут ей недоступны).
function Class1(){
var pat;
this.at=34;
pat = this.at;
//приватный метод
function pMetA(){
trace(pat); // использует паблик свойство по ссылке
}
//приватный метод
function pMetB(){
pmet2; //использует паблик метод объявленный "после", требование 2 исчерпано
}
//паблик методы
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}
this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод объявленный после
Class1.prototype.met3 = pmet1; // требование 1 исчерпано
}
////////////////////////////////////////
var obj = new Class1();
obj.met2(); //do pmet2
obj.met3(); //34
Добавлено в 18:59
2 __etc:
Ага, как мне изменить значение публичной переменной «a» в приватном методе pMet? Мне же не просто надо смотреть на переменную, а ещё и изменять её.
Используй prototype. Вы не программировали на AS1?
// использует паблик свойство по ссылке
}
Вы уверены? ;)
Дождусь ли я когда-нибудь кода, в котором приводится не простой трейс, а изменение значения публичной переменной?
Используйте prototype. Вы не программировали на AS1?
Используйте prototype. Вы не программировали на AS1?
Я в свое время написал килотонны AS1, разговор не об этом. Я-то знаю, что хочу и как оно должно выглядеть, но я хочу получить это от вас, в виде рабочего кода, а не подобные ответы.
Убедится в обратном очень легко =)
function Class1(){
var pat;
this.at = 34;
pat = this.at;
//приватный "метод" <- ремарка моя
function pMetA(){
trace(pat); // использует паблик свойство по ссылке
}
this.callPrivateMethod = function() {
pMetA();
}
}
var c = new Class1();
c.callPrivateMethod(); // output: 34
c.at = 0;
c.callPrivateMethod(); // output: 34
значение публичного свойства поменялось, а приватный "якобы метод" это не заметил =)
Убедится в обратном очень легко =)
Ты все испортил! :(
Хотя нет, ещё не все, пока не будет кода.
2 etc
function Class1(){
var pat;
this.at=34;
pat = this.at;
//приватный метод
function pMetA(){
trace(pat); // использует паблик свойство по ссылке
}
function pMetB(){
pmet2; //использует паблик метод объявленный "после", требование 2 исчерпано
}
//паблик методы
//метод изменяет свойство класса
function pmet1(){
pMetA();
Class1.prototype.propFor__etc = "not more __etc";
}
function pmet2(){
trace("do pmet2");
}
this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод объявленный после
Class1.prototype.met3 = pmet1; // требование 1 исчерпано
Class1.prototype.propFor__etc="for_etc"; //создаем паблик свойство
}
////////////////////////////////////////
var obj = new Class1();
obj.met2();//do pmet2
obj.met3(); //34
trace(obj.propFor__etc);//for_etc
obj.met1();
trace(obj.propFor__etc);//not more __etc
в свое время написал килотонны AS1, разговор не об этом. Я-то знаю, что хочу и как оно должно выглядеть, но я хочу получить это от вас, в виде рабочего кода, а не подобные ответы.
Тогда в чем дело? Зачем меня то напрягать?
Тогда в чем дело? Зачем меня то напрягать?
Ну вы же заявили о приватных свойствах и методах, вот я и пытаюсь получить от вас их получить в виде кода.
А код, что вы привели, дважды вывел у меня "no more __etc" (странно, с чего бы это?). А ещё, что будет, если экземпляров этого класса аж две шутки будет? Вы вместо исправления проблемы, породили с помощью prototype ещё целую кучу.
Убедится в обратном очень легко =)
function Class1(){
var pat;
this.at = 34;
pat = this.at;
//приватный "метод" <- ремарка моя
function pMetA(){
trace(pat); // использует паблик свойство по ссылке
}
this.callPrivateMethod = function() {
pMetA();
}
}
var c = new Class1();
c.callPrivateMethod(); // output: 34
c.at = 0;
c.callPrivateMethod(); // output: 34
значение публичного свойства поменялось, а приватный "якобы метод" это не заметил =)
Я опроверг два твоих "требования". А здесь я так и пишу, что pat - ссылка. Тяжело тект воспринимать, да?
Я опроверг два твоих "требования". А здесь я так и пишу, что pat - ссылка. Тяжело тект воспринимать, да?
А давайте на личности не будем переходить?
Был бы ваш pat ссылкой, второй вызов метода вывел бы верное значение, т. е. 0.
2 etc потому что там куча лишнего кода, уберите лишний трейс. Метод met1 вызывается два раза. Этот код на все случаи жизни, на требования которыми в меня напрягли сегодня.
Был бы ваш pat ссылкой, второй вызов метода вывел бы верное значение.
Ну я сказал, что надо использовать прототип.
2 etc потому что там куча лишнего кода, уберите лишний трейс. Метод met1 вызывается два раза. Этот код на все случаи жизни, на требования которыми в меня напрягли сегодня.
Чтобы больше не напрягаться, просто скажите, что вы не знаете, как сделать псевдо-приватность на AS1 и все тихо разойдутся.
Прототип ваш не поможет, ибо экземпляров Class1 может быть больше одного.
Какие еще вопросы? Видимость есть, обращение есть, наследование есть... что еще надо то?
Какие еще вопросы? Видимость есть, обращение есть, наследование есть... что еще надо то?
Приватные методы хочу. Покажите и чтобы ещё работали нормально. Или честно скажите, что не знаете.
2 __etc
function Class1(){
// приват метод
function pMetA(){
pmet2; //использует паблик метод объявленный "после", требование 2 wxvxw исчерпано
}
function pMetB(){
Class1.prototype.propFor__etc = "not more __etc"; // приватный метод изменяет паблик свойство
}
//паблик методы
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}
function pmet3(){
pMetB();
}
this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод объявленный после
Class1.prototype.met3 = pmet3; // требование 1 wxvxw исчерпано, метод в прототипе
Class1.prototype.propFor__etc="for_etc"; // паблик свойство по ссылке, наследуется подклассами
}
////////////////////////////////////////
var obj = new Class1();
//obj.met2();//do pmet2
//obj.met3();
trace(obj.propFor__etc);//for_etc
obj.met3();
trace(obj.propFor__etc);//not more __etc
2 __etc
function Class1(){
// приват метод
function pMetA(){
pmet2; //использует паблик метод объявленный "после", требование 2 wxvxw исчерпано
}
function pMetB(){
Class1.prototype.propFor__etc = "not more __etc"; // приватный метод изменяет паблик свойство
}
//паблик методы
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}
function pmet3(){
pMetB();
}
this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод объявленный после
Class1.prototype.met3 = pmet3; // требование 1 wxvxw исчерпано, метод в прототипе
Class1.prototype.propFor__etc="for_etc"; // паблик свойство по ссылке, наследуется подклассами
}
////////////////////////////////////////
var obj = new Class1();
//obj.met2();//do pmet2
//obj.met3();
trace(obj.propFor__etc);//for_etc
obj.met3();
trace(obj.propFor__etc);//not more __etc
Ну да :)
Шах:
//конструктор класса
function Class1() {
// приват метод
function pMetA() {
pmet2;//использует паблик метод объявленный "после", требование 2 wxvxw исчерпано
}
function pMetB() {
Class1.prototype.propFor__etc = "not more __etc";// приватный метод изменяет паблик свойство
}
//паблик методы
function pmet1() {
pMetA();
}
function pmet2() {
trace("do pmet2");
}
function pmet3() {
pMetB();
}
this.met1 = pmet1;//паблик метод, свойство по значению
this.met2 = pmet2;//паблик метод объявленный после
Class1.prototype.met3 = pmet3;// требование 1 wxvxw исчерпано, метод в прототипе
Class1.prototype.propFor__etc = "for_etc";// паблик свойство по ссылке, наследуется подклассами
}
////////////////////////////////////////
var obj = new Class1();
//obj.met2();//do pmet2
//obj.met3();
trace(obj.propFor__etc);//for_etc
obj.met3();
trace(obj.propFor__etc);//not more __etc
o = new Class1();
trace(o.propFor__etc); // for_etc, ok
trace(obj.propFor__etc); // for_etc, WTF?? Что-то не так ;)
:quiet:
А так прокатит?
function Class1(){
// приват метод
var pa = this;//ссылка
this.a = 4;
//приват метод изменяте паблик свойство
function pMetA(){
pa.a=10;
}
function pMetB(){
Class1.prototype.propFor__etc = "not more __etc"; // приватный метод изменяет паблик свойство
}
//паблик методы
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}
function pmet3(){
pMetB();
}
this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод объявленный после
this.met3=pmet3;
Class1.prototype.met4 = pmet1; // требование 1 wxvxw исчерпано, метод в прототипе
Class1.prototype.propFor__etc="for__etc"; // паблик свойство по ссылке, наследуется подклассами
}
////////////////////////////////////////
var obj = new Class1();
var obj1 = new Class1();
trace(obj.a);//4
obj.met1();
trace(obj.a);//10
trace(obj1.a);//4
obj1.met1();
trace(obj1.a);//10
chingachgoog
29.06.2008, 22:25
chingachgoog, О! великий АС1-гуру поведуйте мне, как сделать метод приватным.
BlooDHounD, вы крайне невнимательны. Я сказал, что считать, что все методы в AS - паблики - это не верно. Но я не говорил, что научу ваc делать приватные методы на AS1.
Однако. Есть простой способ, сделать метод недоступным ниоткуда, кроме как из своего класса (экземпляра класса).
Тут выше, правда, тут же начали возмущаться, что это не приватный метод, т.к.:
- он ведет себя не как в AS3
- функция - это не метод :)
- this ОБЯЗАН указывать на один и тот же объект...
- и собственно вообще, нормально рабочие приватные методы - это как в AS3
Меня такой разговор удивляет. Есть способ сделать метод доступным только из данного класса. Есть или нет? Есть.
Вы можете такой метод назвать хоть валенком - кто против? Разве изменит это тот факт (который так неохото признать некоторым), что AS1 - это язык ООП? Не изменит. Гурский вообще прямо пишет, что объявление функции внутри другой функции - один из ходов ООП.
__etc пишет, что хочет "нормально работающих приватных методов". Позвольте спросить, в чем их "нормальность"? И самое главное - для КАКОЙ ЦЕЛИ их сделали приватными? Последнее важно. Ведь если мы достигнем цели, значит метод (пусть с презрением трижды обозванный "псевдо") существует и эффективен.
Не прокатит, pa — ссылка на самого себя, зачем вам ещё одна? И функции методами от этого не стали.
__etc пишет, что хочет "нормально работающих приватных методов". Позвольте спросить, в чем их "нормальность"? И самое главное - для КАКОЙ ЦЕЛИ их сделали приватными? Последнее важно. Ведь если мы достигнем цели, значит метод (пусть с презрением трижды обозванный "псевдо") существует и эффективен.
Кто-то недавно заявлял, что приваты есть и все прекрасно. Но что-то пока не очень прекрасно. Сказали, что есть классы, сказали, что есть и приваты. Ну и я вижу пока потуги уже на третьей или четвертой странице подряд в реализации оных.
Не прокатит, pa — ссылка на самого себя, зачем вам ещё одна? И функции методами от этого не стали.
Как зачем, что бы иметь доступ к классу, к объекту активации. Я же говорил, что у каждой функции в AS1 свой this, функция имеет тут более широкое значение. Поэтому использование ссылки - вполне уместно.
И функции методами от этого не стали
Однако работает. И мы имеем приватные и паблик свойства (методы).
Я же говорил, что у каждой функции в AS1 свой this, функция имеет тут более широкое значение. Поэтому использование ссылки - вполне уместно.
Вполне неуместно, это ж надо такое придумать, ссылку на самого себя? Зачем, если есть this? Про «свой this» бросьте, вы просто так и не сделали из функций методы.
Однако работает. И мы имеем приватные и паблик свойства (методы).
Угу. И разные способы доступа к этим приватам, причем надо постоянно в голове держать, где можно использовать this, а где нельзя.
Зачем, если есть this?
Потому что AS1 это AS1, он ближе к функциональному программиованию. И this ссылается на объект активации, функции. У каждой функции свой this - это указатель на экземпляр "себя".
Угу. И разные способы доступа к этим приватам, причем надо постоянно в голове держать, где можно использовать this, а где нельзя.
Что держать в голове? Если вы в локальной функции - то используйте ссылку, если в теле класса - this.
Потому что AS1 это AS1, он ближе к функциональному программиованию.
Ну так вот и не нужно придумывать подобных костылей и не выпендриваться.
А вообще, можно и без ссылки обойтись, подложив другой костыль, он мне больше нравится, но все примеры кода, которые тут были приведены на последних четырех-пяти страниц ярко иллюстрируют пример того, как делать не надо.
Я вообще не понимаю, ради писанины в кадрах люди предпочитают так извращаться и контролировать процесс, чтобы не дай бог, что-нибудь рассыпется. Я уже не говорю, что эти приватные методы каждый раз создаются заново и жрут память.
И this ссылается на объект активации, функции. У каждой функции свой this - это указатель на экземпляр "себя".
Да нет у простых локальных функций this, господи. arguments.callee — вот ссылка на функцию. А this — ссылка на область видимости.
Я опроверг два твоих "требования". А здесь я так и пишу, что pat - ссылка. Тяжело тект воспринимать, да?
нет, не опровергли ни одно.
Ссылка, это когда обращение к ссылке == обращение к самому объекту. То, что вы создали - это копия, а не ссылка =)
т.е. ссылка:
var a:Object = {prop:0};
var b = a;
b.prop = 1;
trace(b.prop == a.prop);
копия:
var a:Object = {prop:0};
var b = {};
for (vat i in a){
b[i] = a[i];
}
b.prop = 1;
trace(b.prop == a.prop);
Следовательно, обратится к другому свойству вы не смогли.
Тут выше, правда, тут же начали возмущаться, что это не приватный метод, т.к.:
- он ведет себя не как в AS3
- функция - это не метод
- this ОБЯЗАН указывать на один и тот же объект...
- и собственно вообще, нормально рабочие приватные методы - это как в AS3
Все эти доводы придуманы не мной и не какой-то группой отщепенцев-подрывников мировых устоев. Это общепринятые соглашения среди разработчиков большинства современных языков програмирования. Тут, у вас могут быть свои взгляды, и вы можете решить, что вам удобнее теплое называть холодным, но тогда наш разговор потеряет всякий смысл, потому что вы наотрез отказываетесь пользоваться тем же языком, или по крайней мере переводом...
Да нет у простых локальных функций this, господи. arguments.callee — вот ссылка на функцию. А this — ссылка на область видимости.
function Class1(){
this.a=1;
trace (this); //[object Object]
function localFunc(){
this.b=2
trace(this);//this получает ссылку в момент создания экземпляра
//Выводит [type Object]
trace(this.a); //undefined
trace(this.b); //2
}
localFunc();
//this.met = localFunc;
}
//Class1();
var c = new Class1();
//c.met();
/*Выводит:
[object Object] - ссылка на объект с
[type Object] - ссылка на localFunc() (я так думаю)
undefined - нет такого свойства в объекте
2
*/
Да this ссылается на область видимости. Но функция АС1 != класс AC3.
this - это указатель, который служит для создания свойств в "объекте" - то есть на то что указывает (область видимости): диаграмма, клип или пустой объект. Если объект не создан, то - undefined
Но функция АС1 != класс AC3.
Я бы даже сказал «функция АС1 != класс», что, собственно, и требовалось доказать. Хотите, конечно, называйте классами, если так удобно.
2 wvxvw:
Хорошо... #316 (http://www.flasher.ru/forum/showpost.php?p=748723&postcount=316) - это вас устраивает?
А два ваших требования - опровержимы (я это показал). this? Что вы так заморачиваетесь? AS1 - это prototype-based OOP, и это не я придумал. И я здесь не защищаю AS1 или умоляю AS3... я просто за честность.
chingachgoog
29.06.2008, 23:27
Кто-то недавно заявлял, что приваты есть и все прекрасно.
Вначале кто-то сказал, что AS1 - это не язык ООП и что там все методы паблик. От этого и пляшем.
Что касается приватов - вы не ответили на мой вопрос, поэтому есть они или нет ОТСЮДА не видно :)
Да нет у простых локальных функций this, господи. arguments.callee — вот ссылка на функцию. А this — ссылка на область видимости.
this - ссылка на объект активации функции (в локальной функции его можно было даже пощупать ФП6)
Хух... как это все не просто... вы не поняли. по определению любой метод класса должен быть доступен любому другому методу класса, а не только тому, на кого была передана ссылка - вы путаете понятия и в упор не хотите замечать очевидные вещи.
То, что вы привели в качестве примера, это воркараунд (не самый удачный) призваный имитировать работу приватного метода, но не выполняющий возложенные на него функции на 100% потому что по прежнему методы объявленные на прототипе класса вне конструктора не увидят такой "приватный метод".
Куда более логичным было бы просто выдавать ошибку при попытке обращения из-за пределов класса...
function TClass () {
this.privateMethod = function() {
var flag = true;
for (var i in this) {
if (this[i] == arguments.caller) {
flag = false;
break;
}
}
if (flag) throw new Error ("Method is private");
trace("Private method accessed!");
}
this.publicMethod = function() {
this.privateMethod();
}
this.toString = function() {
return "[TClass]";
}
}
var t = new TClass();
t.publicMethod();
t.privateMethod();
Т.е. как-то так, но это все равно имитация, а не нормальная работа.
уловка...
Да, у этого "псевдо приватного метода" есть 1 серьезный недостаток, который я не представляю себе как можно исправить - его можно удалить и переписать заново =)
но не выполняющий возложенные на него функции на 100% потому что по прежнему методы объявленные на прототипе класса вне конструктора не увидят такой "приватный метод"
Вне конструктора AS1 - означает вне тела класса. Вы бы так делали в AS3?
Да в AS3 есть вспомогательные классы и функции которые пишутся в том же пакете - но это не то.
Так с какой стати вы хотите, что-то писать вне тела класса?
Поэтому это приватный метод... на 100%.
простите... вы не понимаете, что такое приватный метод... ну я не знаю...
MyClass.prototype.someMethod = function(){} - это легитимный синтаксис? Или вы может будете с этим тоже спорить?
С какой стати? а потому, что все "классы" в АС1 динамические - хочу - пишу, не хочу - не пишу. Кто мне запретит добавлять свойства к динамическому классу?
Легитимность? Раз это позволено в АС1, значит легитимно с точки зрения АС1. А вы привели паблик метод, и прототип лучше использовать для наследования надкласс-подкласс, а так он нафиг не нужен.
вы не понимаете, что такое приватный метод
Непонимаю? Я уже несколько раз давал определение приватности в АС3. Ну и хватит тут оправдыватся... :)
Я вас не спрашивал нужен ли он вам: вопрос был простой - легитимный синтаксис с точки зрения языка, или нет. Вы можете из эстетических побуждений не использовать букву Х в названиях функций - но это же не значит, что все разработчики за вами последуют...
Раз это позволено в АС1, значит легитимно с точки зрения АС1
Не надо зацикливатся так... Почему повашему до сих пор существует столько парадигм программирования? Не остались ведь одни Java, С# и... AS3.
Не пойму о чем разговор?
Что лучше?
Для меня AS3, не буду за всех говорить. Кстати, ничего не мешало Адобу оставить два синтаксиса во второй виртуальной машине.
Как по твоему работает АС2 со своими правами доступа, если их "нет" в АС1. Все можно реализовать на АС1.
Есть ли ООП в АС1?
По моему очевидно что есть.
Где лучше ООП?
По моему очевидно, что в AS3. Я бы сказал, что он как и C# и Java - полностью ООП-й. Но тут кажется небольшие исключения есть (код в кадрах), ну так кажется все равно он является частью методов, классов, которые создаются (где-то встречал, не помню...).
BlooDHounD
30.06.2008, 00:38
BlooDHounD, вы крайне невнимательны. Я сказал, что считать, что все методы в AS - паблики - это не верно. Но я не говорил, что научу ваc делать приватные методы на AS1.
Однако. Есть простой способ, сделать метод недоступным ниоткуда, кроме как из своего класса (экземпляра класса).
Тут выше, правда, тут же начали возмущаться, что это не приватный метод, т.к.:
- он ведет себя не как в AS3
- функция - это не метод :)
- this ОБЯЗАН указывать на один и тот же объект...
- и собственно вообще, нормально рабочие приватные методы - это как в AS3ну вопервых, это был не я. это общественность взбунтовалась, так как, кажется я своими 3мя основными принципами ООП, оказался к ним ближе.Меня такой разговор удивляет. Есть способ сделать метод доступным только из данного класса. Есть или нет? Есть.
Вы можете такой метод назвать хоть валенком - кто против? Разве изменит это тот факт (который так неохото признать некоторым), что AS1 - это язык ООП? Не изменит. Гурский вообще прямо пишет, что объявление функции внутри другой функции - один из ходов ООП.вообще это не приватный метод (а метод ли вообще?), а internal. если быть уже совсем точным. это ближе к терминологии, но инкапсуляцией тут и не пахнет.
и ещё: товарищу Гурскому, я бы с удовольствием выразил своё "ФИ". учить программирования на примерах ActionScript - это здавать быдло-программеров.
__etc пишет, что хочет "нормально работающих приватных методов". Позвольте спросить, в чем их "нормальность"? И самое главное - для КАКОЙ ЦЕЛИ их сделали приватными? Последнее важно. Ведь если мы достигнем цели, значит метод (пусть с презрением трижды обозванный "псевдо") существует и эффективен.так вы же знаете ООП? откуда такие вопросы?Вначале кто-то сказал, что AS1 - это не язык ООП и что там все методы паблик. От этого и пляшем.что значит кто-то? это был я! прошу любить и жаловать!Что касается приватов - вы не ответили на мой вопрос, поэтому есть они или нет ОТСЮДА не видно :)А ВЫ НЕ ОТВЕТИЛИ НА МОЙ ОТВЕТ!
riden, кстати ... тему полиморфизма мы так и не затронули? кажется мы уже выяснили что с инкапсуляцией у нас беда в АС1. так что ОПП у нас нет. есть объекты, не значит что есть ООП.
>> Не пойму о чем разговор?
О наличии приватных методов в АС1.
Вы утверждаете, что они есть, я утверждаю, что их нету и их нужно имитировать.
В АС2 - это так же не более чем имитация, принципиально от АС1 он отличается только синтаксисом.
Про ООП в АС1 я до этого ни слова не говорил - это не ко мне.
2 wvxvw, BlooDHounD:
#316 (http://www.flasher.ru/forum/showpost.php?p=748723&postcount=316) - чем метод pMetA() не приватный?
мы уже выяснили что с инкапсуляцией у нас беда в АС1.
Получите доступ к pMetA не из тела родного класса, а потом утверждайте подобную чушь.
Тем что я могу его удалить =)
>> Получите доступ к pMetA не из тела родного класса, а потом утверждайте подобную чушь.
Чушь утверждаете вы: к методу должен быть доступ не из конструктора а из любого другого метода этого класса =)
к методу должен быть доступ не из конструктора а из любого другого метода этого класса
Я уже говорил, что Функция AS1 - это и конструктор и тело класса. Нужны внешние функции - пожалуйста, но это как-то не по ООП. А внешние функции не получат доступ к внутренней локальной функции.
Я уже говорил, что [U]А внешние функции не получат доступ к внутренней локальной функции.Это еще хуже. 100 экземпляров и 100 копий функции.
iNils, вы можете себе представить, чтобы кто то в АС3 писал что-то вне тела класса? Мы ведь про ООП говорим. А вот wxvxvw - хочет писать вне тела класса, и еще какие-то притензии предъявляет.
function Class1(){
var pa = this;
this.a = 4;
function pMetA(){
pa.a=10;
}
function pMetB(){
Class1.prototype.propFor__etc = "no more __etc";
}
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}
function pmet3(){
pMetB();
}
this.met1=pmet1;
this.met2=pmet2;
this.met3=pmet3;
Class1.prototype.met4 = pmet1;
Class1.prototype.propFor__etc = "for__etc";
}
var c = new Class1();
c.pMetA = function(){trace("doing some funn stuff here")};
c.pMetA();
Это ваш "кхм... приватный-то метод?" :D
При чем тут внешние функции? я вполне себе легитимно создал метод у этого класса, никакую внешнюю функцию я не использовал =)
function Class1(){
var pa = this;
this.a = 4;
function pMetA(){
pa.a=10;
}
function pMetB(){
Class1.prototype.propFor__etc = "no more __etc";
}
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}
function pmet3(){
pMetB();
}
this.met1=pmet1;
this.met2=pmet2;
this.met3=pmet3;
Class1.prototype.met4 = pmet1;
Class1.prototype.propFor__etc = "for__etc";
}
Class1.prototype.ImLookin4ThePrivateMethod = function(){
trace("Where in God's name did you put it? " + this.pMetA);
}
var c = new Class1();
c.ImLookin4ThePrivateMethod(); // output: Where in God's name did you put it? undefined
=)
Вы задрали со своими фишками. Вы переопределили метод в объекте, создали в этом объекте новый метод. А для запрета переопределения существует ASSetPropFlags!
Создайте новый экземпляр класса и увидите, что никуда pMetA() не делся.
Я. Пишу. Часто. Вне тела класса. Мне так нравися!
Я создаю неймспейсы в отдельных файлах, в которых вообще нет упоминаний о классе.
Я пишу статические константы типа номер версии проэкта в отдельном файле, в котором нет и упоминания о классе.
Я пишу переменные инициализаторы вне тела класса-синглтона чтобы сделать их недоступными другим классам.
Я пишу служебные прокси классы вне тела класса - их просто больше негде писать =)
Я пишу дополнительные служебные классы вне тела класса если не могу наследовать 1 класс от двух разных, а очень нужно =)
И все это ООП! :D
Дерут, простите... это что-то из зоологии =)
Я с таким же успехом могу и в прототипе его удалить переназначить, и ничто мне не помешает использовать все тот же ASSetPropFlags для этого =)
Создание нескольких классов в одном файле, вы называете "пишу вне тела класса". Я могу задать вам такой же тупой вопрос. Попробуйте из вспомогательного класса, получить доступ в тело главного класса (причем к паблик, интернал свойствам, а не приват). Так вы никогда такого не зделаете без создания экземпляров классов. В AS1 - также.
По поводу вашего поста, могу лишь отослать к своему посту - #333 (http://www.flasher.ru/forum/showpost.php?p=748765&postcount=333)
И все это ООП!
Значит в AS1 - не ООП? Логично.
Что вы мне пытаетесь доказать... Я сам сижу на AS3... что ООП AS3 лучше? - я итак это знаю...
KidsKilla
30.06.2008, 01:31
ад кромешный. от терминогогии "локальная фцнкция" или "приватный метод" суть не меняется. наружу видно только то, что ты хочешь дать. при чом тут ASSetPropFlags??? при чем тут метаязыки?
от того что кто-то в своё время недоучил ас1 он хуже не становится... всё то же и про ас3...
var c = new Class1();
c.pMetA = function(){trace("doing some funn stuff here")};
c.pMetA();
Вы не создали метод у класса, а создали у объекта. При чем тут этот бред?
Я с таким же успехом могу и в прототипе его удалить переназначить, и ничто мне не помешает использовать все тот же ASSetPropFlags для этого =)
Использование ASSetPropFlags? - на здаровье. Только зачем ломать атрибуты некой библиотеки. Скажем некого фреймворка? Вы станите переписывать библиотеку на АС3 меняя set на get и пр. издевательства?
И здесь тоже самое.
Создание нескольких классов в одном файле, вы называете "пишу вне тела класса". Я могу задать вам такой же тупой вопрос. Попробуйте из вспомогательного класса, получить доступ в тело главного класса (причем к паблик, интернал свойствам, а не приват). Так вы никогда такого не зделаете без создания экземпляров классов. В AS1 - также.
>> А разве я утверждал, что это возможно? - нигде и ни разу =)
В АС1 даже аналога нет - не знаю с чем вы сравниваете =)
Значит в AS1 - не ООП? Логично.
>> Нет, не логично, я еще раз вам напоминаю, я ни единого слова не сказал про ООП в АС1 - это ваши фантазии =)
Что вы мне пытаетесь доказать... Я сам сижу на AS3... что ООП AS3 лучше? - я итак это знаю...
>> Я вам пытаюсь доказать, что приватных свойств в АС1 не существует. Вы уверенно уходите от признания этого факта =)
function Foo() {
this.testMethod = function() {
trace("Kiddin me, rrrrright?");
}
this.toString = function() {
return "[Foo]";
}
}
Foo = function () {
this.testMethod = function() {
trace("Me cool :)");
}
this.toString = function() {
return "[Not Foo]";
}
}
var f = new Foo();
f.testMethod();
Вот, пожалуйста =) и нет больше такого метода =)
2 KidsKilla:
при чом тут ASSetPropFlags???
Да не причем... Я как то не прасек, что wvxvw не в тему тупо создал новый метод в объекте с названием приватного.
Но если бы он так сделал с паблик методом... То есть реально бы совершил переопределение ( а он это и хотел показать) - тогда, можно посоветовать только ASSetPropFlags.
Я вам пытаюсь доказать, что приватных свойств в АС1 не существует. Вы уверенно уходите от признания этого факта =)
2 wvxvw:
#316 - чем метод pMetA() не приватный?
Получите доступ к pMetA не из тела родного класса, а потом утверждайте подобную чушь
Кстати то, а вы сами понимаете смысл атрибута private в AS3?
ОФФТОП/: у меня сто сообшений:eek:, с 50 с чем-то нафлудил за день практически/ОФФТОП
KidsKilla
30.06.2008, 01:54
2 KidsKilla:
Да не причем... Я как то не прасек, что wvxvw не в тему тупо создал новый метод в объекте с названием приватного.
Но если бы он так сделал с паблик методом... То есть реально бы совершил переопределение ( а он это и хотел показать) - тогда, можно посоветовать только ASSetPropFlags.
да я не к тебе, а в воздух -- кто его затронул и зачем, не понятно...
wvxvw, "Я вам пытаюсь доказать, что приватных свойств в АС1 не существует." попробуйте доказать что земля квадратная. тоже нормальное занятие...
wvxvw, "Я вам пытаюсь доказать, что приватных свойств в АС1 не существует." попробуйте доказать что земля квадратная. тоже нормальное занятие...
Это один из вариантов увиливания от ответа, т.н. демагогия. Мы не говорили про форму земли, ну ни разу до этого. Я никогда, даже в самом страшном сне не пытался утверждать, что земля квадратная, но, тем не менее, вы приписываете мне это высказывание =) Тем самым пытаясь подвергнуть сомнению другое утверждение никак не связанное с приписаным мне ложным =) Попросту - замыливаете глаза, пытаясь увести дискуссию от темы и выставить опонента дураком =)
[увлеченно жует попкорн] ))
wvxvw, я за тебя! но не забывай про первое правило спора )).
KidsKilla
30.06.2008, 04:04
wvxvw, я имел в виду то, что в ас1 есть приватные свойства. их назвали "локальными функциями". а вы пытаетесь доказать обратное. чтож, успехов.
от того что кто-то не признаёт очевидных вещей суть не меняется.
Ок, давайте уточним, изначально речь шла про приватные методы - в процессе кто-то оговорился и теперь мы еще и свойства обсуждаем, предлагаю вернуться к изначальной теме =)
Для тех, кто пропустил начало дискуссии:
Мои тезисы такие:
Метод
Функцию можно назвать методом, если область ее видимости совпадает с областью видимости объекта, чьим методом она является.
Функция не является методом если она не доступна любому другому методу объекта, чьим методом она является.
Функцию можно назвать методом только по отношению к объекту создавшему ее.
Приватный метод
Приватным является такой метод, который можно вызвать из любого другого метода объекта, чьим методом он является, но ниоткуда более.
Обязательным атрибутом приватного метода является невозможность его переопределения / удаления из-за пределов объекта, чьим методом он является.
По моему глубокому убеждению функция созданная в конструкторе класса не удовлетворяет ни одному из вышеперечисленных условий.
Т.как ее область видимости разнится с областью видимости класса, чьим методом она должна быть. Методы объявленные позже на прототипе класса не имеют доступа к этой функции. Функцию объявленную таким образом можно вызвать с разными областями видимости используя call и apply.
Я не исключаю возможности, когда выполнение такой функции будет неотличимо от выполнения метода класса, но настаиваю на том, что эти понятия не взаимозаменимы.
Поскольку функция не является методом, то проверку на приватность считаю лишней.
В заключение: мне кажется семантически более верным называть такую функцию "локальной функцией" либо "служебной функцией" класса для отличия от метода, который исходя из семантики слова предполагает принадлежность чему либо.
Class1.prototype.ImLookin4ThePrivateMethod = function(){
trace("Where in God's name did you put it? " + this.pMetA);
}
var c = new Class1();
c.ImLookin4ThePrivateMethod(); // output: Where in God's name did you put it? undefined
Сколько тебе раз еще говорить про this? this - это указатель на объект активации. Ты уже делал так, я тебе все говорил... Все мимо? Ты применяешь this -внутри локальной функции...
Ну так... ты не то что не смог обратистя к приватному методу - возвращает undefined, я вообще не понимаю на что ты расчитывал, применяя указатель this внутри локальной функции без объекта активации (то есть ни создан ее экземпляр функции, ни вызов функции в теле класса, что бы образовалось "область видимости" и появилась ссылка на указатель) - если бы ты это сделал, ты бы получил this, но так как у объекта активации(объект-экземпляр этой функции или сама функция) нет свойства pMetA, то все равно бы было undefined.
На pMet - ничего не ссылается, как ты собираешся к ней доступ получить? К чему эти танцы с бубном? Выше приведенная тобой функция может получить ссылку на this класса (а не функции, как у тебя)... И что дальше? Ты сможешь обратится к свойствам класса (то есть паблик), а все что не свойства класса, а находится внутри - приват.
Короче - не связный бред... не в тему.
Далее...
Код:
function Foo() {
this.testMethod = function() {
trace("Kiddin me, rrrrright?");
}
this.toString = function() {
return "[Foo]";
}
}
Foo = function () {
this.testMethod = function() {
trace("Me cool :)");
}
this.toString = function() {
return "[Not Foo]";
}
}
var f = new Foo();
f.testMethod();Вот, пожалуйста =) и нет больше такого метода =)
Это что? Какого метода нет? И при чем здесь наличие приватных методов в классе, и возможность доступа к этим методам?
Вернемся же к теме (облегченный вариант):
function Class1(){
//паблик свойство
this.a = 4;
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
//паблик методы
function pmet1(){pMetA();}
function pmet2(){trace("do pmet2");}
this.met1=pmet1;//паблик метод
this.met2=pmet2; //паблик метод
}
////////////////////////////////////////
var obj = new Class1();
var obj1 = new Class1();
trace(obj.a);//4
obj.met1();
trace(obj.a);//10
trace(obj1.a);//4
obj1.met1();
trace(obj1.a);//10
2 wvxvw:
По моему глубокому убеждению функция созданная в конструкторе класса не удовлетворяет ни одному из вышеперечисленных условий.
Т.как ее область видимости разнится с областью видимости класса, чьим методом она должна быть.
Функция локальная может видеть глобальные свойства. А в AS3 - иначе? Область видимости распространяется вверх по цепочке наследования. Так же как и в AS3.
Если вы подразумеваете под областью видимости вызов this из функции - то я вам уже десять раз говорил, что означает this, и что есть функция в AS1. Область видимости - это доступность свойст из метода, а не то что вы пишите. Вызвав this данной функции - вы получите ссылку на объект активации этой функции. Ну и что, что в AS3 подругому. AS3 - полностью ООП-й язык. В AS3 функции имеют более узкое назначение и применение.. О чем речь?
Методы объявленные позже на прототипе класса не имеют доступа к этой функции.
Да... похоже вы действительно не понимате приватность. Методы обяъявленные позже. Тоесть динамические - так? Где эти самые методы обявляются? Очевидно в теле другого класса. Так? Мы ведь про ООП говорим. Ну и что такое приват? Разве из другого класса мы должны получать доступ к приватным свойствам (для тебя, объект - набор свойств, если значение свойства - функция, то это метод; так что упрощенно все это называют свойствами, полями). Ну и почему методы созданные на этапе исполнения(то есть когда создаются экземпляры классов) (пускай даже на временной диаграме) должны иметь доступ к приват-свойствам класса? + в вашем случае, это всегда будет вне тела класса ("родного").
Если ты говоришь про что то другое, то я тебе уже приводил пример, как метод в прототипе (но не созданный динамично) получает доступ к приват свойствам.
Функцию объявленную таким образом можно вызвать с разными областями видимости используя call и apply.
Вызовите приват метод из тела другого класса, ну или пускай, раз в АС1, из области видимости диаграммы (хотя это уже не совсем ООП), где вы создаете экземпляр класса. pMetA - пост выше (код Class1)
chingachgoog
30.06.2008, 09:24
ну вопервых, это был не я. это общественность взбунтовалась, так как, кажется я своими 3мя основными принципами ООП, оказался к ним ближе.
Вы опять невнимательны. Я и не говорил, что это вы взбунтовались. :)
А общественность, если приглядитесь, "бунтует" странно: кроме вас вроде никто не решил отметится эпохальным заявлением, что AS1 - это не ООП язык (в этой части топика). :)
и ещё: товарищу Гурскому, я бы с удовольствием выразил своё "ФИ". учить программирования на примерах ActionScript - это здавать быдло-программеров.
Я рад, что вы это сказали (вы-то, конечно не быдло - как можно сомневаться? :) )
так вы же знаете ООП? откуда такие вопросы?
Вопрос был не к вам. Но мне понятно желание __ets скипнуть этот вопрос и ваше желание не отвечать на него. :)
Но мне понятно желание __ets скипнуть этот вопрос и ваше желание не отвечать на него. :)
Товарищ индеец, перестаньте делать выводы на пустом месте, если я ушел пить пиво с друзьями на улицу, это вовсе не означает, что я решил скипнуть какой-то там ваш вопрос. У меня есть и другие дела, кроме как торчать с вами и другими в этой теме. Если хотите, можете повторить свои вопросы (я их искать после тучи ответов не буду, мне лень) в миллионный раз и получить в миллионный раз ответ.
Лично я уже давно все высказал здесь и полемизировать вы тут можете до посинения, но к знаменателю никто не придет, это уже очевидно.
UPD: Таки нашел вопрос:
__etc пишет, что хочет "нормально работающих приватных методов". Позвольте спросить, в чем их "нормальность"? И самое главное - для КАКОЙ ЦЕЛИ их сделали приватными? Последнее важно. Ведь если мы достигнем цели, значит метод (пусть с презрением трижды обозванный "псевдо") существует и эффективен.
Я буду скучен и повторю ответ BlooDHounD: Ну вы же знаете ООП? Тогда откуда такие вопросы?
>> Сколько тебе раз еще говорить про this? this - это указатель на объект активации.
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller
>> Ну так... ты не то что не смог обратистя к приватному методу - возвращает undefined, я вообще не понимаю на что ты расчитывал
рассчитывал получить undefined. получил то, на что рассчитывал. Т.е. функция не является методом, пому, что другой метод не смог получить к ней доступ
>> Функция локальная может видеть глобальные свойства.
мне не не интересны в данном контексте глобальные свойства, мне нужны только свойства объекта, чьим методом эта функция должна быть. Опять же, она их не видит.
>> В AS3 функции имеют более узкое назначение и применение
ложь =)
>> Методы обяъявленные позже. Тоесть динамические - так?
Не вижу никакой связи с временем объявлении метода и тем будет ли он статическим или динамическим.
>> Ну и почему методы созданные на этапе исполнения(то есть когда создаются экземпляры классов) (пускай даже на временной диаграме) должны иметь доступ к приват-свойствам класса?
Это является обязательным атрибутом метода, иначе это не метод.
>> вне тела класса.
Вы путаете конструктор класса и сам класс.
>>> Функцию объявленную таким образом можно вызвать с разными областями
>>>видимости используя call и apply.
>> Вызовите приват метод из тела другого класса....
Где в моем утверждении сказано, что можно вызвать из другого класса? Я говорю, что ее можно вызвать, например, из конструктора класса, но при этом определить ее область видимости не такой, какая должна быть у метода.
ЗЫ. То как я понимаю метод и приватный метод я описал в "тезисах" в предыдущем сообщении. Если вы считаете, что моя отправная точка не верная - тогда продолжать дискуссию не имеет смысла т.как дискуссия не может быть продуктивной если тезисы дискутирующих противоречивы.
Ромастый
30.06.2008, 14:09
Внесу и я свои 5 копеек по поводу пабликов/приватов
Создание локальных функций и ссылок на них внутри конструктора класса никак не может быть созданием методов. В первую очередь, как было справедливо замечено, из-за области видимости.
Как я догадываюсь, смутить умы может некоторая похожесть организации кода AS1:
function AS1Class() {
function myMethod() {
//....
}
}
с AS2:
class AS2Class {
function myMethod() {
//...
}
}
и AS3:
package {
public class AS3Class {
function myMethod() {
//...
}
}
}
Вот только function AS1Class() {..} является не телом класса, а конструктором. Создавать в конструкторе методы - где вы такое видели?
В AS1 методы создавались через prototype:
function AS1Class(a) {
//...
}
AS1Class.prototype.myMethod = function(a) {
//....
}
AS1Class.prototype.myOtherMethod = function(b) {
this.myMethod(b+1);
}
И вот такие методы нормально сделать приватными мне не представляется реальным.
KidsKilla
30.06.2008, 14:53
var x = new(function z(){
var private = 'private';
this.public = 'public';
this.meth = function(){
return [private, this.public];
}
})()
alert(x.private) // undefined
alert(x.public) // "public"
alert(x.meth()) // "private, public"
x.private = '123';
alert(x.meth()) // "private, public"
под описание * Приватным является такой метод, который можно вызвать из любого другого метода объекта, чьим методом он является, но ниоткуда более.
* Обязательным атрибутом приватного метода является невозможность его переопределения / удаления из-за пределов объекта, чьим методом он является. подходит.
Создавать в конструкторе методы - где вы такое видели?
какая разница? что от этого поменяется? это дело синтаксиса и не более.
var x = new(function z(){
var private = 'private';
this.public = 'public';
this.meth = function(){
return [private, this.public];
}
})()
alert(x.private) // undefined
alert(x.public) // "public"
alert(x.meth()) // "private, public"
x.private = '123';
alert(x.meth()) // "private, public"
А где тут приватный метод? :quiet:
В AS1 методы создавались через prototype
Ложь. prototype нужен только лишь для организации наследования, как
Class.prototype = new SuperClass();
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw)
Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса). Я уже приводил код, как это делается в теле класса.
2Ромастый... если вы не видели мой код, создание свойств и методов делается так в АС1, в теле класса:
var бла бла // приват свойство
функция(){одна одинешенька, на меня никто не ссилается} //приват метод
this.свойство = бла-бла // паблик свойство
this.свойство = функция //паблик метод
Вот только function AS1Class() {..} является не телом класса, а конструктором
Функция AS1 - это и конструктор и тело класса одновременно.
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller
Еще раз приведу свой код:
function Class1(){
this.a=1;
trace (this); //[object Object]
function localFunc(){
this.b=2
trace(this);//this получает ссылку в момент создания экземпляра
//Выводит [type Object]
trace(this.a); //undefined
trace(this.b); //2
}
localFunc();
//this.met = localFunc;
}
//Class1();
var c = new Class1();
//c.met();
/*Выводит:
[object Object] - ссылка на объект с
[type Object] - ссылка на localFunc() (я так думаю)
undefined - нет такого свойства в объекте
2
*/
Как вы видите, у каждой функции свой this.
И еще про область видимости. Вашим тупым аргументом является, то что this вызванное из функции без объекта активации, возвращает undefined. Вы применяете обман, и утверждаете что функция не видит "выше" (выше-вложенной функции, то есть функции-тела ласса). Так то что функция все видит, убедится очень легко... процитирую свой код...
......................
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
..................
Как видите переменная pa - видна в приватном методе, да и будет видна в паблик методе. По этому не понятны притензии, якобы не видит верхний this... Не видит потому что у каждой функции свой this в AS1, и вы сразу получаете указатель на другой объект, а вот в AS3 у функции нет this, поэтому и возможно обращение к классу из функции
>> В AS3 функции имеют более узкое назначение и применение
ложь =)
Попробуйте, в AS3, создать экземпляр функции, с помощью оператора new и увидите что будет :D
>> Ну и почему методы созданные на этапе исполнения(то есть когда создаются экземпляры классов) (пускай даже на временной диаграме) должны иметь доступ к приват-свойствам класса?
Это является обязательным атрибутом метода, иначе это не метод.
>> вне тела класса.
Вы путаете конструктор класса и сам класс.
Добавте таким же образом метод в динамический класс в АС3 - это называтся НА ЭТАПЕ ИСПОЛНЕНИЯ - и попытйтесь обратится к приватным свойствам класса, в который вы добавляете :D
Или у вас такой малый опыт програмирования, или что.. не знаю, что вы не можете провести аналогии между AS1 и AS3... Или на временной диаграме вы это зделаете, или в теле другого класса, к приват вы уже не имеете никакого отношения... Или вы напрочь забыли для чего приват свойста?
Функция в AS1, которая имеет объект активации в виде объекта инициализированного оператором new, и есть класс, так как с этого момента (new) this данной функции будет ссылатся на объект активации, на каждый экземпляр и заполнять пустой объект свойствами this."свойство".
Вот код, и апровержения я так и не увидел. Приватный метод pMetA(). Удачи :D
function Class1(){
//паблик свойство
this.a = 4;
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
//паблик методы
function pmet1(){pMetA();}
function pmet2(){trace("do pmet2");}
this.met1=pmet1;//паблик метод
this.met2=pmet2; //паблик метод
}
////////////////////////////////////////
var obj = new Class1();
var obj1 = new Class1();
trace(obj.a);//4
obj.met1();
trace(obj.a);//10
trace(obj1.a);//4
obj1.met1();
trace(obj1.a);//10
Надоело разжовывать элементарные вещи,... удачи :)
KidsKilla
30.06.2008, 15:22
А где тут приватный метод?
var x = new(function z(){
var private = function(){return 'private'};
this.public = function(){return 'public'};
this.meth = function(){
return [private(), this.public()];
}
})()
alert(x.private()) // Error
alert(x.public()) // "public"
alert(x.meth()) // "private, public"
x.private = function(){return '123'};
alert(x.meth()) // "private, public"
тоже мне педанты...
riden просто до сих пор не знает, как использовать call и apply, поэтому начинает нести пургу относительно this, то рассказывая про то, что он суть arguments.caller, то соглашался, что это ссылка на область видимости, теперь опять arguments.caller.
KidsKilla, мне не хочется повторяться, но около пяти страниц назад riden приводил тот же код, я у него попросил код, в котором вызванный приватный метод изменяет значение публичного свойства данного класса. Так вот, теперь я прошу показать такой код.
А вообще, мне непонятно, если принять во внимание, что утверждение «AS1 — ООП язык», то этот самый язык должен реализовывать все принципы ООП, причем сразу вместе. Кто-нибудь может привести пример, в котором реализована сразу и инкапсуляция, и наследование, и переопределение с полиморфизмом. В AS3 это возможно, даже в AS2 (т.к. там был добавлен новый пикод extends для реализации наследования, которого нет в AS1). Если хотите, могу даже описать такой пример. С вас — реализация.
riden:
Вы упорно не хотите понять, что функция и метод это не одно и то же, и все время путаете и себя и остальных.
Метод - это часный случай функции. у метода обязан быть this, у функции - нет. А вы это не понимаете.
Это не значит, что при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль. Просто существуют такие обстоятельства, когда они это делать не могут.
KidsKilla
30.06.2008, 16:55
__etc
var x = new(function z(){
var t = this;
var private = function(){
t.pub = function(){
return 'smt changed'
};
};
this.pub = function(){
return 'public'
};
this.change = function(){
private();
return this;
}
})()
alert(x.pub()) // "private"
alert(x.change().pub()) // "smt changed"
wvxvw, придираетесь к терминологии. "при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль." пример плз.
var t = this;
Чего и следовало ожидать, как и riden-а, вывалился стандартный костыль в виде ссылки на самого себя и функция так и осталась локальной функцией и не работает, как метод.
KidsKilla
30.06.2008, 17:02
Чего и следовало ожидать, как и riden-а, вывалился стандартный костыль в виде ссылки на самого себя и функция так и осталась локальной функцией и не работает, как метод.
=> АС1 не ООП =))) отличная логика.
=> АС1 не ООП =))) отличная логика.
Так прочитайте вторую часть моего поста, где я просил код. Был показан пример с приватным методом, т.е. метод инкапсулирован в класс (хоть и криво, менее кривым решением было бы использование call и apply и проблем с областями видимости не было бы). Но я хочу увидеть пример, реализовывающий сразу все принципе. Такой пример я сделал на AS3:
package {
public class MyClass implements IMyClass {
public function MyClass() {
super();
}
public var angle:Number = 0;
public function getRotation():Number {
this.calculateValue();
return this.angle/Math.PI*180;
}
private function calculateValue():void {
this.angle = 2*Math.PI*Math.random();
}
}
}
package {
public class AnotherMyClass extends MyClass {
public function AnotherMyClass() {
super();
}
public override function getRotation():Number {
var rotation:Number = super.getRotation();
return rotation/2;
}
}
}
package {
public interface IMyClass {
function getRotation():Number;
}
}
Итак, три класса, MyClass, AnotherMyClass и интерфейс IMyClass. Инкапсулирован метод calculateValue, класс AnotherMyClass наследуется от MyClass, переопределяет метод и использует метод супер-класса, и все это сверху нафаршировано полиморфизмом (сигнатуры методов совпадают, поведение разное) в виде интерфейса IMyClass.
Я прошу привести реализацию этих двух классов на AS1, с учетом и реализацией уровней доступа к свойствам и переменных.
Я согласен на формулировку «AS1 — псевдо-ООП язык», но никак не на «AS1 — ООП-язык». То, что на встроенном уровне есть какие-то классы и простое наличие объектов не делает язык по настоящему объекто-ориентированным.
>> wvxvw, придираетесь к терминологии. "при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль." пример плз.
function TClass (targetObj) {
function notMethod () {
trace (this);
}
notMethod.call(targetObj);
}
function AClass () {
this.toString = function () {
return ("[AClass]");
}
}
var t = new TClass(new AClass()); //[AClass]
Вот, такого поведения у метода не должно быть.
ЗЫ. Терминология, особенно в том, что касается точных наук нужна для того, чтобы ей неукоснительно следовать. Иначе возникают разночтения, которые только препядствуют дальнейшему развитию. Для этого пишутся стандарты, создаются исследовательские группы...
При этом примеры таких разночтений призваных к жизни исключительно ленью и халатностью разработчиков не удосужившихся заглянуть в госты/стандарты и т.п. литературу - сплошь и рядом. Да тот же ХТМЛ, который никогда ни в одной програме способной его воспринимать не был реализован согласно своим стандартам.
Поэтому, лучше называть вещи своими именами - пусть лучше будет сложнее понять, но правильно, чем неверно истолковано.
Что касается нашего спора: я могу согласится называть локальную функцию методом, но я всего 1 человек имеющий мало веса в огромнейшем программерском сообществе. В этом же сообществе существует масса литературы трактующей метод по-другому. Локально приняв соглашение об использовании ненормативной терминологии мы создадим прецедент, последствиями которого может стать кривая реализация другого абсолютно не связанного с нашим спором проэкта. Что в дальнейшем повлечет за собой лишние усложнения в технологии работающей с ним и т.д...
AS2 - ООП?
AS2 как языка не существует. AS2 — ООП-маска.
riden просто до сих пор не знает, как использовать call и apply, поэтому начинает нести пургу относительно this, то рассказывая про то, что он суть arguments.caller, то соглашался, что это ссылка на область видимости, теперь опять arguments.caller.
Никогда такого не говорил. Объект активации, область видимости... называйте как угодно... this - это указатель на объект активации функции, я уже приводил код. Если вы не понимаете сути this, и кокое он имеет отношение к функции, ваши проблемы. Я уже приводил код... тогда еще раз...
function Class1(){
this.a=1;
trace (this); //[object Object]
function localFunc(){
this.b=2
trace(this);//this получает ссылку в момент создания экземпляра
//Выводит [type Object]
trace(this.a); //undefined
trace(this.b); //2
}
localFunc();
//this.met = localFunc;
}
//Class1();
var c = new Class1();
//c.met();
/*Выводит:
[object Object] - ссылка на объект с
[type Object] - ссылка на localFunc() (я так думаю)
undefined - нет такого свойства в объекте
2
*/
Чего и следовало ожидать, как и riden-а, вывалился стандартный костыль в виде ссылки на самого себя и функция так и осталась локальной функцией и не работает, как метод.
Мы кажется говорим про приватный метод. Что за бред: "функция не работает как метод"? Приватный метод - тоже что и локальная функция.
А если хотитие чтобы функция работала как метод, то надо сделать вот так: this.свойство = функция.
Это не значит, что при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль. Просто существуют такие обстоятельства, когда они это делать не могут.
Нет таких обстоятельств, всегда можно вызвать локальную функцию в теле родного класса.
Еще раз, почему функция в AS1 - это и конструктор и тело класса...
Во первых, потому что:
Функция в AS1, которая имеет объект активации в виде объекта инициализированного оператором new, и есть класс, так как с этого момента (new) this данной функции будет ссылатся на объект активации, на каждый экземпляр и заполнять пустой объект свойствами this."свойство".
Во вторых: Так как все что находится в теле функции-класса, реально копируется при создании экземпляра, а вот все что снаружи - всего лишь получает ссылку. Убедится в этом очень просто:
function func1(){}; // Создаем внешнюю функцию
func1.prop2=1; // Присваиваем функции свойство
function Class1(){ // Функция-класс
function func2(){}; // Создаем внутреннюю функцию
func2.prop=1; // Присваиваем внутренней функции свойство
this.method1=func1; // Создаем методы, ссылаясь на внутреннюю
this.method2=func2; // и внешнюю функции
}
var obj1=new Class1(); // Создаем два объекта класса Class
var obj2=new Class1();
obj1.method1.prop=2; // Переопределяем свойства функций методов
// одного из объектов
//obj1.method2.prop=2;
trace(obj2.method1.prop); // Выводит: 2 (свойство было изменено)
trace(obj2.method2.prop); // Выводит: 1 (свойство осталось неизменным)
2 __etc (#370): мы говорим сейчас про реализацию приват и паблик, не отступайте от темы... или признайте, что вы не правы.
Это не значит, что при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль. Просто существуют такие обстоятельства, когда они это делать не могут.
Нет таких обстоятельств, всегда можно вызвать локальную функцию в теле родного класса.
А метод можно вызвать вне тела класса - в этом разница
Никогда такого не говорил. Объект активации, область видимости... называйте как угодно... this - это указатель на объект активации функции, я уже приводил код. Если вы не понимаете сути this, и кокое он имеет отношение к функции, ваши проблемы. Я уже приводил код... тогда еще раз...
Объект активации, область видимости, ссылка на функцию — разные вещи, совершенно. arguments.caller, this, arguments.callee соответственно.
[type Object] - ссылка на localFunc() (я так думаю)
Как была областью видимости, так ею и осталась. Одно дело думать, другое дело — знать. Вы создали свойство в анонимной области видимости, после этого приплетаете объект активации (arguments.caller, вы знаете, что это такое?), который вообще отношения к ней не имеет.
Приватный метод - тоже что и локальная функция.
Неправда. Локальная функция не принадлежит объекту, она сама может быть как объект. Приватный метод обязан принадлежать классу, который его реализует, а значит область видимости (this внутри этого метода) должен указывать на экземпляр этого класса. У вас этого не происходит и вы вынуждены создавать ссылки на экземпляр (т.е. ссылка на самого себя), чтобы иметь возможность работать с другими методами и свойствами экземляра. Но то, что у вас есть внешняя ссылка (а не внутренняя) на экземпляр, не делает эту функцию методом, принадлежащем экземпляру. Вам об этом талдычат уже пятую или шестую страницу подряд, но вы упорно этого не понимаете, начиная нести чушь про this и объекты активации, которые вообще отношения к делу не имеют.
2 __etc (#370): мы говорим сейчас про реализацию приват и паблик, не отступайте от темы... или признайте, что вы не правы.
В чем я не прав? Вы до сих пор не организовали ваши чудо-приваты так, как следовало, хотя я и wxvxw несколько раз давали намек на реализацию. Т.к. я понял, что мне этого от вас не добиться и ваши приватные методы никогда не будут работать в области видимости экземпляра (уж это реализовать можно, хоть методы так и не будут принадлежать экземпляру, т.к. это невозможно из-за подобной «приватности»), я решил продолжить тему относительно того, является ли AS1 истинным объектно-ориентированным языком или нет. И прошу товарища индейца переписать мои классы на AS1, с учетом обязательной реализации приватности.
Во вторых: Так как все что находится в теле функции-класса, реально копируется при создании экземпляра, а вот все что снаружи - всего лишь получает ссылку. Убедится в этом очень просто:
...
trace(obj2.method1.prop); // Выводит: 2 (свойство было изменено)
trace(obj2.method2.prop); // Выводит: 1 (свойство осталось неизменным)
А у меня получается "undefined" и "1"
2 Inils: поправил.
2 wvxvw:
Цитата:
Это не значит, что при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль. Просто существуют такие обстоятельства, когда они это делать не могут.
Нет таких обстоятельств, всегда можно вызвать локальную функцию в теле родного класса.
А метод можно вызвать вне тела класса - в этом разница
Вы хотите вызвать приватный метод вне тела класса? Помилуйте, но это не возможно. Ни вне тела класса, ни на этапе исполнения...
2 __etc:
Это же вы пишите, что this имеет отношение к области видимости... я уже писал.
Так то что функция все видит, убедится очень легко... процитирую свой Код:
......................
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
..................
Как видите переменная pa - видна в приватном методе, да и будет видна в паблик методе. По этому не понятны притензии, якобы не видит верхний this...
this - указатель на объект активации функции, то есть на объект, который вызывает функцию, это может быть объект-экземпляр класса (функции). если функция вызывется из временной диграммы, то - ссылка на _level0, если функция внутри функции тупо лежит и не вызывается, то вы ничего не получите от this. К чему вы приплетаете сюда "this" из классового ООП? В АС3 если вы напишите внутри функции this, знаете что будет, но здесь - по другому.
Область видимости? - все переменные верхней функции видны.
this - указатель на объект активации функции
Господи, прекратите думать мыслями товарища Гурского, этот ваш объект активации настолько низкоуровневая вещь, что товарищ Гурский в начале параграфа заявил на двухсотой (!) странице, что пора прояснить «смутную общую картину языка» © (т.е. он пудрил мозги двести страниц), а в конце «какое из проявлений функции считать основным — ответить на этот вопрос очень и очень непросто» © (продолжаем дальше варить кашу). Т.е. он мало того, что сам толком не понял, о чем рассказывает, так ещё и запудривает мозги другим. Поэтому, пожалуйста, постарайтесь думать своей головой.
Ваш чудо-приватный метод с нормальным this, а не «объектом активации» из книжки Гурского будет выглядеть вот так:
function MyClass() {
this.x = 10;
function privateMethod() {
trace('call privateMethod, i am: '+this);
this.x = 20;
}
this.publicMethod = function() {
trace('call publicMethod, i am: '+this);
privateMethod.call(this);
}
this.toString = function() {
return 'MyClass instance';
}
}
o = new MyClass();
trace('o is '+o);
trace('o.x before = '+o.x); // 10
o.publicMethod();
trace('o.x after = '+o.x); // 20;
trace('o.privateMethod = '+o.privateMethod); // undefined
Конечно, для реализации всей этой красоты, нам придется воспользоваться множеством костылей, вроде call с apply и прочими танцами, зато создали инкапсуляцию на уровне языка, а не на уровне договоренности с самим с собой. Так вот. Меня интересует все эти три кита ООП в одном виде, примеры кода на AS3 я написал, хочу увидеть пример на AS1, опять же, на уровне языка, а не договоренности с самим с собой, что вооон тот белый столб на самом деле черный и вообще его там нет.
riden, func2 это приватный метод?
2 Inils: это здесь причем. Этот код я совершенно к другому вопросу привел. Нет конечно.
А приватный метод вот - pMetA
function Class1(){
//паблик свойство
this.a = 4;
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
//паблик методы
function pmet1(){pMetA();}
function pmet2(){trace("do pmet2");}
this.met1=pmet1;//паблик метод
this.met2=pmet2; //паблик метод
}
////////////////////////////////////////
var obj = new Class1();
var obj1 = new Class1();
trace(obj.a);//4
obj.met1();
trace(obj.a);//10
trace(obj1.a);//4
obj1.met1();
trace(obj1.a);//10
2 __etc:
Вы создали свойство в анонимной области видимости, после этого приплетаете объект активации (arguments.caller, вы знаете, что это такое?), который вообще отношения к ней не имеет.
Нет, это вы Гурского не понимаете.
argumetns.callee - возвращает не объект активации, а определение функции, короче ссылается на саму функцию. А объект активации, как я уже писал - это объект который вызывает функцию. Код функции, например выполняется при использовании оператора new Func, при создании экземпляра класса(функции).
Вот так будет правильно:
function Class1(a){
this.a=a;
trace (this); //[object Object] //указатель на obj - экземпляр класса Class1
function localFunc(){
this.b=2;
trace(this); //[type Object]
trace(this.arguments);//аргумент функции внешней
//это подтверждает что объект активации - внешняя функция (Class1)
trace(this.a); //undefined
trace(this.b); //2
}
localFunc(); // вызов локальной функции, иначе this ничего не будет возвращать
//this.met = localFunc;
}
//Class1();
var obj = new Class1("аргумент функции внешней");
//c.met();
/*Выводит:
[object Object] //this
[type Object] //this
undefined
аргумент функции внешней //this.arguments
2 //this.b
*/
Ну и также такой пример можно привести:
function func(){
trace(this);
}
func();//_level0
obj = new func();//[object Object]
2 wvxvw:
Что касается нашего спора: я могу согласится называть локальную функцию методом, но я всего 1 человек имеющий мало веса в огромнейшем программерском сообществе...
Никто не называет локальную функцию - методом, хватит извращатся wvxvw.
Я называю локальную функцию в prototype-based OOP AS1 - приватным методом. Разницу чувствуете?
>> Вы хотите вызвать приватный метод вне тела класса? Помилуйте, но это не возможно. Ни вне тела класса, ни на этапе исполнения...
Да, я хочу вызвать приватный метод и увидеть как компайлер, ну или на худой конец дебаггер расскажет мне об ошибке =)
Это логичное и ожидаемое поведение приватного метода. Т.е. метод есть? - да есть. Вызвать можно? - нет, нельзя.
А то получается, я взял ваш класс, а то, как вы форматируете код противоречит моим религиозным принципам и смотреть в него я не хочу :) . АПИ к вашим классам нету... и вот мне приходит в голову... а не создать ли мне публичный метод у вот этого класса - и кто мне скажет нет? Вполне легитимное желание =) Но, в зависимости от того, как вы реализовали ваш псевдо-приватный метод, мой вновь созданый либо его уничтожит, либо сам не будет работать - что приведет меня в глубокое замешательсво, и мне прийдется наплевав на религиозные принципы взять и переписать ваш класс =)
От вас не требовался "prototype-based OOP AS1 - приватным метод". Нужен просто ООП приватный метод, без довесок в виде prototype-based =)
ЗЫ. на протяжении этой дискусии я не извращался (хотя, правды ради, готов признать, что иногда я это делаю :D ) С самого моего первого поста я последовательно, ни разу не отказываясь провожу одну и ту же мысль, просто с каждым разом освещая другие ее аспекты, которые, возможно, были упущены из виду другими дискутантами.
Мое убеждение остается таким же, каким и было: в АС1 приватных методов не существует, но существуют определенные воркараунды позволяющие добиться сходной функциональности, вместе с тем, каждый воркараунд имеет свои недостатки, справится с которыми не представляется возможным в силу отсутствия необходимого инструментария.
Да, и еще, вы путаете arguments.callee и arguments.caller. Но эти ссылки могут указывать на один и тот же объект только в случае рекурсивного вызова функции. Во всех остальных случаях callee (дословно "вызываемый") указывает на текущую функцию, а caller (дословно "вызывающий") указывает на функцию, которая текущую функцию вызвала. И обе эти ссылки только случайно могут совпасть с this текущей функции т.как прямо с этим не связаны.
в АС1 приватных методов не существуют, но существуют определенные воркараунды позволяющие добиться сходной функциональности, вместе с тем, каждый воркараунд имеет свои недостатки, справится с которыми не представляется возможным в силу отсутствия необходимого инструментария.
Спор не о чем... Я говорю о реализации приват и паблик, так как здесь в начале утверждали, что в AS1 - все паблик, нет инкапсуляции, что локальные функции по функциональности в ас1 чем-то отличаются: не могут обращатся к свойствам класса или изменять их, или еще - сама локальная функция не может использоватся в методах... - все это я опроверг.
К тому же представления о ООП в AS1 здесь оказались не четкими... Ведь Функция AS1 - играет роль класса, и тела класса.
Вы же по прежнему сравниваете два ООП, я этого не делал. Пост - #333 (http://www.flasher.ru/forum/showpost.php?p=748765&postcount=333)
Да, и еще, вы путаете ...Ничего не путаю, я пишу о том что такое объект активации функции, и что к нему не имеет отношение arguments.callee (ну и caller).
Да, я хочу вызвать приватный метод и увидеть как компайлер ...
Это то же можно реализовать, только это будет делать не компилятор, а вы, или сам класс, можно создать специальный метод.
А то получается, я взял ваш класс, а то, как вы форматируете код противоречит моим религиозным принципам и смотреть в него я не хочу . АПИ к вашим классам нету... и вот мне приходит в голову...
Тоже не вопос для AS1.
Заметьте принципиальную разницу, я говорю только об AS1, не сравниваю языки. Свою позицию относительно AS3 я уже выразил в посте #333. То есть вы мне пытаететсь доказать то, что я и так знаю. Все это не ко мне...
При попытках сравнивать языки, ООП, вопросов типо "AS3 оопэшнее, лчше, правильней...", и пр. возвращайтесь к посту 333 и читайте, читайте, читайте...
Вот, на мой взгляд более приемлимий вариант приватного метода. Но все же у него есть 2 недостатка:
- в конструкторе его нельзя вызвать как this.privateMethod();
- из-за того, что вотчить _global невозможно, нельзя запретить переписать весь класс вместе с методом.
function TClass () {
this.protectPrivate = function(prop, nVal, oVal) {
throw new Error ("Method is private!");
}
this.privateMethod = function() {
var flag = true;
for (var i in this) {
if (arguments.caller == this[i]) flag = false;
}
trace(flag);
TClass.prototype.watch("privateMethod", this.protectPrivate);
this.watch("privateMethod", this.protectPrivate);
if (flag) throw new Error ("Method is private!");
trace ("private method accessed");
}
this.publicMethod = function() {
this.privateMethod();
}
this.toString = function() {
return "[TClass]";
}
privateMethod();
}
var t = new TClass();
t.publicMethod();
/*t.privateMethod(); // can not access uncomment to see it working
TClass.prototype.privateMethod = function() {
trace("private method overrided"); // can not reassign
}
t.privateMethod = function() { // can not reassign in instances
trace("instances behavior changed");
}*/
>> Ничего не путаю, я пишу о том что такое объект активации функции, и что к нему не имеет отношение arguments.callee (ну и caller).
В посте #381 вы их перепутали, вам говорили про caller, а вы ответили про callee.
>> Это то же можно реализовать, только это будет делать не компилятор, а вы, или сам класс, можно создать специальный метод.
Именно это и будет значить, что в языке такой конструкции нет. Точно так же, как нет полной поддержки матричной трансформации - и тем не менее 3д движков хватает.
Я не сравниваю языки, я сравниваю 1 язык АС1 с эталоном. В этом и заключается суть нашей дискуссии.
Какую роль играет функция в АС1 - не имеет отношения к сути вопроса. Мы сравниваем конструкцию типа "класс" с эталоном описаным средствами не зависящими от реализации в любом конкретном языке.
BlooDHounD
30.06.2008, 22:21
riden, повторю за остальным, возможно слегка понятнее:
this - пространство относительно которого вызывается функция (никаким образом не связано с "объектом активации функции").
arguments.caller - функция, которая вызвала текущую (вот пространство данной функции и будет "объектом активации функции").
arguments.callee - текущая функция (обычно используется для того, что бы хоть как-то поймать анонимную функцию).
riden, вы уже давно ведетесь на уловки etc и пытаетесь переписать АС3 на АС1. С таким же успехом я могу доказать, что АС3 не ООП язык хотя бы потому, что в нем нет inline методов. Я перешел на АС3 совсем недавно и мне совсем не интересно изучать старую технологию. Но положение дел в этой теме меня совсем не устраивает, и я попытаюсь сам доказать, что АС1 - ООП язык. АС1 использует частный случай ООП - Прототипное_программирование (http://ru.wikipedia.org/wiki/Прототипное_программирование). Так или иначе ООП предусматривает три основных парадигмы (http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование), рассмотрим каждую из них:
1) Инкапсуляция - способ скрыть внутреннее исполнение от внешней обертки
function Base(){
var text = function(){
return 'private text'
};
this.method = function(){
return text() + ' returned from public'
};
};
var obj = new Base();
trace(obj.text()) // "undefined"
trace(obj.method()) // "private text returned from public"
2) Наследование - наследованный класс, использует код базового класса, добавив свою функциональность.
function Extends() {
var base = new Base();
this.method = base.method;
this.method2 = function() {
return "added method to base class";
};
};
var obj2 = new Extends();
trace(obj2.text()) // "undefined"
trace(obj2.method()) // "private text returned from public"
trace(obj2.method2()) // "added method to base class"
3) Полиморфизм - наследованный класс переопределяет функиональность базового класса.
function Extends2() {
var base = new Base();
this.method = function() {
return "this is " + base.method() + " of base class? No this overriden method off base class";
};
};
var obj = new Base();
var obj2 = new Extends2();
trace(obj2.text()) // "undefined"
trace(obj2.method()) // "this is private text returned from public of base class? No this overriden method off base class
"
И чем проще код, тем сложнее допустить ошибку.
BlooDHounD
30.06.2008, 23:01
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким :)
riden, повторю за остальным, возможно слегка понятнее:
this - пространство относительно которого вызывается функция (никаким образом не связано с "объектом активации функции").
arguments.caller - функция, которая вызвала текущую (вот пространство данной функции и будет "объектом активации функции").
arguments.callee - текущая функция (обычно используется для того, что бы хоть как-то поймать анонимную функцию).
this - указатель на объект активации функции. callee, caller - ссылаются на функции.
function Class1(a){
this.a=a;
trace (this); //[object Object] //указатель на obj - экземпляр класса Class1
function localFunc(){
this.b=2;
trace(this); //[type Object] - объект активации функции
trace(arguments.caller); //[type Function] //- разница налицо
trace(this.arguments);//аргумент функции внешней
//это подтверждает что объект активации - внешняя функция (Class1)
trace(arguments.caller.arguments); //undefined //!
trace(this.a); //undefined
trace(this.b); //2
}
localFunc();
//this.met = localFunc;
}
//Class1();
var obj = new Class1("аргумент функции внешней");
function func(){
trace(this);
trace(arguments.caller); //null //- :)
}
func();//_level0 //- объект активации
obj = new func();//[object Object] //- объект активации
Можете экземпляр класса (функции) obj называть "пространством вызова функции", но это объект, _level0 - тоже объект, и функция ([type Object]) - тоже объект.
BlooDHounD
01.07.2008, 00:35
riden, бугого. я пошёл отсюда пока мне нилс плюс не влепил.
P.S.: вам надо либо изучить парочку толковых словарей (пример: http://slovari.yandex.ru/dict/ushakov ), либо написать свой. ибо как я понял Вас тут все не понимают :)
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на AS3 я привел. Истинно объектно-ориентированным языком можно назвать тот язык, который позволяет на уровне языка реализовать три принципа ООП сразу вместе на парочке классов, а не по отдельности, причем, реализованных средствами самого языка, а не руками, как тут уже всю тему пытаются сделать.
В AS1 у вас этого не получится, подобную приватность не скрестить с наследованием, а полиморфизма в AS1 вообще нет ни в каком виде. AS1 вам позволяет думать в стиле ООП, но не дает вам средств работы с ним. Т. е. вы сами реализовываете наследование (ручками), сами реализовываете приватность (либо на уровне договоренности с самим собой, что некоторые методы извне вызывать нельзя), а полиморфизм держите в голове. А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript.
Кстати, наследование реализуется не так, как вы написали, это вообще будет ручной труд по копированию методов от предка к наследнику. Для наследования у вас есть скрытые костыли языка в виде __proto__ и __constructor__.
riden, то, что у вас каша в голове, созданная товарищем Гурским, наглядно показывает перепутанные caller, про который я спрашивал и callee. Возьмите, хотя бы, Essential ActionScript 2.0, все станет просто и понятно. И потом, если вы не заметили, приемлимый вариант приватности уже привели (хотя мой вариант мне гораздо больше нравится, чем у wxvxw, потому что у меня функция не видна снаружи вообще).
Ваш объект активации, суть объект, в контексте которого вызывается функция, т. е. в его области видимости. При использовании кейворда new создается новая область видимости. В AS3 поведение иное, область видимости не изменяется, даже если присвоить ссылку на метод класса другому объекту. А в AS1/AS2 функция будет вызвана в области видимости того объекта, к которому она присвоена:
o = new Object();
o.toString = function() {
return 'object o';
}
a = new Object();
a.toString = function() {
return 'object a';
}
function test() {
trace(this);
}
o.test = test;
a.test = test;
test(); // _level0
o.test(); // object o
a.test(); // object a
trace([test==o.test, test==a.test]); // true,true
В AS2 для предотвращения такого поведения был придуман класс Delegate, изменяющий (делегирующий) область видимости функции в нужную. Вам несколько раз намекали, что приватная функция должна работать в области видимости экземпляра класса, а не в иной. Присвоить приватную функцию экземляру вы не можете, потому что потеряется эта самая приватность, но вот вызывать функцию в контексте экземпляра вы могли, но не сделали этого, а завели ссылку на нужную область видимости, создавая дополнительные трудности из-за разного способа доступа к свойствам и методам. Да, и забудьте про «объекты активации», оперируйте понятием «область видимости», которое понимают программисты, а не Дмитрий Гурский. Надеюсь, я доходчиво описал то, о чем вы тут нам хотели рассказать. А поэтому, предлагаю двигаться дальше к вопросу объектно-ориентирован ли AS1 или нет.
2 __etc:
Ваш объект активации, суть объект, в контексте которого вызывается функция, т. е. в его области видимости. При использовании кейворда new создается новая область видимости.
Не совсем так. Область видимости не изменится. Из вложенной функции вы сможете вызывать переменные и функции всех внешних функций и рута.
А this - всегда указывает на "объект активации", то есть если функция не будет вызвана, инициализирована - то this==undefined.
Вам несколько раз намекали, что приватная функция должна работать в области видимости экземпляра класса, а не в иной.
Так и есть, приватная функция (вложенная функция) работает в области видимости класса (функции внешней).
И не приплетайте сюда больше this из классового ООП, там this указывает всегда на класс (и соответственно на каждый экземпляр), здесь - на "объект активации функции". К области видимости функции это отношение не имеет.
P.S: ну и у кого каша в голове?
А this - всегда указывает на "объект активации", то есть если функция не будет вызвана, инициализирована - то this==undefined.
setInterval(function () {
trace (this); //undefined
}, 1000);
setInterval(function () {
trace (this); //undefined
}, 1000);
мда... у функции нет "объекта активации". Функция вызывается не объектом.
Под вызовом, инициализацией, я подрузомевал:
function func(){trace(this);}
//это
func();//_level0 // - TimeLine
//или
var obj = new func();// [object Object] // - obj
//и подобные вещи: вызов внутри другой функции (не методом, а
//непосредственно), которая тоже
//вызывается, инициализируется объектом
В любом случае, я просто писал о том, что область видимости != объект активации функции (по моему понятный термин).
BlooDHounD
01.07.2008, 12:35
В любом случае, я просто писал о том, что область видимости != объект активации функции (по моему понятный термин).итить. а Вы молодец. за 50своих постов, смогли доказать сам себе, что это разные вещи :) перечитайте пожалуйста внимательно и вдумчиво: http://www.flasher.ru/forum/showpost.php?p=749062&postcount=386
2 BloodHounD:
Я помню все что писал. Я и неговорю, что во всем был последователен. На меня также подействовало AS3, и эта путаница c this. Просто я счас написал, что __etc (#391 (http://www.flasher.ru/forum/showpost.php?p=749126&postcount=391)) тоже это не понимает, в последних постах (#392 (http://www.flasher.ru/forum/showpost.php?p=749139&postcount=392)).
Добавлено в 10:56
О, прочитал вашу ссылку, так вот о чем вы. Так это вы не понимате до сих пор о чем речь...
Еще раз могу послать вас сюда #389 (http://www.flasher.ru/forum/showpost.php?p=749084&postcount=389) - Читайте внимательно код и вдумывайтесь... И еще почитайте мой пост 392 внимательно.
P.S: а путаница у меня проскакивала (непоследовательность), только гораздо ранее.
У того же Гурского, на странице 203, написано:
В AS при вызове функции создается особая стуктура, называемая объектом активации.
что область видимости != объект активации функцииОб этом все и говорили, но также говорили, что this указывает на область видимости, а вы на объект активации. А получается, что вызов функции есть, а объекта активации - нет.
Далее, вы писали в 378 посте
this - указатель на объект активации функции, то есть на объект, который вызывает функцию, это может быть объект-экземпляр класса (функции). если функция вызывется из временной диграммы, то - ссылка на _level0, если функция внутри функции тупо лежит и не вызывается, то вы ничего не получите от this.Модернизируем код выше
function a () {
trace ("\t" + this);
}
setInterval(function () {
trace (this);
a ();
}, 1000);согласно вашей цитате, а именно месту "на объект, который вызывает функцию" должно быть два undefined, однако получаем undefined и _level0
Не совсем так. [U]Область видимости не изменится.
Это называется внешняя область видимости. Она не изменяется, да, а this (ссылка на рабочую область видимости, на объект, если уж вам так хочется) — изменяется.
Так и есть, приватная функция (вложенная функция) работает в области видимости класса (функции внешней).
И не приплетайте сюда больше this из классового ООП, там this указывает всегда на класс (и соответственно на каждый экземпляр), здесь - на "объект активации функции". К области видимости функции это отношение не имеет.
P.S: ну и у кого каша в голове?
У вас каша. Вы трындите о том, что локальная функция не работает в области видимости экземпляра класса (обратите внимание на выделенное слово). Я прекрасно знаю, что сама по себе без лишних телодвижений она так не работает, в отличие от AS3. Слово «должна» в моих высказываниях означает, что надо сделать так, чтобы эта функция себя так вела, а вы продолжаете уже черт знает какой пост подряд твердить одно и то же про «не приплетайте сюда AS3» и что она так не работает. Не работает — значит надо сделать, чтобы работало именно так. А вы влепили костыль в виде ссылки на экземпляр, опять же, не зная про call и apply.
Вы мой код вообще видели из поста #379 (http://www.flasher.ru/forum/showpost.php?p=749024&postcount=379)? Вы внимательно читали пост #391 (http://www.flasher.ru/forum/showpost.php?p=749126&postcount=391) в отношении к областям видимости и делегированию или нет? Похоже, что нет, о чем тогда разговаривать?
p.S.:
Есть одна хорошая цитата из книги «Объектно-ориентированное программирование на ActionScript 1» Брендана Холла и Сэмюэла Ван в отношении объектно-ориентированности AS1: «Наследование в ActionScript — уродливое, запутанное дело со можеством всяких ям и ловушек. Плохо, что приходится столько знать о внутреннем устройстве ActionScript, чтобы заставить работать такое элементарное понятия ООП, как наследование».
2 Inils: ну я же понятно написал, о различии вызова объектом и методом, или нет?
Поэтому и называется - "объект активации функции". Процитирую свой отредактированный пост:
//и подобные вещи: вызов внутри другой функции (не методом, а
//непосредственно), которая тоже
//вызывается, инициализируется объектом
2 __etc:
Вы трындите о том, что локальная функция не работает в области видимости экземпляра класса (обратите внимание на выделенное слово).
Я пишу:
приватная функция (вложенная функция) работает в области видимости класса (функции внешней).
Это значит, что все переменные (свойства) во внешней функции (классе) видны. Все свойства внутри тела класса (функции) копируются, с созданием экземпляра. И можно также (как и в AS3, например this[область видимости экземпляра]-parent) через ссылку на this-класса, получить доступ к руту экземпляра.
P.S: нет, похоже, это у вас все таки каша в голове.
Это значит, что все переменные (свойства) во внешней функции (классе) видны.
Но не экземпляра. А нужно экземпляра, последний раз об этом говорю (я даже нужный код уже привел фиг знает, когда, а вы все не унимаетесь), так что лично я закончил тему по поводу объектов активации. Я уже три десятка постов назад продолжил тему объектно-ориентированности AS1, а вы всё тянете свои чертовы объекты активации, хотя речь шла вообще о реализации приватов в AS1 и они реализованы уже. Сейчас речь идет о реализации всех трех принципов ООП одновременно, на основе AS3-варианта. Если вы не хотите в этом участвовать — пожалуйста, не мешайте другим, в особенности товарищу индейцу.
P.S: нет, похоже, это у вас все таки каша в голове
Я, в отличие от вас, не редактирую по 10 раз посты после того, как на первоначальные редакции уже были даны ответы. Если вы будете продолжать сначала писать одно, потом редактировать и писать другое через полчаса, тогда мне не о чем с вами разговаривать. После этого вы начинаете утверждать, что, якобы, у меня каша в голове.
...инициализируется объектом
function a () {
trace (this);
}
function b(){
trace (this);
a()
}
new b()
setInterval(a, 1000);
[object Object]
_level0
undefined
Ну вот откуда тут _level0?
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким :)
А кто вдруг решил, что в ООП обязательно должен быть this, что должны быть классы, множественное наследование. Например, в Си++ есть перегрузка операторов, но это дополнительная возможность, которой нет в истинном определении ООП.
А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript.
Может на эту тему (http://developer.mozilla.org/en/docs/About_JavaScript) тоже поспорим? :)
Кстати, наследование реализуется не так, как вы написали, ... Для наследования у вас есть скрытые костыли языка в виде __proto__ и __constructor__.
Спасибо, я и не знал.
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на AS3 я привел. Истинно объектно-ориентированным языком можно назвать тот язык, который позволяет на уровне языка реализовать три принципа ООП сразу вместе на парочке классов, а не по отдельности, причем, реализованных средствами самого языка, а не руками, как тут уже всю тему пытаются сделать.
Да, пожалуйста:
function IMyClass(){
this.getRotation = function(){
return 'abstract method'
};
};
function MyClass() {
this.__proto__ = IMyClass;
this.angle = 0;
var calculateValue = function () {
this.angle = 2*Math.PI*Math.random();
};
this.getRotation = function() {
calculateValue.call(this);
return this.angle/Math.PI*180;
};
};
function AnotherMyClass() {
this.__proto__ = MyClass;
this.getRotation = function() {
var rotation = this.__proto__.getRotation();
return rotation/2;
};
this.getRadians = function() {
return this.angle/2;
}
};
var iMyClass = new IMyClass();
var myClass = new myClass();
var aMyClass = new AnotherMyClass();
trace(iMyClass.calculateValue()) // "undefined"
trace(iMyClass.getRadians()) // "undefined"
trace(iMyClass.getRotation()) // "abstract method"
trace(iMyClass.angle) // "undefined"
trace(myClass.calculateValue()) // "undefined"
trace(myClass.getRadians()) // "undefined"
trace(myClass.getRotation()) // "152.942357249558"
trace(myClass.angle) // "2.66934769976621"
trace(aMyClass.calculateValue()) // "undefined"
trace(aMyClass.getRadians()) // "1.3346738498831"
trace(aMyClass.getRotation()) // "102.746495101601"
trace(aMyClass.angle) // "3.58652926881432"
Даже немного компактнее получилось.
Как я уже говорил АС1 и JavaScript являются прототипными ООП. Что свойственно для языков программирования без жесткой типизации, в которых нельзя ввести определение класса. Если ,etcs, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП.
Может на эту тему (http://developer.mozilla.org/en/docs/About_JavaScript) тоже поспорим? :)
JavaScript такой же псевдо-ООП, как и AS1, нет разницы. Ещё раз говорю, что язык вам позволяет реализовывать ООП, куцое, правда. Но у него нет средств для обеспечения той же приватности или полиморфизма, эти вещи разработчик просто в голове держит и все.
Да, пожалуйста:
function IMyClass(){
this.getRotation = function(){
return 'abstract method'
};
};
function MyClass() {
this.__proto__ = IMyClass;
this.angle = 0;
var calculateValue = function () {
this.angle = 2*Math.PI*Math.random();
};
this.getRotation = function() {
calculateValue.call(this);
return this.angle/Math.PI*180;
};
};
function AnotherMyClass() {
this.__proto__ = MyClass;
this.getRotation = function() {
var rotation = this.__proto__.getRotation();
return rotation/2;
};
this.getRadians = function() {
return this.angle/2;
}
};
var iMyClass = new IMyClass();
var myClass = new myClass();
var aMyClass = new AnotherMyClass();
trace(iMyClass.calculateValue()) // "undefined"
trace(iMyClass.getRadians()) // "undefined"
trace(iMyClass.getRotation()) // "abstract method"
trace(iMyClass.angle) // "undefined"
trace(myClass.calculateValue()) // "undefined"
trace(myClass.getRadians()) // "undefined"
trace(myClass.getRotation()) // "152.942357249558"
trace(myClass.angle) // "2.66934769976621"
trace(aMyClass.calculateValue()) // "undefined"
trace(aMyClass.getRadians()) // "1.3346738498831"
trace(aMyClass.getRotation()) // "102.746495101601"
trace(aMyClass.angle) // "3.58652926881432"
Даже немного компактнее получилось.
Мой трейс:
undefined
undefined
abstract method
undefined
undefined
undefined
undefined
undefined
undefined
NaN
NaN
undefined
Не работает, вы не находите?
Как я уже говорил АС1 и JavaScript являются прототипными ООП. Что свойственно для языков программирования без жесткой типизации, в которых нельзя ввести определение класса.
Если рассматривать понятие ООП как более абстрактное, программирование с использованием понятия объектов, то тогда большинство языков объектно-ориентированные.
Если ,etcs, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП.
Я уже говорил, что я согласен на формулировку, что AS1 — ООП язык, но только с приставкой «псевдо». Class-based языки — ООП языки без приставок.
p.S. В моем нике всего три буквы и два подчеркивания, но почему в нём постоянно делают ошибки? То буквы местами перепутают, то «c» с «s», то одно подчеркивания вместо двух (хотя подчеркивания можно и опустить совсем).
BlooDHounD
01.07.2008, 14:24
Яски, есть ООП, а есть возможности языка :) с вашей логикой Вы мне можите доказывать, что Джава не язык программирования вовсе, так как там нету класса MovieClip :) что за бред Вы несёте про this, про inline-методы, перегрузка операторов? какое отношение к ООП они имеют? миксинг классов вообще фактически с точки зрения ООП, противопоказан.
Ромастый
01.07.2008, 15:33
Ложь. prototype нужен только лишь для организации наследования, как
Class.prototype = new SuperClass();
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw)
Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса).
Ну здрасте-приехали. Еще и во лжи объявили... :eek:
Если уж на то пошло, то и as1 класс создается НА ЭТАПЕ ИСПОЛНЕНИЯ кода в кадре, так что нет существенной разницы - добавили вы метод в конструкторе (так уж и быть, "теле" класса), или через prototype. Куда важнее, что а) - сохраняется область видимости; б) - все методы и свойства, добавленные в прототип, распространяются на ВСЕ экземпляры класса, а не создаются каждый заново при создании экземпляра. По мне, это куда ближе к концепции ООП.
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.
P.S. Задержался с ответом, но все же.
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.
Ну так мы же обеспечивали инкапсуляцию на уровне языка :)
Понятное дело, что проще инкапсулировать методы в собственной голове и закрыть глаза на то, что приваты торчат наружу.
chingachgoog
01.07.2008, 16:00
Я буду скучен и повторю ответ BlooDHounD: Ну вы же знаете ООП? Тогда откуда такие вопросы?
Я буду еще скучнее и тоже повторюсь: мне понятно ваше желание не отвечать на этот вопрос.
Ведь как только такой ответ будет дан, сразу будет видно, что чему отвечает и соответствует.
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller
Народ, ну вы даете. Надо же так не знать, что такое объект активации :(
argumetns.caller - указатель на объект функции, но не на объект активации. Это разные вещи.
this - тоже не указатель на объект активации. Это свойство объекта активации, показывающее, чьим методом является функция.
function A(){
function B(){
trace(this)
}
B()
}
A() // [type Object] - это объект активации функции A, но не функции B!
Объект активации во ФП6 можно просмотреть for in с помощью ASSetPropFlags(), будет видно что все локальные свойства (var) внутренние (вложенные) функции, массив arguments, свойство this - все это содержиться в объекте активации.
Я буду еще скучнее и тоже повторюсь: мне понятно ваше желание не отвечать на этот вопрос.
Ведь как только такой ответ будет дан, сразу будет видно, что чему отвечает и соответствует.
Я ответил на ваш вопрос вопросом, вы знаете ООП? Вы знаете, что такое инкапсуляция? Если знаете, то к чему вопрос, для какой цели созданы приваты? А созданы они для реализации инкапсуляции (одного из принципов ООП, это важно) на уровне языка. В AS1 также нет никакого полиморфизма на уровне языка, нет никакого контроля за сигнатурой в переопределенном методе, соответственно нет и интерфейсов.
Объект активации во ФП6 можно просмотреть for in с помощью ASSetPropFlags(), будет видно что все локальные свойства (var) внутренние (вложенные) функции, массив arguments, свойство this - все это содержиться в объекте активации.
iNils привел код, в котором нет объекта активации и код, в котором он является рутом. Ваш этот объект активации можно достать лишь во вложенной функции и является недо-объектом (он даже в toString выводится как [type Object], а не [object Object], как другие объекты) и одновременно ссылкой на локальную область видимости родительской функции. Это не arguments.caller и не arguments.callee, да. Но особой пользы этот недо-объект не несет (его свойства в семерке скрыли от перечисления совсем, чтобы вопросов лишних не возникало), потому как локальная область видимости родительской функции доступна и без this, так как является внешней по отношению к вложенной функции.
Посему, this в моем коде был изменен на более полезную и логичную область видимости экземпляра класса (ссылка на экземпляр). Это несколько лучше костыля с внешней ссылкой, но других способов сделать функцию приватной в AS1 лично я больше не вижу.
И вообще, товарищ Гурский под объектом активации подразумевает как раз этот самый полуобъект-ссылку на локалку родительской функции, а вот большинство программистов, не знакомых с творчеством Гурского, под объектом активации понимают arguments.caller, т. е. метод/функция, вызвавший (активировавший) данный.
chingachgoog
01.07.2008, 17:13
Я ответил на ваш вопрос вопросом, вы знаете ООП? Вы знаете, что такое инкапсуляция? Если знаете, то к чему вопрос, для какой цели созданы приваты? А созданы они для реализации инкапсуляции (одного из принципов ООП, это важно) на уровне языка.
Вы не ответили на вопрос. Инкапсуляция не имеет ничего общего с private. Приват может усилить инкапсуляцию, но не более.
В AS1 также нет никакого полиморфизма на уровне языка, нет никакого контроля за сигнатурой в переопределенном методе, соответственно нет и интерфейсов.
Да, в языке AS1 нет слов интерфейс, приват и даже (о ужас!) класс. Тем не менее это язык ООП. Ибо нигде не сказано, что ООП язык ДОЛЖЕН иметь такие слова. Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов. У прототипных языков есть свои преимущества и надо их использовать, а не ворчать по поводу отсутствия интерфейсов.
iNils привел код, в котором нет объекта активации и код, в котором он является рутом.
Ничего подобного. Вы невнимательно прочитали мой предыдущий пост и все еще не в введении, что такое объект активации.
iNils привел код, где трассируется указатель this. А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)
И вообще, товарищ Гурский под объектом активации подразумевает как раз этот самый полуобъект-ссылку на локалку родительской функции, а вот большинство программистов, не знакомых с творчеством Гурского, под объектом активации понимают arguments.caller, т. е. метод/функция, вызвавший (активировавший) данный.
Тогда жаль, что "большинство программистов" не хотят знать как на самом деле работает код.
PS Кстати не __constructor__ а просто constructor
Вы не ответили на вопрос. Инкапсуляция не имеет ничего общего с private. Приват может усилить инкапсуляцию, но не более.
Приват и создан для инкапсуляции. Конечно, вы можете создать для себя правила, какие методы вызывать, какие нельзя и типа у вас инкапсуляция получилась. Отлично.
Ибо нигде не сказано, что ООП язык ДОЛЖЕН иметь такие слова. Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов. У прототипных языков есть свои преимущества и надо их использовать, а не ворчать по поводу отсутствия интерфейсов.
Да откройте википедию хотя бы, насчет должен. Я ничего не говорю про преимущества прототипных языков, я даже не говорю, что AS1 вообще не ООП, он ООП, но с приставкой «псевдо» только лишь из-за того, что это самое ООП надо самому необходимо реализовывать (это доказывает наличие «легко достижимы» вместо «уже есть» из вашего текста). А я не считаю такой язык по-настоящему объектно-ориентированным, в котором надо эту ориентированность самому реализовывать. С тем же успехом ассемблер тоже объектно-ориентированный, ведь в нем тоже можно реализовать полиморфизм, наследование и инкапсуляцию, не так ли?
Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов.
Подтвердите свои слова кодом, я привел пример инкапсуляции, наследования и полиморфизма на AS3. Перепишите пример под AS1, с сохранением инкапсуляции (нормальной приватности, без торчащих наружу методов), наследования и полиморфизма. У Яски код нерабочий.
Ничего подобного. Вы невнимательно прочитали мой предыдущий пост и все еще не в введении, что такое объект активации.
iNils привел код, где трассируется указатель this. А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)
А вы дальше моего предложения «iNils привел код, в котором нет объекта активации и код, в котором он является рутом.» вообще ничего читать не стали и сразу объявили меня в некомпетентности? Оригинально, это лишний раз подтверждает то, что вы читаете ровно до того предложения и лепите ответ к одному предложению, не обращая внимания на другие.
Тогда жаль, что "большинство программистов" не хотят знать как на самом деле работает код.
И не должны знать, прочитайте цитату из книги моего поста #398 (http://www.flasher.ru/forum/showpost.php?p=749172&postcount=398). Программист не должен знать низкоуровневые особенности кода, ему нужно работать и писать работающий, а не сидеть и выпиливать ООП, на котором дай бог что-нибудь заработает.
PS Кстати не __constructor__ а просто constructor
Т.е. вы не знаете, как работает extends под шестой плеер в AS1?
Я жду от вас кода.
Ещё раз говорю, что язык вам позволяет реализовывать ООП, куцое, правда. Но у него нет средств для обеспечения той же приватности или полиморфизма, эти вещи разработчик просто в голове держит и все.
А какие средства вам еще нужны, то что можно создавать объекты, назначать им свойства и методы уже является дополнительной возможностью. Например, в том же Си такой возможности нет.
Не работает, вы не находите?
Для того, чтобы использовать более точную версию AS1 я писал в Flash MX, возможно в Flash CS ситуация изменилась. Скорей всего __proto__ надо писать как prototype.
Если рассматривать понятие ООП как более абстрактное, программирование с использованием понятия объектов, то тогда большинство языков объектно-ориентированные.
ООП является стандартом дефакто, совсем без него плохо.
Я уже говорил, что я согласен на формулировку, что AS1 — ООП язык, но только с приставкой «псевдо». Class-based языки — ООП языки без приставок.
Хорошо, называйте его "псевдо", но "прототипный" будет точнее.
Яски, есть ООП, а есть возможности языка :) с вашей логикой Вы мне можите доказывать, что Джава не язык программирования вовсе, так как там нету класса MovieClip :) что за бред Вы несёте про this, про inline-методы, перегрузка операторов? какое отношение к ООП они имеют? миксинг классов вообще фактически с точки зрения ООП, противопоказан.
Я тоже считаю, что бредово приписывать к ООП такие частные понятия, как интерфейсы, классы, приватные методы.
А какие средства вам еще нужны, то что можно создавать объекты, назначать им свойства и методы уже является дополнительной возможностью.
Вы выходите в более высокий уровень абстракции, чем я, вам достаточно просто наличия объектов. Мне — нет.
Для того, чтобы использовать более точную версию AS1 я писал в Flash MX, возможно в Flash CS ситуация изменилась. Скорей всего __proto__ надо писать как prototype.
Нет, там побольше будет строчек, целых три.
Я тоже считаю, что бредово приписывать к ООП такие частные понятия, как интерфейсы, классы, приватные методы.
Wiki (http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%8 0%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.93.D0.BB.D0.B0.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BF.D0.BE.D0.BD.D1.8F.D1.82.D0.B8.D1.8F_.D0.B8_.D1.80.D0.B0.D0.B7. D0.BD.D0.BE.D0.B2.D0.B8.D0.B4.D0.BD.D0.BE.D1.81.D1.82.D0.B8)
Из последнего абзаца основных понятий AS1 — подвид ООП, прототипный. Он использует не все исходные понятия ООП. Т. е., есть собственные прототипы, есть наследование. Остальное реализуется лишь на уровне собственных правил разработчика, которым он следует, язык в этом, увы, участия не принимает.
Вы выходите в более высокий уровень абстракции, чем я, вам достаточно просто наличия объектов. Мне — нет.
Главное решить поставленную задачу, а инструмент для этого подойдет любой.
Я ничего не говорю про преимущества прототипных языков, я даже не говорю, что AS1 вообще не ООП, он ООП
На этом спор можно закончить.
По поводу "объекта активации", областей видимости:
var e = 5;
function Class2(){
this.e=0;
trace(e); //5 //-видит, при создании экземпляра область
//видимости не поменялась как пишет __etc
trace(this.e); //0 // е в объекте, this - указатель на объект.
//можете считать, что с созданием экземпляра, область
//видимости "расширилась", вопрос терминологии...
}
var o2 = new Class2();
Тоже происходит и с локальными функциями. Все они видят, и указатель this - здесь не причем.
Меня сбил с толку код wvxvw:
//wvxvw пишет про область видимости
function TClass () {
//пытается скрестить строку с this - не вышло
//+ внутри this указывает на другое
function toBePrivate () { trace("Should be TClass: "+ this); }//так нельзя
this.toString = function () { return "[TClass]" };
this.callPrivateMethod = function() {toBePrivate()};
}
var t = new TClass();
trace(t);//[TClass]
t.callPrivateMethod(); //Should be TClass: undefined
Правильно вот так:
function TClass () {
function toBePrivate () {
this.toString = function () { return "[TClass Function]" };
trace(this); //вот так можно, только this, без строк
};
this.toString = function () { return "[TClass]" };
this.callPrivateMethod = function() {toBePrivate()};
}
var t = new TClass();
trace(t);//[TClass]
t.callPrivateMethod();//[TClass Function]
2 iNils:По этому, речь идет только о глобальных функциях (this==undefined), а в методах - все OK.
Я прокоментирую:
function a () {
trace (this);
}
function b(){
trace (this);
a();//не знаю... Очевидно что функция a не относится к объекту класса b(),
//это только ссылка на внешнюю функцию, которая лежит на
//таймлайне (_level0)
//Я уже писал, что все что находится вне тела класса - не копируется
//при создании экземпляра, а получает ссылку ...
}
new b(); // создается экземпляр класса b()
Подкорректируем...
function b(){
function a(){trace (this); }
trace (this);//[object Object] - указатель
//на экземпляр класса
a(); //[type Object] - указатель на объект функции (b),
//я уже писал про это ...
}
new b();
По поводу области видимости экземпляра:
2 __etc:
Вы показали как работает указатель this в AS1. И что? Не надо их сравнивать (AS1, AS3);
o = new Object();
o.toString = function() {
return 'object o';
}
a = new Object();
a.toString = function() {
return 'object a';
}
function test() {
trace(this);
}
o.test = test;
a.test = test;
test(); // _level0
o.test(); // object o
a.test(); // object a
trace([test==o.test, test==a.test]); // true,true
В AS3 поведение иное, область видимости не изменяется, даже если присвоить ссылку на метод класса другому объекту. А в AS1/AS2 функция будет вызвана в области видимости того объекта, к которому она присвоена
Где у вас здесь методы класса? если бы test() - был методом класса, он бы и работал, как "спрогаммирован". То есть instanceOfClass.test() - будет возвращать, то что нужно. И не важно кому его присвоят, откуда он ссылку получит.
Вы наверно не заметли.., а процитировали только мое одно предложение, я процитирую:
Это значит, что все переменные (свойства) во внешней функции (классе) видны. Все свойства внутри тела класса (функции) копируются, с созданием экземпляра. И можно также (как и в AS3, например this[область видимости экземпляра]-parent) через ссылку на this-класса, получить доступ к руту экземпляра.
Аналогом parent DisplayObject в AS1 будет _parent мувика. Короче классы в ас1 работают также как в ас3 в этом смысле. И также можно узнать где лежит клип: this-класса._parent, и таким образом получить доступ к области видимости экземпляра. Надеюсь я правильно понял смысл фразы "область видимости экземпляра класса". А как в АС3 вы получите из тела класса, доступ к области видимости экземпляра, если он - не часть DisplayList (короче не DisplayObject)? Ну не важно, аналогию я привел.
Надеюсь я правильно понял смысл фразы "область видимости экземпляра класса".
Нет, неправильно поняли.
А как в АС3 вы получите из тела класса, доступ к области видимости экземпляра, если он - не часть DisplayList (короче не DisplayObject)? Ну не важно, аналогию я привел.
Очень просто — this. Я и так в каждом методе в AS3 нахожусь в этой области видимости и this ссылается на неё же. Я уже говорил вам, что «должна работать так» — это значит, что нужно сделать так, чтобы приваты работали, как они работают в AS3. Я приводил соответствующий код.
Главное решить поставленную задачу, а инструмент для этого подойдет любой.
Ну конечно, у нас есть детальки, мы сначала сделаем бензопилу, а потом будем ей рубить лес. Лично я предпочту язык с наличием бензопилы изначально.
На этом спор можно закончить.
И остаться при своих.
Очень просто — this. Я и так в каждом методе в AS3 нахожусь в этой области видимости и this ссылается на неё же.
Именно про это я и писал, уже давно: "доступ к переменным(свойствам) внешней функции-класса)".
Можно так:
function Class1(){
this.a="for __etc";
var link2this=this;
function pMet(){trace(link2this.a);}
this.met=function(){pMet();}
}
var o1=new Class1();
o1.met();
Можно так:
function Class2(){
var a = "for __etc"; //приват свойство
function pMet(){
//вуаля
trace(this.a);//:) - Вы так рвались к this
}
pMet();//вызов объектом-функции локальной функции pMet
//нужно для открытия области видимости :)
}
var o2=new Class2();
Вы конешно напишите, что это не правильно... Но суть в реализации инкапсуляции, и она есть. Все остальное что вы скажите, я и так знаю (и сам это знаю) - #333 (http://www.flasher.ru/forum/showpost.php?p=748765&postcount=333)
Именно про это я и писал, уже давно: "доступ к переменным(свойствам) внешней функции-класса)".
Можно так:
function Class1(){
this.a="for __etc";
var link2this=this;
function pMet(){trace(link2this.a);}
this.met=function(){pMet();}
}
var o1=new Class1();
o1.met();
Можно так:
function Class2(){
var a = "for __etc"; //приват свойство
function pMet(){
//вуаля
trace(this.a);//:) - Вы так рвались к this
}
pMet();//вызов объектом-функции локальной функции pMet
//нужно для открытия области видимости :)
}
var o2=new Class2();
Вы конешно напишите, что это не правильно... Но суть в реализации инкапсуляции, и она есть. Все остальное что вы скажите, я и так знаю (и сам это знаю) - #333 (http://www.flasher.ru/forum/showpost.php?p=748765&postcount=333)
Боже мой, опять чертов костыль-ссылка. Давайте задам вопрос прямо: вы знаете, что такое call и apply? Не нужны мне приватные свойства, я их и без this получу, он мне не нужен для этого. Мне нужны публичные свойства экземпляра класса получить из this, без ссылки типа link2this. Вот код:
function Class1() {
this.a = 10; // _публичное_ свойство
function privateMethod() {
trace(this.a); // хочу, чтобы вывело 10
}
this.publicMethod = function() {
privateMethod();
}
}
o = new Class1();
o.publicMethod();
Напишите или исправьте вариант так, чтобы работало this.a в приватном методе без использования ссылок типа link2this. Заодно познакомитесь с новым (судя по всему) для вас методами в AS1 (и вы наконец поймете, может быть, о чем я говорил всю дорогу) и мы тихо-мирно закроем вопрос по поводу приватов.
chingachgoog
01.07.2008, 22:50
Приват и создан для инкапсуляции. Конечно, вы можете создать для себя правила, какие методы вызывать, какие нельзя и типа у вас инкапсуляция получилась. Отлично.
Инкапсуляция - это всего лишь механизм образования "черного ящика". Да, приват создан для усиления инкапсуляции, но сам по себе инкапсуляцию не обеспечивает.
А так как вы отказываетесь говорить, какие вы видите цели в привате, то глупо утверждать, что ничего подобного нет в AS1.
Да откройте википедию хотя бы, насчет должен.
Ага, отлично - википелия :) Там, кстати AS к ООП относят (явно не 3-й)
Ну так ДОЛЖЕН язык ООП иметь зарезервированное слово private? Простой вопрос: да или нет? (то же самое к словам class, interface)
...я даже не говорю, что AS1 вообще не ООП, он ООП, но с приставкой «псевдо» только лишь из-за того, что это самое ООП надо самому необходимо реализовывать... А я не считаю такой язык по-настоящему объектно-ориентированным, в котором надо эту ориентированность самому реализовывать.
Что значит САМОМУ? Есть синтаксические конструкции языка или нет, которые позволяют это делать? Есть. Правда почему-то их обозвали "хаками", "костылями" и т.п. Но это только с точки зрения ООП на классах. А как можно судить об AS1 как языке ООП с точки зрения AS3? Не хотите тогда посмотреть на AS3 с точки зрения AS1 и обозвать хаками interface? Нет? Правильно. Потомучто нужно смотреть с точки зрения общей парадигмы ООП.
Подтвердите свои слова кодом
function Polymorph(){
}
Polymorph.prototype.getAngle=function(angle){
trace(this.getSin(angle))
}
function Degree(){
}
Degree.prototype.getSin=function(angle){
function convert(){
return angle*Math.PI/180
}
return Math.sin(convert())
}
function Radian(){
}
Radian.prototype.getSin=function(angle){
return Math.sin(angle)
}
obj=new Polymorph()
Polymorph.prototype.__proto__=Degree.prototype
obj.getAngle(90) // 1
obj.getAngle(Math.PI/2) // 0.0274121335920443
Polymorph.prototype.__proto__=Radian.prototype
obj.getAngle(90) // 0.893996663600558
obj.getAngle(Math.PI/2) // 1
Хотите - перепишите на AS3 :)
А вы дальше моего предложения «iNils привел код, в котором нет объекта активации и код, в котором он является рутом.» вообще ничего читать не стали и сразу объявили меня в некомпетентности?
А где вы ДАЛЬШЕ сказали, что iNils ошибся? Надо думать забыли?
Оригинально, это лишний раз подтверждает то, что вы читаете ровно до того предложения и лепите ответ к одному предложению, не обращая внимания на другие.
Программист не должен знать низкоуровневые особенности кода
Ну значит вам не надо :)
А мне надо и интересно.
Инкапсуляция - это всего лишь механизм образования "черного ящика". Да, приват создан для усиления инкапсуляции, но сам по себе инкапсуляцию не обеспечивает.
А что обеспечивает инкапсуляцию, хотелось бы услышать.
А так как вы отказываетесь говорить
Я вами треплюсь уже 400 с лишним ответов в этой теме и я после этого отказываюсь? Если бы я отказывался, я бы тут вообще ни поста не оставил.
какие вы видите цели в привате
Инкапсуляция, инкапсуляция, инкапсуляция, черт вас возьми, сколько можно? Я понимаю, что мыслить проектами до 2 килострок какой-то там инкапсуляцией и полиморфизм с наследованием сложно, да. Ой, как я вас понимаю.
(явно не 3-й)
С потолка взяли?
Ну так ДОЛЖЕН язык ООП иметь зарезервированное слово private? Простой вопрос: да или нет? (то же самое к словам class, interface)
Да хоть назовите «коробочка», смысл от этого не меняется, не обеспечивает AS1 инкапсуляции, вам её самому надо реализовывать, с кучей недостатков. Вы придираетесь к самому наличию/отсутствию кейворда «private», а не к сути такого понятия, как приватность. Не реализована эта инкапсуляция на уровне языка в AS1, никаким образом, ни кейвордом, никак, вы это сами подтвердили высказыванием о том, что её можно легко реализовать. То, что у меня есть четыре колеса, вовсе не означает, что их можно назвать автомобилем. Вы из подручных средств пытаетесь собрать этот самый автомобиль, чтобы попытаться на нем поехать и при этом, всю эту кучу хлама, из которого собираетесь сделать автомобиль (не зная вообще, поедет ли он), уже называете это автомобилем.
Что значит САМОМУ?
Что значит? Наследование как реализовали? Через очень интересное свойство __proto__, очень документированное, руками. Не простым кейвордом extends без плясок, а аж пять строчек. Инкапсуляция как реализована? Последние страниц десять с горем пополам что-то сделали, и то, такой вариант не живет с наследованием, не говоря уже о забиванием памяти одинаковыми методами, которые даже экземпляру класса не принадлежат.
Есть синтаксические конструкции языка или нет, которые позволяют это делать? Есть.
Какие? extends — нету. private — нету. Интерфейсы? А что это такое? Ничего этого нет, вы для себя это придумываете, в мозгу, мол, вот такие методы вызывать нельзя, а эти переменны трогать тоже. Язык вам тут не поможет, он не умеет сам по себе такие вещи делать.
А как можно судить об AS1 как языке ООП с точки зрения AS3?
Потомучто нужно смотреть с точки зрения общей парадигмы ООП.
С точки зрения ООП как раз таки, а не AS3. AS3 взят в качестве примера, если хотите, можно взять в качестве примера Java или C#, не принципиально.
Не хотите тогда посмотреть на AS3 с точки зрения AS1 и обозвать хаками interface?
В AS1 нет полиморфизма, он просто настолько далек от этого, что просто не знает в принципе, что это такое.
function Polymorph(){
}
Polymorph.prototype.getAngle=function(angle){
trace(this.getSin(angle))
}
function Degree(){
}
Degree.prototype.getSin=function(angle){
function convert(){
return angle*Math.PI/180
}
return Math.sin(convert())
}
function Radian(){
}
Radian.prototype.getSin=function(angle){
return Math.sin(angle)
}
obj=new Polymorph()
Polymorph.prototype.__proto__=Degree.prototype
obj.getAngle(90) // 1
obj.getAngle(Math.PI/2) // 0.0274121335920443
Polymorph.prototype.__proto__=Radian.prototype
obj.getAngle(90) // 0.893996663600558
obj.getAngle(Math.PI/2) // 1
И где здесь мой вариант на AS3, переписанный под AS1? Где публичное свойство angle у экземпляра класса? Где работа приватного метода с ним? Где наследование свойства? Не вижу. Я вижу две функции, одна вызывает другую и молча возвращает посчитанное значение на основе аргумента. Никакой работы с экземпляром класса, гениально просто.
Я вас прошу написать точный аналог моего кода, который описывает все три принципа ООП в двух классах + интерфейс. Интерфейс и полиморфизм, вы, конечно, показать не сможете, ибо ни того, ни другого нет в AS1 и реализовать их собственными силами вам не удастся, покажите хотя бы код, являющийся точной копией моему, но на AS1. Т. е. те же свойства, приватность, методы, переопределение и т. д.
А где вы ДАЛЬШЕ сказали, что iNils ошибся? Надо думать забыли?
Вы меня объявили в некомпетентности, не удосужовшись прочитать дальнейший текст, каким тут боком iNils? Вы не прочитали текст до конца, потом тут же пишете тоже самое и говорите, что я что-то не понимаю? Оригинально.
Ну значит вам не надо :)
А мне надо и интересно.
Вот именно, что вам интересно. Вам нравится реализовывать ООП на коленке, это уже и так понятно.
Если чесно, я уже потерял всякую надежду на то, что здравый смысл когда-нибудь возьмет верх =) Знаете, доказать, что Деда Мороза нету, технически не возможно, и тем не менее... Так же и с вами, на любой разумный аргумент отыскивается все больше и больше далеко идущих в своей абсурдности контраргументов. =) Но все равно, сколько бы вы ни старались, убедить в том, что междугородние поездки на самокате ни в чем не успупают электричкам у вас не получится =) И тем не менее, вы все равно будете называть самокат ультимативным средством междугороднего сообщения =)
И возвращаясь к истокам темы :D то, что вы теперь хотите от Adobe - это приделать к самокату реактивный двигатель, а то что-то он стал от электрички отставать, и вообще, семь потов сойдет, пока на другой конец города доедешь, какое там - даже на дачу съездить никаких сил нет!
По этому, речь идет только о глобальных функциях (this==undefined), а в методах - все OK.
Я прокоментирую:
function a () {
trace (this);
}
function b(){
trace (this);
a();
}
new b(); // создается экземпляр класса b()
не знаю... Очевидно что функция a не относится к объекту класса b(), это только ссылка на внешнюю функцию, которая лежит на таймлайне (_level0)
Я уже писал, что все что находится вне тела класса - не копируется при создании экземпляра, а получает ссылку ...
А это прокомментируете?
function a () {
trace (this);
}
function b () {
trace (this); //[object Object]
this.c = a;
a (); //_level0
this.c (); //[object Object]
trace (this.c == a); //true
}
new b ();
Знаете, доказать, что Деда Мороза нету, технически не возможно, и тем не менее... Как нет? Зимой на форуме тусовался, сам видел :D
Если чесно, я уже потерял всякую надежду на то, что здравый смысл когда-нибудь возьмет верх =) Знаете, доказать, что Деда Мороза нету, технически не возможно, и тем не менее... Так же и с вами, на любой разумный аргумент отыскивается все больше и больше далеко идущих в своей абсурдности контраргументов. =) Но все равно, сколько бы вы ни старались, убедить в том, что междугородние поездки на самокате ни в чем не успупают электричкам у вас не получится =) И тем не менее, вы все равно будете называть самокат ультимативным средством междугороднего сообщения =)
И возвращаясь к истокам темы :D то, что вы теперь хотите от Adobe - это приделать к самокату реактивный двигатель, а то что-то он стал от электрички отставать, и вообще, семь потов сойдет, пока на другой конец города доедешь, какое там - даже на дачу съездить никаких сил нет!
Подписываюсь под каждой буквой :)
Копии своего кода я все-равно не получу, а убеждать индейца в том, что базука круче его тамагавка мне уже, честно говоря, осточертело.
chingachgoog
02.07.2008, 01:07
А что обеспечивает инкапсуляцию, хотелось бы услышать.
По сути - только оговоренный интерфейс "черного ящика": мы знаем как и что туда кладем и знаем как и что достаем. Что происходит внутри - не важно. Вот и все, без приватов и т.п.
Инкапсуляция, инкапсуляция, инкапсуляция, черт вас возьми, сколько можно?
Инкапсуляция достижима и без приватности, так что вы опять не ответили на вопрос о цели приватности.
С потолка взяли?
Там же к ООП относят и JS - не о чем не говорит?
...не обеспечивает AS1 инкапсуляции, вам её самому надо реализовывать, с кучей недостатков.
Точно также надо ее самому обеспечивать в AS3.
Вы придираетесь к самому наличию/отсутствию кейворда «private», а не к сути такого понятия, как приватность. ... То, что у меня есть четыре колеса, вовсе не означает, что их можно назвать автомобилем.
Ровно поэтому я и спрашиваю о ЦЕЛИ приватности.
Что значит? Наследование как реализовали? Через очень интересное свойство __proto__, очень документированное, руками. Не простым кейвордом extends без плясок, а аж пять строчек.
Т.е. extends - это не самому реализовывать? А __proto__ - самому? И какие еще пять строчек?
А то что поначалу __proto__ был "очень документирован" - так это вина адоба, а не AS1, не так ли?
Инкапсуляция как реализована? Последние страниц десять с горем пополам что-то сделали, и то, такой вариант не живет с наследованием, не говоря уже о забиванием памяти одинаковыми методами, которые даже экземпляру класса не принадлежат.
Вы опять путаете инкапсуляцию с приватностью, а пока не будут оговорены ЦЕЛИ приватности - спорить тут глупо.
Какие? extends — нету. private — нету. Интерфейсы? А что это такое? Ничего этого нет, вы для себя это придумываете, в мозгу, мол, вот такие методы вызывать нельзя, а эти переменны трогать тоже. Язык вам тут не поможет, он не умеет сам по себе такие вещи делать.
Так я уже задал простейший вопрос - эти слова являются ОБЯЗАТЕЛЬНЫМ признаком языка ООП? Да или нет? Тогда зачем от прототипного языка требовать синтаксиса языка на классах?
В AS1 нет полиморфизма, он просто настолько далек от этого, что просто не знает в принципе, что это такое.
В моем коде он есть или у вас есть особое видение смысла полиморфизма?
И где здесь мой вариант на AS3, переписанный под AS1?
А где мой вариант переписанный под AS3?
Мой код показывает основные три принципа ООП в самом примитивном виде, не более. Просто пример.
Вы меня объявили в некомпетентности, не удосужовшись прочитать дальнейший текст, каким тут боком iNils? Вы не прочитали текст до конца, потом тут же пишете тоже самое и говорите, что я что-то не понимаю? Оригинально.
Не буду спорить - публика рассудит насколько "удачно" вы вплели в свой пост iNils-а.
Вот именно, что вам интересно. Вам нравится реализовывать ООП на коленке, это уже и так понятно.
Не исключено, что знай мы работу AVM2, то и private был бы по-другому рассмотрен.
И возвращаясь к истокам темы то, что вы теперь хотите от Adobe - это приделать к самокату реактивный двигатель, а то что-то он стал от электрички отставать, и вообще, семь потов сойдет, пока на другой конец города доедешь, какое там - даже на дачу съездить никаких сил нет!
Электричка и самокат - это AVM1 и AVM2, так?
От адоба бы хотелось как минимум раскрыть все возможности самоката (сознательно им прикрытые).
Как максимум - сделать такую электричку, чтобы на ней ездили как левши, так и правши (как раньше на самокате). AS1 вполне такое позволяет.
По сути - только оговоренный интерфейс "черного ящика": мы знаем как и что туда кладем и знаем как и что достаем. Что происходит внутри - не важно. Вот и все, без приватов и т.п.
Договорившись с самим собой, ага. Не пойдет.
Инкапсуляция достижима и без приватности, так что вы опять не ответили на вопрос о цели приватности.
Я ОТВЕТИЛ, ЧЕРТ ВАС ДЕРИ! Вы мне уже конкретно начинаете напоминать персонажа, звонившнего в службу поддержки Стрима. Не опускайтесь до его уровня, прошу вас.
Там же к ООП относят и JS - не о чем не говорит?
Не говорит. Что AS1, что JavaScript, оба не имеют средств для контроля принципов ООП. Точка, больше повторять не буду, ибо надоело.
Точно также надо ее самому обеспечивать в AS3.
private+interface. Всё. Такие понятия есть и в AS3, и в Java, и в C# и ещё куче языков. В AS1 — НЕТ! Они отсутствуют по определению.
Ровно поэтому я и спрашиваю о ЦЕЛИ приватности.
См. выше.
Т.е. extends - это не самому реализовывать? А __proto__ - самому? И какие еще пять строчек?
А то что поначалу __proto__ был "очень документирован" - так это вина адоба, а не AS1, не так ли?
Вы опять путаете инкапсуляцию с приватностью, а пока не будут оговорены ЦЕЛИ приватности - спорить тут глупо.
Бла-бла-бла, опять же, см. выше ответ.
Так я уже задал простейший вопрос - эти слова являются ОБЯЗАТЕЛЬНЫМ признаком языка ООП? Да или нет?
ДА!
Тогда зачем от прототипного языка требовать синтаксиса языка на классах?
Я не требую, это вы заявили, что AS1 — чисто ООП язык. Это не так, это псевдо-ООП максимум. Точка.
В моем коде он есть или у вас есть особое видение смысла полиморфизма?
Где? У вас один и тот же класс меняет поведение и родителя, это не полиморфизм, а полная чушь. Примерно как японец вдруг почернел и стал негром. Полиморфизм подразумевает наличие нескольких объектов, с одним интерфейсом. Внутренняя реализация в них разная, но интерфейс к объектам — одинаков. Вот это называется полиморфизмом, а не то, что вы накорябали тамагавком. У вас тележка с четырьмя колесами преобразовывается в автомобиль, у которого тоже четыре колеса.
А где мой вариант переписанный под AS3?
Нигде, с вашим понятием полиморфизма такое можно написать только на JavaScript и других прототипных языках, у которых стол может стать стулом без проблем простой заменой прототипа.
Мой код показывает основные три принципа ООП в самом примитивном виде, не более. Просто пример.
Угу, особенно полиморфизм удался.
вот, немножко позитива на ночь глядя =) Сто лет уже инструменты в руки не брал =)
ЗЫ. *Коренные жители америки с распростертыми объятиями приняли новые технологии*
wvxvw, +1... надо было вывешивать постов этак 200 назад ;)
класс!
chingachgoog
02.07.2008, 12:53
iNils, riden, если хотите разобраться с объектами активации посмотрите посты 408 (http://flasher.ru/forum/showpost.php?p=749242&postcount=408) и 410 (http://flasher.ru/forum/showpost.php?p=749253&postcount=410).
function a () {
trace ("f a this="+this);
trace ("f a =="+(this.__proto__==b.prototype))
}
function b () {
trace ("f b this="+this); //f b this=[object Object]
trace ("f b =="+(this.__proto__==b.prototype)) // f b ==true т.е. this - это в данном случае объект созданный оператором new
this.c = a;
a (); //f a this=_level0
//f a ==false функция а является методом рута, а не объекта созданного new
this.c (); //f a this=[object Object]
//f a ==true функция a является методом объекта созданного new
trace (this.c == a); //true
}
new b ();
wvxvw, улыбнуло :)
Договорившись с самим собой, ага. Не пойдет.
Что значит пойдет/не пойдет? Принципы ООП довольно общие и абстрактные. В них кстати вообще даже о классах речи не идет.
Тоже самое с принципом инкапсуляции. С точки зрения парадигмы ООП инкапсуляция достигается без всяких приватов. Примите это как факт. А вот с точки зрения любителей мертвых языков или других сторонников ООП на классах, это понятие (инкапсуляции) может быть более конкретизирована и ограничено. Но к общей парадигме ООП это уже никак не относится.
Я ОТВЕТИЛ, ЧЕРТ ВАС ДЕРИ! ...
...См. выше.
...Бла-бла-бла, опять же, см. выше ответ.
Я понял - для вас инкапсуляция не достижима без привата. В этом случае вы, конечно, ответили. Но эта ваша "инкапсуляция" - лишь частный случай инкапсуляции парадигмы ООП.
Не говорит. Что AS1, что JavaScript, оба не имеют средств для контроля принципов ООП. Точка, больше повторять не буду, ибо надоело.
Т.е. смотрим википедию и где нравится - цитируем, где не нравиться - опровергаем, так __etc? А ведь я всего лишь показал уровень википедии - не более.
private+interface. Всё. Такие понятия есть и в AS3, и в Java, и в C# и ещё куче языков. В AS1 — НЕТ! Они отсутствуют по определению.
...
ДА!
...Я не требую, это вы заявили, что AS1 — чисто ООП язык. Это не так, это псевдо-ООП максимум. Точка.
Ну вы бы так и сказали сразу, что не считаете прототипные языки - "истинно" ООП языками. Зачем стесняться?
Где? У вас один и тот же класс меняет поведение и родителя, это не полиморфизм, а полная чушь. Примерно как японец вдруг почернел и стал негром. Полиморфизм подразумевает наличие нескольких объектов, с одним интерфейсом. Внутренняя реализация в них разная, но интерфейс к объектам — одинаков. Вот это называется полиморфизмом
...
Вы опять абстрактное понятие парадигмы ООП суживаете до рамок ООП на классах. Полиморфизм - понятие действительно более интуитивное, чем конкретное (чего одно название стоит!). Но на самом деле тут не так все сложно. Это просто код, который ведет к различным результатам, в зависимости от наследования.
Интерфейсы - это всего лишь ОДИН ИЗ СПОСОБОВ ДОСТИЖЕНИЯ полиморфизма.
Да я взял один и тот же класс, но лишь для подчеркивания возможностей AS1. Метод getAngle полиморфен и в этом случае.
Нигде, с вашим понятием полиморфизма такое можно написать только на JavaScript и других прототипных языках, у которых стол может стать стулом без проблем простой заменой прототипа.
А что вас так злит в прототипных языкак? Что они смеют называться языками ООП? :) По-моему указанная возможность - весьма крутая вещь AS1.
Угу, особенно полиморфизм удался.
В рамках парадигмы ООП - удался. Код метода - один. Результат в зависимости от наследования - разный.
Ну вы бы так и сказали сразу, что не считаете прототипные языки - "истинно" ООП языками. Зачем стесняться?
Я об этом последние все 400 постов в теме говорил. На этом я собираюсь прекратить дискуссию по этому поводу. У вас свое мировозрение и вы можете называть телегу с двигателем автомобилем исходя из определения, а я не могу, вот и все.
А картинка знатная, да.
если хотите разобраться с объектами активации посмотрите посты 408 (http://flasher.ru/forum/showpost.php?p=749242&postcount=408) и 410 (http://flasher.ru/forum/showpost.php?p=749253&postcount=410).
Ну давай. Смотрим пост 410, а именно его часть
А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)
привожу следующий код (смотреть с компиляцией под 6-ый плеер)
cx = 1;
function a () {
}
function b () {
function c () {
ASsetPropFlags (this, null, null, 1);
for (var i in this) {
trace ("\t" + i + " = " + this[i]);
}
}
trace ((cx++) + ".");
a.d = c;
c ();
trace ((cx++) + ".");
a.d ();
}
b ()
new b ();
setTimeout (b, 1000);
он выдает следующее
1.
c = [type Function]
arguments =
this = _level0
2.
d = [type Function]
prototype = [object Object]
__proto__ = [object Object]
constructor = [type Function]
3.
c = [type Function]
super = [object Object]
arguments =
this = [object Object]
4.
d = [type Function]
prototype = [object Object]
__proto__ = [object Object]
constructor = [type Function]
5.
c = [type Function]
super = [type Function]
arguments =
this =
6.
d = [type Function]
prototype = [object Object]
__proto__ = [object Object]
constructor = [type Function]
Особенно интересен пункт 5. Функция вложена, this есть и должен указывать на объект активации, а он показывает undefined (хотя там пустота, надо помнить, что в 6-ом плеере undefined не выводится в трейс, если в трейсе есть еще что-то). То есть, свойства объекта активации есть, а самого объекта нет! Это и доказывает, что this не ссылается на объект активации, о чем было заявлено в посте 410.
Дополнение, наткнулся на пост (http://www.flash-mx.ru/forum/topic_show.pl?tid=893) в блоге Нокса. Там он цитирует спецификацию ECMA-262
The activation object is purely a specification mechanism. It is impossible for ECMAscript program to access the activation object. It can access members of the activation object, but not the activation object itself.
Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.
chingachgoog
02.07.2008, 16:38
Ну давай.
...
привожу следующий код (смотреть с компиляцией под 6-ый плеер)
Это изначальная ошибка. Дело не в компиляции под 6-й плеер, а в наличии самого 6-го плеера. Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен (по крайней мере для for in с ASsetPropFlags). Разумеется это было сделано не для того чтобы "прикрыть лавочку" или "не повадно было".
Т.е. если ты хочешь протестить свой код, то найди 6-й флеш-редактор (тот что MX) и протести там.
Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.
Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно :)
add:
function b () {
function c () {
trace(this)
z=this
}
c ();
}
b ()
trace(z)
ASsetPropFlags (z, null, null, 1);
for (var i in z) {
trace ("\t" + i + " = " + z[i]);
}
Получаем:
[type Object]
[type Object]
c = [type Function]
arguments =
this = _level0
И ничего удивительного тут нет. Реальный this функции "с" показывает, как и ожидается на объект активации функции "b".
А этот объект активации (функции "b", а не "с"!) содержит в себе указатель this, куда? Правильно, на рут - тот объект, чьим методом является функция "b".
Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно :)Нельзя. Или будешь спорить с спецификацией?:D Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.
Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступенГурского надо внимательнее читать :) Он написал, что на быстрые регистры перевели this и arguments, а не объект активации.
chingachgoog
02.07.2008, 17:50
Нельзя. Или будешь спорить с спецификацией?:D Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.
Добавил в пост выше :) (то что называется z - и есть ссылка на объект активации)
Гурского надо внимательнее читать :) Он написал, что на быстрые регистры перевели this и arguments, а не объект активации.
Точно.
Теперь продолжим с "доказывающим примером" :)
function b () {
function c () {
trace(this)
z=this
}
c ();
}
setTimeout (b, 1000);
setTimeout(function(){
trace(z)
ASsetPropFlags (z, null, null, 1);
for (var i in z) {
trace ("\t" + i + " = " + z[i]);
}
},2000)
выводит:
[type Object]
[type Object]
c = [type Function]
super = [type Function]
arguments =
this =
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации. ЧТД
А вот почему у функции-оболочки указатель this пустой - это надо спросить у тех, кто знает как устроены сетинтервалы и сеттаймауты.
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.Цитирую Гурского, страница 205
this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция
И спецификацию 2-ой раз
Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.
Поэтому сослаться на объект активации мы не можем, это механизм плеера, а не кода.
chingachgoog
02.07.2008, 19:08
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.
Цитирую Гурского, страница 205
this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция
Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.
И спецификацию 2-ой раз
...
Поэтому сослаться на объект активации мы не можем, это механизм плеера, а не кода.
Движенья нет - сказал один мудрец. Другой встал и начал пред ним ходить... :)
Какое мне дело до спецификации, когда я только что при тебе сделал указатель на объект активации (z) и он действует уже ПОСЛЕ выполнения функции? В любое время к нему можно обратиться.
OOP AS1 В ДЕЙСТВИИ 3 in 1: инкапсуляция, наследование, полиморфизм
Следует заметить что НАСЛЕДОВАНИЕ в AS1 - более широкое понятие. Здесь - наследование на уровне экземпляр-класс, наследование свойств прототипов класса, надкласса, наследование свойств созданных внутри конструктора и пр... В этом плане AS1 более гибок... такое наследование позволяет экономить память, ресурсы компьютора.
Я покажу наследование - в "классическом" понимании, то есть как в AS3, Java, C#. Код:
*IA - in action, в действии
//Класс Rectangle - надкласс класса Square
function Rectangle(width,height){
this.test = "test";
var l2this=this;
function Private(){trace(l2this.test);}//приват метод// ИНКАПСУЛЯЦИЯ IA
this.callPrivate=function(){Private();}
this.width=width;
this.height=height;
this.ctest=function(){l2this.test="null";}
this.getArea=function(){return l2this.width*l2this.height;}
}
//наследование свойств созданных в конструкторе - НАФИГ
//Square.prototype = new Rectangle();
//для того что бы были видны свойства в прототипе надкласса - НАФИГ
//Square.prototype.__proto__= Rectangle.prototype;
//Класс Square - Подкласс класса Rectangle
function Square(size){
this.superClass = Rectangle;
//вызов этой функции обеспечивает истинный Полиморфизм :)
//Передача параметров в надкласс //аналог super
this.superClass(size,size);//вызывается каждый раз при создании экземпляра
this.size=size;
ASSetPropFlags(this,"width,height",7,null);//скрытие, защита непотребных свойств
//trace(this.width);//4, 5 //НАСЛЕДОВАНИЕ IA #1 //OK, свойства видны
}
//создание объектов с различной площадью
var sq=new Square(4); //ПОЛИМОРФИЗМ IA #1
var sq2=new Square(5);
//sq.test="0";trace(sq2.test);//test //ПОЛИМОРФИЗМ IA #2 :)
//метод изменяет свойство test экземпляра sq
//sq.ctest(); trace(sq.test);trace(sq2.test);//null test//все ОК. ПОЛИМОРФИЗМ IA #3
//sq.width=30;trace(sq.width);//4 - OK // не переопределяется //ЗАЩИТА РАБОТАЕТ
//trace(sq2.width);//5 //у экземпляра есть свойство надкласса //НАСЛЕДОВАНИЕ IA #2
//у экземпляров есть метод надкласса
//trace(sq.getArea());//16 //ПОЛИМОРФИЗМ IA #4 + НАСЛЕДОВАНИЕ IA #3
//trace(sq2.getArea());//25 //ПОЛИМОРФИЗМ IA #4 + НАСЛЕДОВАНИЕ IA #3
AS1 - истинный ООП (2 __etc). Можно говорить лишь о качестве, а не о существовании.
Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.Ты не верно истолковываешь что такое объект активации. Object и объект активации это совсем разные вещи.
function b () {
trace ("\tb:" + (this instanceof Object));
function c () {
trace (this);
z = this;
trace ("\t\t\t" + (this instanceof Object));
}
c ();
}
trace ("E")
e = new b ();
trace ("\tz:" + (z instanceof Object));
trace ("R")
r = b ();
trace ("\tz:" + (z instanceof Object));
trace ("Z")
setTimeout (b, 10);
setTimeout (function () {
trace (z);
trace ("\tz:" + (z instanceof Object));
}, 20);
E
b:true
[type Object]
false
z:false
R
b:true
[type Object]
false
z:false
Z
b:false
[type Object]
false
[type Object]
z:falseА ты знаешь, что любой объект наследуется от Object
Какое мне дело до спецификации...Раз ты создал собственную область понимания, то разговор закончен.
riden, я просил точную копию своих классов. Мне не нужны другие примеры, я привел пример и прошу реализовать его же, на AS1. Без какого-либо вмешательства в схему.
Моего примера вполне достаточно. Думаю и так все понятно. Если вам надо, сами и переписывайте свой код.
Моего примера вполне достаточно. Думаю и так все понятно. Если вам надо, сами и переписывайте свой код.
А пример, между прочим, был примитивный. Ну на нет и суда нет, я не заставляю.
chingachgoog
03.07.2008, 00:35
Ты не верно истолковываешь что такое объект активации. Object и объект активации это совсем разные вещи.
...А ты знаешь, что любой объект наследуется от Object
iNils, а где я говорил, что объект активации принадлежит к Object? Что-то я совсем не пойму этот твой пост.
В посте 431 (http://flasher.ru/forum/showpost.php?p=749515&postcount=431), вроде четко обозначили область дискуссии:
Ну давай. Смотрим пост 410 (http://flasher.ru/forum/showpost.php?p=749253&postcount=410), а именно его часть
А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)
...Особенно интересен пункт 5. Функция вложена, this есть и должен указывать на объект активации, а он показывает undefined ...То есть, свойства объекта активации есть, а самого объекта нет! Это и доказывает, что this не ссылается на объект активации, о чем было заявлено в посте 410.
Я показал, что ты ошибочно считал, будто this внутренней функции НЕ ссылается на объект активации внешней функции? Вроде показал - у тебя теперь у самого в коде правильно стоит trace (this) во вложенной функции, который исправно и показывает [type Object].
А уж то, являеется ли объект активации вообще объектом (в смысле Object) и чем вообще является - это уже другая интересная тема. По крайней мере мне интересно.
NB!
Интересно, только так ненавистный многими Гурский занимался этой проблемой или нет?
В ActionScript при вызове функции создается особая структура, называемая объектом активации. Его назначение сводится к управлению выполнением статичного кода функции. В частности, в нем хранится точка возврата функции, чем решается проблема рекурсии, характерная для правила копирования. При завершении выполнения кода объект активации разрушается. Последующий вызов функции будет сопровождаться созданием нового, никак не связанного с первым объекта активации. Во время выполнения сценария может быть создано любое число объектов активации, причем это никак не повлияет на их шаблон — определение функции.
Если одна функция вызывает другую, то создается новый объект активации и начинается выполнение соответствующего ему сегмента кода.
...Объект активации — это просто удобный инструмент выполнения функции, создаваемый Flash плейером.
Объект активации и код функции вместе образуют структуру, называемую активацией функции.
В общем случае для конструирования конкретной активации функции на основании ее определения нужно скопировать в отдельную область памяти шаблон подпрограммы. Однако дублировать его целиком нерационально, поэтому он делится на две части. Первая, статическая часть, называемая сегментом кода, хранит выполняемый код. Она неизменна для каждой активации, и поэтому в выполняющейся
программе всегда присутствует только один сегмент кода. Вторая, динамическая часть, хранит список переданных функции параметров, локальные переменные, точку возврата и разного рода служебные данные, такие как, например, номер строки, которая должна быть выполнена в сегменте кода следующей, или значение указателя this. Именно ее подразумевают, когда говорят об объекте активации. Его компонентом в ActionScript является уже знакомый нам объект arguments.
Таким образом, функция на этапе выполнения представляет собой два разных по своей сущности элемента. Определение действий ...статично и ничем не отличается от остального кода. Объект активации, наоборот, индивидуален для каждого вызова функции и представляет собой запись, хранящую служебную информацию.
Поэтому, iNils, ты зря горячишься:
Раз ты создал собственную область понимания, то разговор закончен.
Давай создадим общую область понимания :)
Наверное в спецификации под "объектом активации" понимали объект активации в целом, как структуру ФП. У нас же "z" - очевидно только часть этого целого объекта активации, про который Гурский и говорит, что ее (часть) и подразумевают под "объектом активации".
riden, __etc же сказал, что для него ЛЮБОЙ прототипный язык ООП - это "псевдо"-ООП. В частности потомучто там нет зарезервированных слов приват, интерфейс и (самое страшное!) даже класс :) Ну вот такая снобистская позиция программиста ООП на классах. Имеет полное право. Классификация - вещь переменчивая. Сегодня прототипные языки относят к ООП, завтра - не относят, послезавтра еще что-нибудь...
Мнение etc к классификации в целом отношения не имеет.
Adobe не будет развивать AS1/2.
Более того, никто не станет делать Papervision, Away3D, Box2d, APE и прочее под AS1/2.
Подавляющее большинство новых разработок делают и будут делать на AS3.
---
Плохо это для кого-то или хорошо, но AS1/2 рано или поздно вымрет. Не потому что плох, а просто его время прошло.
Ошибка это Adobe или нет - все равно, просто все равно. А кому не все равно - будет спорить до бесконечности. Причем в пустую.
chingachgoog
03.07.2008, 15:27
Мнение etc к классификации в целом отношения не имеет.
Но спорит-то он исходя из своей классификации :) Для конценсусса сначала надо прийти к одной классификации, а потом уже обсуждать вопрос.
Вот, кстати, улыбнуло:
http://flasher.ru/forum/showpost.php?p=648842&postcount=8
AS2 - это псевдо ООП, т.к. на самом деле (как выше уже писали) после компиляции мы получаем AS1
Почти AS1. И вовсе не псевдо. Что там выходит после компиляции вообще совершенно не должно волновать.
Вот, кстати, улыбнуло:
http://flasher.ru/forum/showpost.php?p=648842&postcount=8
И что? AS1 от этого не станет истинно объектно-ориентированным. А AS2 — неоднозначная вещь. До компиляции, в момент компиляции — это ООП-язык. После компиляции от него и следа не остается.
chingachgoog
05.07.2008, 20:09
И что? AS1 от этого не станет истинно объектно-ориентированным.
Я думаю, вам стоит говорить иначе, например, так:
"AS1 от этого не станет истинно объектно-ориентированным, в моем понимании истинности ООП".
Иначе вы вводите в заблуждение публику, особенно учитывая ваш статус.
AS1 - язык ООП, полностью отвечающий принципам ООП в их классическом (академическом, если хотите, понимании).
Вы можете быть не согласны с современной классификацией, как впрочем можете называть синий цвет - пурпурным. Ваше право. Но вы должны в таком случае показывать собеседнику, что пользуетесь другими точками отсчета.
А AS2 — неоднозначная вещь. До компиляции, в момент компиляции — это ООП-язык. После компиляции от него и следа не остается.
Я и говорю - улыбнуло и продолжает улыбать:
Что там выходит после компиляции вообще совершенно не должно волновать.
:)
Слежу за спором примерно с таким же интересом, как можно следить за спором о дискуссии о существовании бога или о том, что было до Большого Взрыва - по крайней мере смысловую нагрузку он такую же несет.
Но
Но вы должны в таком случае показывать собеседнику, что пользуетесь другими точками отсчета.
что-то вдруг улыбнуло и развело на оффтоп :) Пользуйтесь тогда уж совсем привычной терминологией для __etc, etc "пользуйтесь иным timezero" :)
chingachgoog, независимо от того, что я отвечу, вы все равно будете со мной спорить, просто по факту. Вы используете собственную область понимания, поэтому смысла в продолжении беседы никакого, в общем-то вся беседа схожа с тем, что описал Сайлас.
Да ладно __etc, вы говорили о "вполне конкретной области понимания". Говорили о трех принципах. А точнее: вы говорили что в AS1 технически не возможен полиморфизм. :) Я показал обратное.
Посему повторю: AS1 - ООП язык (и бросьте вы разговоры про "псевдо"),можно говорить лишь о качестве, а не о существовании.
Хотя вы, можете по прежнему из принципа утверждать, что "AS1 - псевдо ООП".:)
BlooDHounD
06.07.2008, 16:06
Сайлас, такой же как и AS1 :)
Ну я про это же. Они вообще очень похожи.
Мое мнение:
Да, реализацию ОО в JS, AS1 создать можно и нельзя не создавать: к примеру сложные JS скрипты без ОО реализации вообще трудно написать, а потом разобрать. И если смотреть с этой точки зрения, то они ОО.
Нет, встроенных конструкций ОО языка тут нет.
Да, AS3 стал почти полностью встроенно поддерживать ОО конструкции.
Нет, Adobe больше не будет развивать AS1 и AS2.
Да, Adobe теперь будет развивать и внедрять AS3.
О чем спор я забыл? Можно ли реализовать ООП на AS1 - можно. Является ли AS1 ОО языком - нет. С другой стороны AS3, хоть и имеет конструкции, все же в глубине своей скриптовый язык и ООП в нем оболочка :) Это не C++ и не Java
Статья википедии:Comparison of programming languages (http://en.wikipedia.org/wiki/Comparison_of_programming_languages). Таблица поддерживаемых парадигм:
ActionScript 3.0: imperative, object-oriented, event-driven.
C++: imperative, object-oriented, generic.
Java, C#: imperative, object-oriented, generic, reflective.
JavaScript: imperative, object-oriented, functional, reflective.
1. Статья в википедии писалась такими же людьми, имеющими собственное мнение.
2. Ну блин, я все же не пойму, и мне никто не ответил: какая разница назовете вы АС1-3 или JS ОО языком?
Есть факт - наличие тех или иных возможностей. А назовете вы это лицом или попой разницы никакой. В чем смысл спора?
... я все же не пойму ... В чем смысл спора?
Я тоже не пойму >> 333 (http://www.flasher.ru/forum/showpost.php?p=748765&postcount=333)
С другой стороны AS3, хоть и имеет конструкции, все же в глубине своей скриптовый язык и ООП в нем оболочка Это не C++ и не Java
ActionScript - никогда не был скриптовым языком. А JS - скриптовый. AS3 - из той же оперы, что Java, только медленней и со своей, более узкой, областью применения.
Ну конечно не был, то-то он на стандарте ECMAScript основан (как в принципе JS) :) Ну а уж AS 1.0 вообще от JS отличий мало имеет.
А то, что AS3.0 мало напоминает скриптовый язык, я как раз постом выше сказал.
Ну конечно не был, то-то он на стандарте ECMAScript основан (как в принципе JS).
И AS3 тоже на стандарте ECMAScript основан, представь себе (ECMAScript-262 edition 4). :)
Стандартизация не имеет отношение к "скриптовости" (поиск рулит) языка. А "скриптовость" - не имеет отношение к структуре, характеру кода, "маштабности" программирования. Впрочем, даже так, AS 1.0 с самого начала (Flash 5) появился как серьезный язык программирования (а ведь кроме синтаксиса, существует библиотека языка: стандартные объекты (классы), что и определяет его задачи).
chingachgoog
07.07.2008, 12:08
Слежу за спором примерно с таким же интересом, как можно следить за спором о дискуссии о существовании бога или о том, что было до Большого Взрыва - по крайней мере смысловую нагрузку он такую же несет.
Вы используете собственную область понимания, поэтому смысла в продолжении беседы никакого...
А я все больше и больше прихожу к согласию с выводом iNils, что этот топик очень полезный и здесь видно всех насквозь.
Потомучто тут прямо высказались (или прямо отказались высказаться) об основах, об том, что в других местах только подразумевали и намекали.
Об том, что даже не знали или предпочли бы чтобы и остальные продолжали не знать.
В этом отношении, пусть топик и в игнорируемом мной флейме, но он мне нравится.
Сайлас
Мое мнение:
Да, реализацию ОО в JS, AS1 создать можно и нельзя не создавать...
Не скажу за JS, но ценность AS1 вижу и в том, что он разрешает использовать себя как угодно: хоть как язык ООП, хоть как просто скрипт.
Нет, встроенных конструкций ОО языка тут нет.
Да, AS3 стал почти полностью встроенно поддерживать ОО конструкции.
Что значит "встроенные конструкции"?. Они есть в AS1, но просто не относятся к ООП на классах.
Нет, Adobe больше не будет развивать AS1 и AS2.
Да, Adobe теперь будет развивать и внедрять AS3.
Поживем увидим. :)
О чем спор я забыл? Можно ли реализовать ООП на AS1 - можно. Является ли AS1 ОО языком - нет.
Это как так? Реализовать можно, но языком ООП не является???
Почему тогда, объясните? Или сразу вслед за __etc тогда скажите, что не считаете прототипные языки "истинно" ООП языками :)
А спор в последний раз удачно подвел под начало riden как раз в посте 333 (http://www.flasher.ru/forum/showpost.php?p=748765&postcount=333):
Кстати, ничего не мешало Адобу оставить два синтаксиса во второй виртуальной машине...Все можно реализовать на АС1.
И AS3 тоже на стандарте ECMAScript основан, представь себе (ECMAScript-262 edition 4). А я что написал? :)
Впрочем, даже так, AS 1.0 с самого начала (Flash 5) появился как серьезный язык программированияНу с этим я в принципе не согласен. AS1 был чистейшим скриптовым языком.
А, в третий раз повторюсь, в AS3 от скриптового языка мало что осталось. Хоть и осталось.
P.S. И на этом я обсуждение прекращаю, т.к. считаю его пустой тратой времени.
Это как так? Реализовать можно, но языком ООП не является???
Совершенно верно. Нужно не реализовывать, а работать с готовой реализацией на уровне языка. На ассемблере ООП реализовать можно? Можно. Ассемблер — ОО? Нет. Точно также, как и AS1.
Что касается насквозь всех видно, то вы правы. Особенно видно тех, кто из кожи вон вылезет, но не хочет физически разделять код на логические части и зачем-то реализовывает ООП при этом. Нафиг вам ООП?
Я не знаю, а что кому-то легче станет, от того, что АС1 назовут ОО языком? Какая разница - главное набор удобных и хорошо работающих инструментов в языке. В АС1 таких инстументов меньше, и для имитации каких-то простых вещей из более современных языков в АС1 приходится на уши становиться, и в итоге все равно будет работать плохо... И реализовать их не поменяв язык кординально нет никакой возможности (т.е. чтобы поменять их нужно выбросить АС1-овый Object и Function + изменить способ записи перемнных - ну и что тогда останется?)...
Изменилось в целом представление о том, как надо програмировать, люди нашли новые, более рациональные и удобные способы, и этот процесс будет продолжаться, когда-нибудь и АС3 морально устареет... Появилась куча задач, решать которые на АС1 ну никак невозможно. Например, проэкт над которым сейчас работаю технически невозможно даунгрейдить на АС1, потому как кроме того, что использует работу с бинарными сокетами, работу с массивами байтов, прямое общение с SQL таблицами, должен работать быстро. При чем скорость имеет ключевое значение, если я просто вместо того, чтобы посылать бинарные данные буду их кодировать в какой-нть base62 (самодельным энкодером), и посылать как текст - время обработки увеличится в разы, если не в десятки раз... а если у меня не будет быстрой итерации, типов данных вроде интеджер и т.п. я даже затрудняюсь себе представить сколько дней займет то, что делается сейчас в течение минут...
Вы конечно можете продолжать настаивать на том, что АС1, это замечательный и удобный инструмент для любых целей... единственное, что продолжая в том же духе вы раньше или позже окажетесь в ситуации, когда этот замечательный инструмент не будет востребован вообще...
chingachgoog
07.07.2008, 13:13
Совершенно верно. Нужно не реализовывать, а работать с готовой реализацией на уровне языка. На ассемблере ООП реализовать можно? Можно. Ассемблер — ОО? Нет. Точно также, как и AS1.
За ассемблер не скажу - изучал его еще на БК0010, а было это еще когда динозавры по Земле бегали :) Т.е. не помню уже, что за ассемблер такой...
А вот прототипные языки ООП (в т.ч. и AS1) имеют реализацию ООП на уровне языка. Разумеется она ДРУГАЯ, чем у ООП на классах. Но она ЕСТЬ.
Я-то уже понял, что для вас прототипные языки ООП - это "псевдо"-ООП языки. А остальные? Кто исходит из классического представления, что и прототипные языки ООП - это тоже нормальные языки ООП, просто отдельная его ветвь, безо всякого "псевдо"? Они слышат высказывания __etc про "псевдовость", про "хаки", "костыли" и прочий снобизм.
Вот тут-то эта ветка и становится особенно полезной. Не говоря уже о прочем ликбезе :)
Нафиг вам ООП?
А это я решаю сам исходя из конкретной задачи: нужно тут ООП или нет? Если нужно, то в каком объеме? И AS1 позволяет решать задачу при любом выборе (чем мне и нравится).
Я не знаю, а что кому-то легче станет, от того, что АС1 назовут ОО языком? Какая разница - главное набор удобных и хорошо работающих инструментов в языке. В АС1 таких инстументов меньше, и для имитации каких-то простых вещей из более современных языков в АС1 приходится на уши становиться, и в итоге все равно будет работать плохо... И реализовать их не поменяв язык кординально нет никакой возможности (т.е. чтобы поменять их нужно выбросить АС1-овый Object и Function + изменить способ записи перемнных - ну и что тогда останется?)...
Удобство - вещь индивидуальная. Мне очень удобно в AS1 реализовывать наследование и особенно делать это динамически.
А вот "нет никакой возможности" - это лукавство маркетологов адоба.
Появилась куча задач, решать которые на АС1 ну никак невозможно. Например, проэкт над которым сейчас работаю технически невозможно даунгрейдить на АС1, потому как кроме того, что использует работу с бинарными сокетами, работу с массивами байтов, прямое общение с SQL таблицами, должен работать быстро.
Вот тут вы путаете возможности AS1 как языка и возможности AVM1 как среды, где пока только и возможно AS1 использовать. Да, возможности AVM1 ограничены, но это вовсе не значит, что ограничены возможности AS1. Это значит, что адоб создал ограниченную AVM2, куда по той или иной причине не решился использовать AS1.
Вы конечно можете продолжать настаивать на том, что АС1, это замечательный и удобный инструмент для любых целей... единственное, что продолжая в том же духе вы раньше или позже окажетесь в ситуации, когда этот замечательный инструмент не будет востребован вообще...
Разумеется, если для AS1 не будет новой среды, о чем и речь. Мне AS1 удобен, да и другие есть. Нужна просто новая AVM под него.
BlooDHounD
07.07.2008, 15:20
chingachgoog, Вы помните, что 200 постов назад случайно узнали, что в AVM2 поддерживает синтаксис AS1?
>> Вот тут вы путаете возможности AS1 как языка и возможности AVM1 как среды
нет в АС1 как, в языке, никакой возможности донести до интерпретатора, что математические операции должны быть без плавающей запятой, просто нет. О чeм дальше речь? Ересь вы написали.
Не нужна новая среда для АС1, вы-то и существующими не пользовались... а те, кто пользовался, давно с радостью проапдейтили то, в чем работали... вы просто не научились пользоваться новыми инструментами, и поэтому не понимаете зачем они нужны... создавать новые возможности, ориентируясь на такой "таргет групп" - ну уж точно удачным экономическим ходом не назовешь...
Нужна новая AVM для АС1 - да зачем? АС1 не предназначен для решения современных задач, он дико неудобен для совместной разработки, для написания сопроводительной документации, для интеграции с другими языками. Как вы передадите другому разработчику пакет из 50+ классов написанных на АС1, в которых нет типизации, неизвестно какие методы есть, какие у них аргументы, что должны возвращать, какие рантайм ошибки у них могут быть? Я только неделю потрачу на "общее ознакомление" с таким чудом народного творчества... в то время, как то же самое, пусть бы и на АС2, но с нормальным синтаксисом у меня бы заняло пару часов. Но, скорее всего, просто не стану на это творчество смотреть, т.как время дороже.
chingachgoog
07.07.2008, 16:16
chingachgoog, Вы помните, что 200 постов назад случайно узнали, что в AVM2 поддерживает синтаксис AS1?
Похоже вы зря прочитали последние 300 постов и так и не поняли разницы между кодом в кадре и AS1. Если вы где-то "случайно" узнали, что AVM2 поддерживает синтаксис AS1, то узнайте и то, что вас обманули. :) AVM2 не поддерживает синтаксис AS1 в том-то и засада.
>> Вот тут вы путаете возможности AS1 как языка и возможности AVM1 как среды
нет в АС1 как, в языке, никакой возможности донести до интерпретатора, что математические операции должны быть без плавающей запятой, просто нет. О чeм дальше речь? Ересь вы написали.
Интерпретатор ФП получает байт-коды, полученные от компилятора.
Вы опять хотите сказать, что байт-коды расчитанные для AVM1 не пойдут на AVM2? Это секрет полишинеля. Речь не об этом.
Просто можно сделать переключатель на компиляторе: AS1 для AVM1/для новой AVM-X.
Если пойти по пути переписывания всего, что плохо / не сделано в АС1, для того, чтобы потом из этого можно было компилировать что-то для ВМ2 - нужно будет создать еще однин АС3, один в один такой же, как и уже существующий =) Это то, чего вы хотите? :D
Байткод конечно же подойдет, вопрос не в этом =))) вопрос в том, что у вас нет инструментов в АС1 для того, чтобы задействовать возможности ВМ2 хотябы наполовину.
Зачем вам нужен интерпретатор, который умеет работать с целыми числами, когда у вас в языке такого понятия нету? Зачем вам нужен интерпретатор, который умеет различать приватные методы, при том, что у вас в языке их нету?
Зачем вам нужен интерпретатор, который не позволит создавать у статического класса динамические свойства, при том, что на уровне языка вы это не можете ограничить?
Конечно, для всего вышеперечисленного можно придумать воркараунды, но они по прежнему не будут нативными конструкциями языка, и будут интерпретироваться как набор того, из чего они сделаны -> будут выполнятся медленнее, и что хуже, не задействуют встроенные возможности.
Более того, судя из ваших предыдущих постов, вы не знаете / не понимаете зачем нужна большая часть нововведений... для работы она вам не нужна... так чего вы хотите от разработчиков? То, что они сделали, они сделали для тех, кому это было нужно, и, как ни странно, таких много. И, что еще важнее, это те, технологии, в которые будут вкладываться средства... А то, что вы решили себя позиционировать, как аутсайдера, которого Адоби обошла вниманием, так это исключительно ваша инициатива =) Кроме того, Адоби всегда выкладывает дорелизные продукты бесплатно (иногда чуть ли не на год), мало того, раздает СДК бесплатно, документация, форумы, поддержка... вам предлагали стопятдесят раз, да и до сих пор предлагают воспользоваться новыми продуктами (безвозмездно, т.е. даром =). И тем не менее вы все равно считаете себя обделенным - ну и кто ж виноват?
BlooDHounD
07.07.2008, 23:13
chingachgoog, да неужели? и в чём же проявляется Ваш АС1, которого сдесь никто кроме Вас не знает? основные признаки назовите пожалуйста. давайте сразу определим зону понимания и для этого вопроса. с ООП разобрались.
Вы опять хотите сказать, что байт-коды расчитанные AVM1 не пойдут на AVM2?не подойдут.
FlexOkeks
07.07.2008, 23:23
Ребят, это что Полная лажа II ? Новый поворот взгляда на то, как не нужно делать интерпретаторы? http://www.flasher.ru/forum/showthread.php?t=36761
chingachgoog
08.07.2008, 13:33
Если пойти по пути переписывания всего, что плохо / не сделано в АС1, для того, чтобы потом из этого можно было компилировать что-то для ВМ2 - нужно будет создать еще однин АС3, один в один такой же, как и уже существующий =) Это то, чего вы хотите? :D
Вы воспринимаете AVM2 как данность ниспосланную свыше, а это не так.
Это при данной AVM2 нужно создавать (и создали) новый AS, который обозвали 3-им.
Но это вовсе не значит, что создавая новую по возможностям AVM НЕИЗБЕЖНО пришлось бы создавать данную AVM2 с AS3. Это главный миф адоба.
Мое мнение (и как я понял, я тут не одинок): вполне возможно было создать новую AVM с ничуть не худшим функционалом, чем у сегодняшней AVM2, но работающую и с AS1 (естественно компилируемый отдельным компилятором под эту новую AVM и отдельным компилятором под AVM1 - по выбору). Вот об этом речь.
вопрос в том, что у вас нет инструментов в АС1 для того, чтобы задействовать возможности ВМ2 хотябы наполовину.
Сегодняшнюю AVM2? Пожалуй. Может нет, а может и есть - я не знаю AVM2 настолько хорошо, чтобы это утверждать наверняка. Есть подозрения, что AVM1 и AVM2 не настолько обособленны друг от друга, как это представляют.
Но речь не об сегодняшней AVM2.
Зачем вам нужен интерпретатор, который умеет работать с целыми числами, когда у вас в языке такого понятия нету?
Не понял о чем речь: где в языке AS3 такое уникальное понятие и почему его якобы нельзя использовать в AS1?
Зачем вам нужен интерпретатор, который умеет различать приватные методы, при том, что у вас в языке их нету?
Ну нет в прототипном языке такого понятия и что? Пусть будет в AVM для тех кто хочет писать ООП на классах, а те кто пишет на прототипах используют другое. Не вижу трагедии.
Зачем вам нужен интерпретатор, который не позволит создавать у статического класса динамические свойства, при том, что на уровне языка вы это не можете ограничить?
То же самое. Зачем плакаться об особенностях ООП на классах?
В этом и фишка: новая AVM могла бы работать с обеими моделями программирования как кому нравится. Не пойму что в этом плохого?
Адоб плачет, что это дорого? Что сложно?
Более того, судя из ваших предыдущих постов, вы не знаете / не понимаете зачем нужна большая часть нововведений... для работы она вам не нужна...
Я действительно не знал, что типизация в AVM2 ускоряет работу, как впрочем и вы и другие не знали/не понимали даже старовведений... думаю топик этим и интересен, не так ли?
так чего вы хотите от разработчиков?
Ровно то, что мне нужно для работы и для удобства работы.
Для начала сделать доступным для управления из скрипта в AVM1 то, что можно сделать доступным. Это минимум миниморум. Это то, что просто позорит адоб.
То, что они сделали, они сделали для тех, кому это было нужно, и, как ни странно, таких много.
Подозреваю много меньше, чем тех кому это было ненужно.
И уж точно ни те ни другие были бы не против новой AVM которая работает с обоими моделями ООП (за разумеется исключением тех, кто считает, что программировать могут лишь избранные :) )
И, что еще важнее, это те, технологии, в которые будут вкладываться средства...
Важнее будет когда адоб подсчитает доходы с вложений.
А то, что вы решили себя позиционировать, как аутсайдера, которого Адоби обошла вниманием, так это исключительно ваша инициатива =)
Вам так приятнее представить дело - это понятно. Но мне вообще мало дела до адоба, как такового. Я уже говорил и riden, если не ошибаюсь тоже, что я за истину. Если новая AVM вышла у адоба, мягко говоря, не фонтан - так и говорю. Если вижу, что новый AS мне меньше нравится - так и говорю. Если вижу, как по незнанию или намеренно искажаются сведения об AS1 и AVM1 - поправляю.
Кого то смущает, что я не скачу радостно и не хлопаю в ладоши от AS3 и AVM2? Это не мои проблемы. Меня AS3 и AVM2 не злят и не раздражают. Не даст адоб или кто-то еще другого инструмента - буду работать с этими.
И тем не менее вы все равно считаете себя обделенным - ну и кто ж виноват?
Если я вижу лицемерие и обман, то это не значит, что я считаю себя обделенным - наоборот. Мне просто немного жаль тех, кто в лицемерие верит. Но только немного. :)
chingachgoog, да неужели? и в чём же проявляется Ваш АС1, которого сдесь никто кроме Вас не знает? основные признаки назовите пожалуйста. давайте сразу определим зону понимания и для этого вопроса. с ООП разобрались.
BlooDHounD, еще раз пожалуйста и осмысленно:
1) что "неужели"?
2) что "проявляется"?
3) признаки чего?
4) вы считаете что с ООП разобрались? Если вы вслед за __etc, вопреки действующей классификации, считаете, что настоящее ООП - только на классах, то да - разобрались.
Вы опять хотите сказать, что байт-коды расчитанные AVM1 не пойдут на AVM2?
не подойдут.
Не, ну кабы не BlooDHounD помереть мне дураком суждено было бы :)
Надо пройтись по ветке, как время будет - сделать подборку "открытий" BlooDHounD...
>>> Но это вовсе не значит, что создавая новую по возможностям AVM НЕИЗБЕЖНО
да, неизбежно, потому что все, что есть в АС1 не подходит к новым требованиям. Базовый класс, от которого все наследуется не подходит, и не дает возможности развивать технологию дальше - все.
>>> уж точно ни те ни другие были бы не против новой AVM которая работает с обоими моделями ООП
Я был бы против: зачем поддерживать то, что морально устарело в ущерб новому?
Кроме того, если бы такая поддержка продолжалась, продолжали бы жить и плодится доисторические мануалы и исходники написаные для АС1 - это бы не только тормозило общее развитие, это еще бы и делало технологию менее популярной и привлекательной для новичков.
Я, например, сейчас начал чуть интересоваться ПХП, вы себе не представляете, какая куча устаревшего хлама болтается в интернете связанного с ним... в итоге, начав поиски, сразу создается впечатление, что это какой-то бейсикоподобный язык времен мезозойской эры. Естесственно, это не вызывает большого энтузиазма в его изучении...
все остальное - просто не в тему, оффтоп в оффтопе...
вам не нужно - не берите.
вам нужно - вам дают, при чем бесплатно.
Какого рожна еще надо? Где, какая правда? О чем вы?
chingachgoog
08.07.2008, 15:06
>>> Но это вовсе не значит, что создавая новую по возможностям AVM НЕИЗБЕЖНО
да, неизбежно, потому что все, что есть в АС1 не подходит к новым требованиям.
Какие еще "новые требования"? Вы просто пытаетесь сузить все до ООП на классах. Те же обращения с бинарными данными - нет никаких ограничений сделать тоже самое из AS1.
Миф о неизбежности придуман маркетологами адоба, странно, что вы его повторяете. Либо вы вослед за другими повторяете, что "новые требования" - это строго ООП строго на классах. Все остальное - старое и морально устаревшее. В этом случае ваша позиция честная и понятная.
>>> уж точно ни те ни другие были бы не против новой AVM которая работает с обоими моделями ООП
Я был бы против: зачем поддерживать то, что морально устарело в ущерб новому?
Устарела AVM1, но вовсе не AS1. И где бы тут был ущерб "новому"?
Кроме того, если бы такая поддержка продолжалась, продолжали бы жить и плодится доисторические мануалы и исходники написаные для АС1 - это бы не только тормозило общее развитие, это еще бы и делало технологию менее популярной и привлекательной для новичков.
Вы считаете, что AS3 сделал технологию "более популярной и привлекательной" для новичков??? Это кого вы новичками в этом случае считаете? Сишников и иже с ними? :)
Какого рожна еще надо? Где, какая правда? О чем вы?
Я об объективности предоставления информации, в т.ч. об AS1 и AVM1.
Нет, устарел и АС1 и ВМ на которой он работал. Теоретическая база тоже, как это не удивительно, не стоит на месте - человечество изобретает новые инструменты позволяющие работать продуктивнее, комфортнее, быстрее... АС1 не соответствует представлениям о нормальном современном языке програмирования, в нем отсутствует очень много необходимых и привычных современному програмисту конструкций. То, что вы лично не понимаете назначения нововведений не значит, что их не понимает никто, вы тут в меньшенстве, увы.
Новые требования - это элементарное соответсвие современным представлениям о том, как надо програмировать, какие шаблоны использовать и т.д. С развитием теоретической базы будет совершенствоваться и язык, чтобы дать разработчику средства воплотить теоретические знания на практике. Да, современные представления о програмировании - это классы, точно такая же тенденция существует и в ПХП например, и неспроста. Т.как за счет этого АСП выглядит гораздо привлекательнее для современного выпускника каког-нибудь програмерского факультета. И не важно, делал ли он диплом по Яве / Си или чему-нибудь другому - кроме этого он учил теорию, и понимает, что удобнее, и где прийдеться сначала выточить из булыжника каменный топор, потом с его помощью выковать металлический, и только потом приступить к забиванию гвоздя.
Да, когда я говорю о новичках, я имею в виду людей, которые имеют отношение к програмированию - а кому еще идти в программисты?
>>> Те же обращения с бинарными данными - нет никаких ограничений сделать тоже самое из AS1.
Да есть, елки, ну сколько раз вам объяснять:
Чтобы иметь возможность работать с бинарными данными нужно реализовать соответствующий тип в языке -> в языке типов нет -> прийдется реализовывать какой-то парсер -> при том, что интерпретатор и так медленный, добавить даже минимальный парсер в чтение / запись == сделать эту фичу бесполезной и нежизнеспособной.
>>> Я об объективности предоставления информации, в т.ч. об AS1 и AVM1.
В данном случае вы просто пудрите мозги, а не предоставляете полезную информацию. Вы уже неоднократно высказывали предположения не имеющие никакой фактической базы - т.е. ваши личные домыслы. С чего вы взяли, что предоставление ложной информации способствует объективному взгляду на вещи? Это просто противоречие ради противоречия и попытка привлечь к себе внимание оспаривая очевидное...
Т.е. продолжая аналогию с молотками =)
Была фирма А делающая каменные молотки, гвозди были деревянными, поэтому молотки были вполне к месту. Но тут остальные фирмы производившие гвозди пришли к выводу, что металлические гвозди универальнее, надежнее и долговечнее и стали производить именно их. Фирма А исследовала новые технологии и пришла к выводу, что каменные молотки будут плохо работать с металлическими гвоздями и решила производить металлические молотки. При этом всем своим бывшим клиентам предложила проапгредить орудия труда, при чем бесплатно. И тут появляются недовольные - а как же так, а почему нельзя было сделать так, чтобы наши старые молотки были совместимы с новыми гвоздями? Ну и что тут скажешь... нравится - берите, что дают, не нравится - не берите, нравиться, но не хотите пользоваться - плакатик в руки, и на пляж в Сан Хосе, кажется офис фирмы А где-то близко к морю как раз =)
chingachgoog
08.07.2008, 18:18
Нет, устарел и АС1 и ВМ на которой он работал. Теоретическая база тоже, как это не удивительно, не стоит на месте... АС1 не соответствует представлениям о нормальном современном языке програмирования, в нем отсутствует очень много необходимых и привычных современному програмисту конструкций...Да, современные представления о програмировании - это классы...Да, когда я говорю о новичках, я имею в виду людей, которые имеют отношение к програмированию - а кому еще идти в программисты?
Ну вот так и надо говорить. Новички - выпускники ВУЗов, где УЧАТ программировать на классах. Современное программирование в вашем понимании - это только ООП и только на классах.
Тогда да, кто же спорит: AS1 с этих позиций не предоставляет привычных конструкций выпускнику ВУЗа и выглядит несовременно.
>>> Те же обращения с бинарными данными - нет никаких ограничений сделать тоже самое из AS1.
Да есть, елки, ну сколько раз вам объяснять:
Чтобы иметь возможность работать с бинарными данными нужно реализовать соответствующий тип в языке -> в языке типов нет -> прийдется реализовывать какой-то парсер -> при том, что интерпретатор и так медленный, добавить даже минимальный парсер в чтение / запись == сделать эту фичу бесполезной и нежизнеспособной.
Порочная логика. Как работает флеш в связке с, например, Цинком? Для флеша (для скрипта) это выглядит как просто добавление новых классов. Все. Код для цинка спокойно можно писать в AS1 - никаких проблем не будет. Дело именно в AVM, а не в языке. Какой такой тип в языке AS3 (но не в AVM2!) появился, что только в AS3 позволяет использовать ByteArray ()?
>>> Я об объективности предоставления информации, в т.ч. об AS1 и AVM1.
В данном случае вы просто пудрите мозги, а не предоставляете полезную информацию.
Я говорю не о полезности (у каждого она своя), а об объективности информации. Каждый имеет право иметь объективную информацию, а не набор обзывалок вроде "костылей" и "хаков".
А кто тут кому мозги пудрит - публика решит сама, на то и ветка.
Вы уже неоднократно высказывали предположения не имеющие никакой фактической базы - т.е. ваши личные домыслы.
Оставляю это на вашей совести и внимательности публики. Если это были домыслы, то я так и говорил. Как, например, об упущенной выгоде адоба. Да это мое предположение. Но у него есть своя логика.
С чего вы взяли, что предоставление ложной информации способствует объективному взгляду на вещи?
Где я такую глупость сказал? Вам показалось.
Именно из-за того, что идет много ложной информации об AVM1 и AS1/2 я тут и учавствую.
Это просто противоречие ради противоречия и попытка привлечь к себе внимание оспаривая очевидное...
Я стою в стороне от глобального утверждения, что "дорога в светлое будующее - это только ООП и только на классах", потому "очевидное" у меня иное.
А про внимание - чай не девица, не нуждаюсь. :)
Т.е. продолжая аналогию с молотками =)
Отлично! Самокат с электричкой вижу уже не катят?
Была фирма А делающая каменные молотки, гвозди были деревянными, поэтому молотки были вполне к месту. Но тут остальные фирмы производившие гвозди пришли к выводу, что металлические гвозди универальнее, надежнее и долговечнее и стали производить именно их. Фирма А исследовала новые технологии и пришла к выводу, что каменные молотки будут плохо работать с металлическими гвоздями и решила производить металлические молотки. При этом всем своим бывшим клиентам предложила проапгредить орудия труда, при чем бесплатно.
Хорошая сказочка. Для детского сада сгодиться. Про добрых дяденек из фирмы А спящих и видящих как бы еще облагодетельствовать неразумных молотобойцев.
А было все немного не так.
Не каменные молотки vs металлических и не деревянные гвозди vs металлических. А дяденьки решили ПРОДАТЬ супер-пупер гвоздь, с анодированной головкой, особой тщательной полировкой и специально разработанным дизайном острия. Естественно такой гвоздь можно было забить только специально разработанным супер-пупер молоточком. И только специально обученный человек такой молоточек мог использовать.
И все принялись ликовать: конструктор супер-пупер молоточка рад, что его товар покупают, специально обученные люди рады, что таким гвоздем одарили...
Остальные чешут репу: то ли приноравливаться к супер-пупер молоточку с чудо гвоздем, то ли ждать пока нормальный новый молоток выпустят, то ли старым маленьким молоточком ковыряться?
И тут появляются недовольные - а как же так, а почему нельзя было сделать так, чтобы наши старые молотки были совместимы с новыми гвоздями?
Молотки-то нормальные, модификации подвержены. А вот гвозди гламурные, лействительно, не нужны.
PS Аналогия как всегда хромает, но не хотят сторонники истово-правильного ООП говорить об AVM, приходиться на пальцах...
BlooDHounD
08.07.2008, 18:57
chingachgoog, как я понял из последних ваших высказываний, самое точное определение, которое характеризует, AS1 в современном обществе - это прототипный язык.
вернёмся на пару сотен постов назад, и внимательно прочитаем то, что я написал пару раз: "прототипы остались в AS3. хотите юзайте."
как в вашей великой AVM1 отличить int, uint, Number и String ? мы же хотим научиться работать с ByteArray?
>> Какой такой тип в языке AS3 (но не в AVM2!) появился, что только в AS3 позволяет использовать ByteArray ()?
int... а чего, в мануал заглянуть не судьба?
>> "очевидное" у меня иное.
это помоему уже ни для кого не секрет %) ваш взгляд направлен в сторону противоположную от действительности, это да... :D
>>> Не каменные молотки vs металлических [...].
Bаше сравнение не корректно, Адоби не ПРОдают, они РАЗдают СДК, то, что они продают - графический редактор и удобная среда для разработки (ФБ), совместимые с БЕСПЛАТНЫМ СДК. Они не добрые и не злые, они делают свою работу так, чтобы она была нужна другим - чтобы за нее платили. Я делаю то же самое каждый день с 10 утра и до 7-8 вечера, и ничуть этого не стесняюсь =)
Опять же, у меня дома, например, нет CS3... и вообще, купленых у Адоби продуктов нет. Зато есть FD и AXDT, и я не вижу как тут Адоби на мне нажились... я им ни копейки не заплатил, и тем не менее во всю использую их продукт.
>> [...] дорога в светлое будующее - это только ООП и только на классах [...]
Светлого будущего нет, есть просто будущее, что будет происходить в ближайшем будущем - можно предположить оценив настоящее. Ситуация такая, что прототипные и процедурные языки оказались менее приспособлеными к запросам потребителя в данной области - се ля ви... а дальше - как знать, может быть придумают чего-то получше, и АС3 станет такой же ветошью, как сейчас АС1...
chingachgoog
08.07.2008, 20:46
chingachgoog, как я понял из последних ваших высказываний, самое точное определение, которое характеризует, AS1 в современном обществе - это прототипный язык.
вернёмся на пару сотен постов назад, и внимательно прочитаем то, что я написал пару раз: "прототипы остались в AS3. хотите юзайте."
Ну и что же __ets не смог "заюзать" мой пример AS1 под AS3? Не хотите у него спросить?
как в вашей великой AVM1 отличить int, uint, Number и String ? мы же хотим научиться работать с ByteArray?
>> Какой такой тип в языке AS3 (но не в AVM2!) появился, что только в AS3 позволяет использовать ByteArray ()?
int... а чего, в мануал заглянуть не судьба?
AVM1 не моя, она общая :)
Ну и где помеха использовать ByteArray в AS1 (не путать с AVM1!)?
Бедная новая AVM не сможет отличить int от Number, как мог бы подумать BlooDHounD? Чушь. А как же старая "великая" AVM1 отличает Number от String? Наверное неразрешимая задача...
Парни, вы придумываете проблему на пустом месте.
Они не добрые и не злые, они делают свою работу так, чтобы она была нужна другим
Ну объясните, почему они не сделали работу с метками в AVM1?
Нехватка денег - самый оригинальный ответ :) Лучше бы просто сказали - забыли...
Опять же, у меня дома, например, нет CS3... и вообще, купленых у Адоби продуктов нет. Зато есть FD и AXDT, и я не вижу как тут Адоби на мне нажились... я им ни копейки не заплатил, и тем не менее во всю использую их продукт.
Ну у ваших дизайнеров есть, значит. Обойдетесь без дизайнерской CS3?
что будет происходить в ближайшем будущем - можно предположить оценив настоящее. Ситуация такая, что прототипные и процедурные языки оказались менее приспособлеными к запросам потребителя в данной области - се ля ви... а дальше - как знать, может быть придумают чего-то получше, и АС3 станет такой же ветошью, как сейчас АС1...
Все может быть...
Да, без новой AVM AS1 будет ветошью и это факт.
Но это мало зависит от запроса потребителя (уверен что запрос на AS1 есть) и приспособленности прототипных языков (уверен они приспособлены), к сожалению.
>>> Ну у ваших дизайнеров есть, значит. Обойдетесь без дизайнерской CS3?
Нет, нету... для того, что я делаю дизайн вообще не нужен, это конвертор видео, приставка к стриминг серверу, у него только в коммандлайн интерфейс есть...
>>> они не сделали работу с метками в AVM1
Понятия не имею... а как это влияет на репутацию? Я думал, они у вас чего-то отняли, пообещали, и не сделали, или еще чего-то такое... а это как бы их личное дело, вам вроде никогда никто не обещал, что это будет реализовано... Вас заденет, если я чесно признаюсь, что в 4-м классе не сделал пару раз домашнее задание =) Я стану от этого злее или добрее?
>>> Бедная новая AVM не сможет отличить int от Number, как мог бы подумать BlooDHounD? Чушь. А как же старая "великая" AVM1 отличает Number от String? Наверное неразрешимая задача...
В АVМ1 есть такой тип? - нет, нету. В АS1 есть такой тип? - не, тож нету. Дописать его и туда и туда? - ок, а за ним потянутся uint, XML (с Е4Х), regExp, а за ними и Sprite, Shape, Event, EventDispatcher... - и опять вернемся к тому, что АС1 нужно просто переписать с нуля, сделать таким же, как АС3, просто назвать его как-нибудь типа AS1 Progressive :D
Я все равно в упор не понимаю зачем нужна новая АВМ для АС1, при том что вам уже года 2 как дали новую АВМ, которая поддерживает прототипное програмирование и ну просто оооочень похожий синтаксис. Просто, естесственно, работает медленнее с прототипами, потому что это объективно медленно...
BlooDHounD
08.07.2008, 22:28
chingachgoog, ну так скажите мне в чём основные отличительные характеристики AS1 от прототипной составляющей AS3?
и не нужно всё сваливать на Дениса. я не видел, что бы его просили что-то написать на AS3. а даже если и просили, то я не знаю, что можно написать на АS1 такого чего не написать на AS3. хотя обратное имеет место.
Бедная новая AVM не сможет отличить int от Number, как мог бы подумать BlooDHounD? Чушь. А как же старая "великая" AVM1 отличает Number от String? Наверное неразрешимая задача...у Вас паранойя :) я не единственный так думаю :) хватит упоминать мой ник в 3м лице, или Вы сделали из меня идола?
старая AVM всё хранить в памяти ввиде строк. все ссылки в AS1 строковые, от сюда тормаза. об этом кстати много писали.
и рас уж по вашему виновата AVM1 а не AS1, то поставлю вопрос по другому:
как в AS1 отличить int, uint, Number и String ? мы же хотим научиться работать с ByteArray?
chingachgoog, все, что вы хотите уже реализовано, и называется АС3. Можно писать и указывая тип, и не указывая тип. Можно писать и в классах и в кадрах. Вы лучше скажите, что такого есть в АС1, чего нет в АС3 и без чего вы не можете нормально работать.
старая AVM всё хранить в памяти ввиде строк. все ссылки в AS1 строковые, от сюда тормаза. об этом кстати много писали.Один "умник" написал (http://www.flasher.ru/forum/showthread.php?t=36761), а вы поверили?
BlooDHounD
09.07.2008, 11:42
iNils, я этот топик не читал :)
просто где-то адоба сама писала. ещё где-то у роста в коментах как-то спор был, убраны ли в AVM2 строковые ссылки. а вообще я не вижу других вариантов :)
Вот меня интересует, где на адоб об этом написано. А в комментах можно что угодно написать, как и в этой теме :D
BlooDHounD
09.07.2008, 12:04
iNils, в одном из анонсов новой AVM. это одна из фич AVM.
BlooDHounD
09.07.2008, 12:34
Народ, полазайте по интернету вместо iNils и меня. нам лень.
chingachgoog
09.07.2008, 14:25
>>> они не сделали работу с метками в AVM1
Понятия не имею... а как это влияет на репутацию? Я думал, они у вас чего-то отняли, пообещали, и не сделали, или еще чего-то такое... а это как бы их личное дело, вам вроде никогда никто не обещал, что это будет реализовано...
Репутация компаний складывается как раз из таких "мелочей" которых "никто не обещал".
>>> Бедная новая AVM не сможет отличить int от Number...
В АVМ1 есть такой тип? - нет, нету. В АS1 есть такой тип? - не, тож нету. Дописать его и туда и туда? - ок, а за ним потянутся uint, XML (с Е4Х), regExp, а за ними и Sprite, Shape, Event, EventDispatcher...
В АVМ1 нет, все числа считаются с плавающей точкой. Ну и что? Речь ведь не про AVM1. В AS1 нет такого типа? Опять - ну и что? Можно добавить, а можно и нет - обойтись просто новым классом ByteArray, а дальше новая AVM сама разберется, что какого типа. В AS1 есть 7 типов данных, добавим еще несколько - ничего страшного не произойдет (раньше ведь меньше было и добавляли).
- и опять вернемся к тому, что АС1 нужно просто переписать с нуля, сделать таким же, как АС3
Ложная предпосылка. Функционал AVM2 (и даже бОльший) достижим и с AS1. AS3 - не единственно возможное решение для такого функционала.
Я все равно в упор не понимаю зачем нужна новая АВМ для АС1, при том что вам уже года 2 как дали новую АВМ, которая поддерживает прототипное програмирование и ну просто оооочень похожий синтаксис. Просто, естесственно, работает медленнее с прототипами, потому что это объективно медленно...
chingachgoog, все, что вы хотите уже реализовано, и называется АС3. Можно писать и указывая тип, и не указывая тип. Можно писать и в классах и в кадрах. Вы лучше скажите, что такого есть в АС1, чего нет в АС3 и без чего вы не можете нормально работать.
и не нужно всё сваливать на Дениса. я не видел, что бы его просили что-то написать на AS3. а даже если и просили, то я не знаю, что можно написать на АS1 такого чего не написать на AS3. хотя обратное имеет место.
Придется ответить, раз так много одинаковых вопросов :)
В посте 419 (http://flasher.ru/forum/showpost.php?p=749350&postcount=419) я привел код AS1, иллюстрировавший принципы ООП.
Вот что ответил __etc в посте 425 (http://flasher.ru/forum/showpost.php?p=749392&postcount=425)
А где мой вариант переписанный под AS3?
Нигде, с вашим понятием полиморфизма такое можно написать только на JavaScript и других прототипных языках, у которых стол может стать стулом без проблем простой заменой прототипа.
Это собственно раз. Не говоря уже о мелочах по ограничению кода в кадрах в AS3 и прочих. Ну не синонимы фразы "код в кадрах" и "AS1" :)
chingachgoog, ну так скажите мне в чём основные отличительные характеристики AS1 от прототипной составляющей AS3?
Очень хороший вопрос!
Возможно в ответе на него найдется и объяснение почему вес обоих AVM в 9-м ФП меньше чем вес каждой по отдельности.
Но вы сначала стул сделайте столом, потом опять стулом, а потом негром ))))
Бедная новая AVM не сможет отличить int от Number, как мог бы подумать BlooDHounD? Чушь. А как же старая "великая" AVM1 отличает Number от String? Наверное неразрешимая задача...
...старая AVM всё хранить в памяти ввиде строк. все ссылки в AS1 строковые, от сюда тормаза. об этом кстати много писали.
Объекты организованы в AVM1 в виде ассоциативных массивов, но не надо их путать со списками свойств, где действительно (если была бы такая организация) время доступа к объекту было бы тормозным (последовательно просматривались бы поля со строками).
А ассоциативные массивы лишены этого недостатка.
Скорость доступа ко всем элементам хэша одинакова. Достигается это благодаря тому, что при вызове элемента не осуществляется никакого поиска. Адресом нужного объекта данных является его имя.
и рас уж по вашему виновата AVM1 а не AS1, то поставлю вопрос по другому:
как в AS1 отличить int, uint, Number и String ? мы же хотим научиться работать с ByteArray?
А я говорю еще раз: как же бедная AVM1 различает аж 7 разных типов данных? Как в этом принимает участие AS1?
Как цинк работает с FTP (кстати с FTP данная тема начилась) и COMPort-ом, когда код написан на расширенном AS1?
BlooDHounD
09.07.2008, 14:38
цинк написан на АС1? НЕФИГАСЕБЕОТКРЫТИЕ!
Возможно в ответе на него найдется и объяснение почему вес обоих AVM в 9-м ФП меньше чем вес каждой по отдельности.
Но вы сначала стул сделайте столом, потом опять стулом, а потом негром ))))эээ... Вы меня простите, но этот код илистрирует не ООП, а быдлокодера.
а вообще возьмите и перепешите, всё это на АС3. всё будет работать. если поуберать все галочки компилятора. а вот Вы мне так и не ответили.
Возможно в ответе на него найдется и объяснение почему вес обоих AVM в 9-м ФП меньше чем вес каждой по отдельности.А ты знаешь вес авм в 9-ке и по отдельности?
chingachgoog
09.07.2008, 15:22
цинк написан на АС1? НЕФИГАСЕБЕОТКРЫТИЕ!
Какая разница на чем написан цинк или флеш-плеер?
Главное что они выполняют AS код. В указанных возможностях - AS1 код.
эээ... Вы меня простите, но этот код илистрирует не ООП, а быдлокодера.
За что же вас прощать? Вы же, конечно, не быдлокодер?
а вообще возьмите и перепешите, всё это на АС3. всё будет работать. если поуберать все галочки компилятора.
Успехов.
а вот Вы мне так и не ответили
Что именно? За меня вам __etc ответил. По-моему яснее некуда.
Возможно в ответе на него найдется и объяснение почему вес обоих AVM в 9-м ФП меньше чем вес каждой по отдельности.
А ты знаешь вес авм в 9-ке и по отдельности?
Нет. Это предположение.
Помнишь тема была?
http://flasher.ru/forum/showthread.php?t=100710
Нет. Это предположение.В плеере не только avm1 и avm2, но и "графическая" часть (шрифты, шейпы, и тп), она скорее всего общая. Поэтому плеер с avm1/avm2 будет весить меньше, чем сумма двух плееров, один с avm1, другой с avm2, за счет необходимости в раздельных плеерах дублировать "графическую" часть.
chingachgoog
09.07.2008, 15:38
Про графическую часть понятно.
А вот про AVM - не знаю. Есть вообще где-нибудь хорошая информация по AVM2?
http://www.adobe.com/go/avm2overview/
chingachgoog
09.07.2008, 16:19
Спасибо, iNils, на безрыбье и рак - рыба.
Кстати, если тебе интересно еще про объекты активаций. Есть еще один объект, который ведет себя также, как и объекты активации: т.е. является объектом, но не относится к классу Object. Это всем известный _global. :)
trace(_global instanceof Object) // false
trace(typeof(_global)) // object
BlooDHounD
09.07.2008, 16:25
chingachgoog, спасибо что желаете мне успехов :)
что мне etc ответил на вопрос, который я Вам задавал? я почему-то не нашёл.
chingachgoog
09.07.2008, 16:36
BlooDHounD, смотрите внимательнее пост 488 (http://flasher.ru/forum/showpost.php?p=751056&postcount=488).
BlooDHounD
09.07.2008, 16:49
chingachgoog, да, чёрт побери, поменять родителя у класса мне удалось :( хотя это первый случай на практике, когда мне понадобилось это сделать.
и где в этом посту etc даёт мне ответ? там Вы что-то впрегаете про свой вопрос, на которой я опять же ответил. а Вы уклоняетесь.
>>> Репутация компаний складывается как раз из таких "мелочей" которых "никто не обещал".
Чего? Это, простите, элементарное жлобство требовать то, чего вам никто никогда не обещал, да еще и нашару... есть 10 заповедей + УК, свыше этого никто в этом мире никому ничего не должен, если не пообещал. =)
>>> обойтись просто новым классом ByteArray [...]
Э... чего? А как вы реализуете .readInt() у ByteArray, если целых чисел нету?
Да, я уже объяснил, добавим то, другое, третье, выбросим одно за другим - и вот вам каша из топора - топор лежит в сторонке, а солдат жрет овсянку с молоком и маслом =) Только вот пихать изначально в котелок топор-то зачем?
Ложная предпосылка. Функционал AVM2 (и даже бОльший) достижим и с AS1. AS3 - не единственно возможное решение для такого функционала.
>>> Блажен, кто верует... %)
>>> А я говорю еще раз: как же бедная AVM1 различает аж 7 разных типов данных? Как в этом принимает участие AS1?
Как цинк работает с FTP (кстати с FTP данная тема начилась) и COMPort-ом, когда код написан на расширенном AS1?
Хоть вопрос и не ко мне, проиллюстрирую это на примере:
mdm.FileSystem.saveFileHEX(filePath:String, dataToSave:String):void
В процессе работы над текущим проэктом были опробованы разные возможности сохранения файлов локально. Судя по тестам, да и вообще просто из аргументов принимаемыx функцией можно догадаться, что она парсит строку для того, чтобы сохранить ее в файл в виде массива байтов. При объеме информации ~1,5 Гб разница во времени была примерно 8 к 1 против пересылки бинарному сокету с последующим сохранением. (16 минут против 2). Так же и остальные плюшки Цинка - там, где нужно работать с АС1 - все работает меееееееедленно =) Потому, что парсится, а не просто выполняется.
Цинк работает с ФТП своими силами, это никак не связано ни с АС1, ни с флешевой ВМ вообще... точно так же, как я могу в приложение на .НЕТ работающим с ФТП воткнуть какую-нибудь картинку и сделать так, что если в картинке доминирует синий цвет - она будет коннектится к хосту А, а если красный - то к Б... связь примерно такого же уровня...
chingachgoog, скажи плиз в какой конторе ты работаешь? Если конечно это не секрет... Очень хочется посмотреть чем твоя команда занимается.
Я не так давно тоже работал в конторе, которая ну никак не хотела двигаться в сторону AS3 и упорно продолжала писать проекты на AS1/2, причем крупные проекты.
Мне почему-то начинает казаться, что я ушел как раз из той конторы, в которой ты сейчас ведущий программист.
Вобщем, если не секрет, поведай ссылку на сайт конторы :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.