Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Битва гигантов: AVM1 vs. AVM2. Спешите видеть! Только у нас! (http://www.flasher.ru/forum/showthread.php?t=113128)

etc 01.07.2008 17:42

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Вы не ответили на вопрос. Инкапсуляция не имеет ничего общего с private. Приват может усилить инкапсуляцию, но не более.

Приват и создан для инкапсуляции. Конечно, вы можете создать для себя правила, какие методы вызывать, какие нельзя и типа у вас инкапсуляция получилась. Отлично.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Ибо нигде не сказано, что ООП язык ДОЛЖЕН иметь такие слова. Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов. У прототипных языков есть свои преимущества и надо их использовать, а не ворчать по поводу отсутствия интерфейсов.

Да откройте википедию хотя бы, насчет должен. Я ничего не говорю про преимущества прототипных языков, я даже не говорю, что AS1 вообще не ООП, он ООП, но с приставкой «псевдо» только лишь из-за того, что это самое ООП надо самому необходимо реализовывать (это доказывает наличие «легко достижимы» вместо «уже есть» из вашего текста). А я не считаю такой язык по-настоящему объектно-ориентированным, в котором надо эту ориентированность самому реализовывать. С тем же успехом ассемблер тоже объектно-ориентированный, ведь в нем тоже можно реализовать полиморфизм, наследование и инкапсуляцию, не так ли?

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Зато инкапсуляция, наследование и полиморфизм легко достижимы на AS1, пусть даже без специально зарезервированных слов.

Подтвердите свои слова кодом, я привел пример инкапсуляции, наследования и полиморфизма на AS3. Перепишите пример под AS1, с сохранением инкапсуляции (нормальной приватности, без торчащих наружу методов), наследования и полиморфизма. У Яски код нерабочий.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Ничего подобного. Вы невнимательно прочитали мой предыдущий пост и все еще не в введении, что такое объект активации.
iNils привел код, где трассируется указатель this. А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)

А вы дальше моего предложения «iNils привел код, в котором нет объекта активации и код, в котором он является рутом.» вообще ничего читать не стали и сразу объявили меня в некомпетентности? Оригинально, это лишний раз подтверждает то, что вы читаете ровно до того предложения и лепите ответ к одному предложению, не обращая внимания на другие.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
Тогда жаль, что "большинство программистов" не хотят знать как на самом деле работает код.

И не должны знать, прочитайте цитату из книги моего поста #398. Программист не должен знать низкоуровневые особенности кода, ему нужно работать и писать работающий, а не сидеть и выпиливать ООП, на котором дай бог что-нибудь заработает.

Цитата:

Сообщение от chingachgoog (Сообщение 749253)
PS Кстати не __constructor__ а просто constructor

Т.е. вы не знаете, как работает extends под шестой плеер в AS1?

Я жду от вас кода.

Яски 01.07.2008 17:57

Цитата:

Сообщение от __etc (Сообщение 749211)
Ещё раз говорю, что язык вам позволяет реализовывать ООП, куцое, правда. Но у него нет средств для обеспечения той же приватности или полиморфизма, эти вещи разработчик просто в голове держит и все.

А какие средства вам еще нужны, то что можно создавать объекты, назначать им свойства и методы уже является дополнительной возможностью. Например, в том же Си такой возможности нет.

Цитата:

Сообщение от __etc (Сообщение 749211)
Не работает, вы не находите?

Для того, чтобы использовать более точную версию AS1 я писал в Flash MX, возможно в Flash CS ситуация изменилась. Скорей всего __proto__ надо писать как prototype.

Цитата:

Сообщение от __etc (Сообщение 749211)
Если рассматривать понятие ООП как более абстрактное, программирование с использованием понятия объектов, то тогда большинство языков объектно-ориентированные.

ООП является стандартом дефакто, совсем без него плохо.

Цитата:

Сообщение от __etc (Сообщение 749211)
Я уже говорил, что я согласен на формулировку, что AS1 — ООП язык, но только с приставкой «псевдо». Class-based языки — ООП языки без приставок.

Хорошо, называйте его "псевдо", но "прототипный" будет точнее.

Цитата:

Сообщение от BlooDHounD (Сообщение 749214)
Яски, есть ООП, а есть возможности языка :) с вашей логикой Вы мне можите доказывать, что Джава не язык программирования вовсе, так как там нету класса MovieClip :) что за бред Вы несёте про this, про inline-методы, перегрузка операторов? какое отношение к ООП они имеют? миксинг классов вообще фактически с точки зрения ООП, противопоказан.

Я тоже считаю, что бредово приписывать к ООП такие частные понятия, как интерфейсы, классы, приватные методы.

etc 01.07.2008 18:10

Цитата:

Сообщение от Яски (Сообщение 749272)
А какие средства вам еще нужны, то что можно создавать объекты, назначать им свойства и методы уже является дополнительной возможностью.

Вы выходите в более высокий уровень абстракции, чем я, вам достаточно просто наличия объектов. Мне — нет.

Цитата:

Сообщение от Яски (Сообщение 749272)
Для того, чтобы использовать более точную версию AS1 я писал в Flash MX, возможно в Flash CS ситуация изменилась. Скорей всего __proto__ надо писать как prototype.

Нет, там побольше будет строчек, целых три.

Цитата:

Сообщение от Яски (Сообщение 749272)
Я тоже считаю, что бредово приписывать к ООП такие частные понятия, как интерфейсы, классы, приватные методы.

Wiki
Из последнего абзаца основных понятий AS1 — подвид ООП, прототипный. Он использует не все исходные понятия ООП. Т. е., есть собственные прототипы, есть наследование. Остальное реализуется лишь на уровне собственных правил разработчика, которым он следует, язык в этом, увы, участия не принимает.

Яски 01.07.2008 18:31

Цитата:

Сообщение от __etc (Сообщение 749277)
Вы выходите в более высокий уровень абстракции, чем я, вам достаточно просто наличия объектов. Мне — нет.

Главное решить поставленную задачу, а инструмент для этого подойдет любой.

Цитата:

Сообщение от __etc (Сообщение 749277)
Я ничего не говорю про преимущества прототипных языков, я даже не говорю, что AS1 вообще не ООП, он ООП

На этом спор можно закончить.

riden 01.07.2008 18:35

По поводу "объекта активации", областей видимости:
Код:

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

Цитата:

Сообщение от =__etc
В AS3 поведение иное, область видимости не изменяется, даже если присвоить ссылку на метод класса другому объекту. А в AS1/AS2 функция будет вызвана в области видимости того объекта, к которому она присвоена

Где у вас здесь методы класса? если бы test() - был методом класса, он бы и работал, как "спрогаммирован". То есть instanceOfClass.test() - будет возвращать, то что нужно. И не важно кому его присвоят, откуда он ссылку получит.

Вы наверно не заметли.., а процитировали только мое одно предложение, я процитирую:
Цитата:

Сообщение от riden
Это значит, что все переменные (свойства) во внешней функции (классе) видны. Все свойства внутри тела класса (функции) копируются, с созданием экземпляра. И можно также (как и в AS3, например this[область видимости экземпляра]-parent) через ссылку на this-класса, получить доступ к руту экземпляра.

Аналогом parent DisplayObject в AS1 будет _parent мувика. Короче классы в ас1 работают также как в ас3 в этом смысле. И также можно узнать где лежит клип: this-класса._parent, и таким образом получить доступ к области видимости экземпляра. Надеюсь я правильно понял смысл фразы "область видимости экземпляра класса". А как в АС3 вы получите из тела класса, доступ к области видимости экземпляра, если он - не часть DisplayList (короче не DisplayObject)? Ну не важно, аналогию я привел.

etc 01.07.2008 18:48

Цитата:

Сообщение от riden (Сообщение 749292)
Надеюсь я правильно понял смысл фразы "область видимости экземпляра класса".

Нет, неправильно поняли.

Цитата:

Сообщение от riden (Сообщение 749292)
А как в АС3 вы получите из тела класса, доступ к области видимости экземпляра, если он - не часть DisplayList (короче не DisplayObject)? Ну не важно, аналогию я привел.

Очень просто — this. Я и так в каждом методе в AS3 нахожусь в этой области видимости и this ссылается на неё же. Я уже говорил вам, что «должна работать так» — это значит, что нужно сделать так, чтобы приваты работали, как они работают в AS3. Я приводил соответствующий код.

Цитата:

Сообщение от Яски (Сообщение 749286)
Главное решить поставленную задачу, а инструмент для этого подойдет любой.

Ну конечно, у нас есть детальки, мы сначала сделаем бензопилу, а потом будем ей рубить лес. Лично я предпочту язык с наличием бензопилы изначально.

Цитата:

Сообщение от Яски (Сообщение 749286)
На этом спор можно закончить.

И остаться при своих.

riden 01.07.2008 19:07

Цитата:

Сообщение от __etc
Очень просто — 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

etc 01.07.2008 19:20

Цитата:

Сообщение от riden (Сообщение 749303)
Именно про это я и писал, уже давно: "доступ к переменным(свойствам) внешней функции-класса)".
Можно так:
Код:

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

Боже мой, опять чертов костыль-ссылка. Давайте задам вопрос прямо: вы знаете, что такое 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

Цитата:

Сообщение от __etc (Сообщение 749266)
Приват и создан для инкапсуляции. Конечно, вы можете создать для себя правила, какие методы вызывать, какие нельзя и типа у вас инкапсуляция получилась. Отлично.

Инкапсуляция - это всего лишь механизм образования "черного ящика". Да, приват создан для усиления инкапсуляции, но сам по себе инкапсуляцию не обеспечивает.
А так как вы отказываетесь говорить, какие вы видите цели в привате, то глупо утверждать, что ничего подобного нет в AS1.

Цитата:

Сообщение от __etc (Сообщение 749266)
Да откройте википедию хотя бы, насчет должен.

Ага, отлично - википелия :) Там, кстати AS к ООП относят (явно не 3-й)
Ну так ДОЛЖЕН язык ООП иметь зарезервированное слово private? Простой вопрос: да или нет? (то же самое к словам class, interface)

Цитата:

Сообщение от __etc (Сообщение 749266)
...я даже не говорю, что AS1 вообще не ООП, он ООП, но с приставкой «псевдо» только лишь из-за того, что это самое ООП надо самому необходимо реализовывать... А я не считаю такой язык по-настоящему объектно-ориентированным, в котором надо эту ориентированность самому реализовывать.

Что значит САМОМУ? Есть синтаксические конструкции языка или нет, которые позволяют это делать? Есть. Правда почему-то их обозвали "хаками", "костылями" и т.п. Но это только с точки зрения ООП на классах. А как можно судить об AS1 как языке ООП с точки зрения AS3? Не хотите тогда посмотреть на AS3 с точки зрения AS1 и обозвать хаками interface? Нет? Правильно. Потомучто нужно смотреть с точки зрения общей парадигмы ООП.

Цитата:

Сообщение от __etc (Сообщение 749266)
Подтвердите свои слова кодом

Код:

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 :)

Цитата:

Сообщение от __etc (Сообщение 749266)
А вы дальше моего предложения «iNils привел код, в котором нет объекта активации и код, в котором он является рутом.» вообще ничего читать не стали и сразу объявили меня в некомпетентности?

А где вы ДАЛЬШЕ сказали, что iNils ошибся? Надо думать забыли?


Оригинально, это лишний раз подтверждает то, что вы читаете ровно до того предложения и лепите ответ к одному предложению, не обращая внимания на другие.

Цитата:

Сообщение от __etc (Сообщение 749266)
Программист не должен знать низкоуровневые особенности кода

Ну значит вам не надо :)
А мне надо и интересно.

etc 01.07.2008 23:46

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Инкапсуляция - это всего лишь механизм образования "черного ящика". Да, приват создан для усиления инкапсуляции, но сам по себе инкапсуляцию не обеспечивает.

А что обеспечивает инкапсуляцию, хотелось бы услышать.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
А так как вы отказываетесь говорить

Я вами треплюсь уже 400 с лишним ответов в этой теме и я после этого отказываюсь? Если бы я отказывался, я бы тут вообще ни поста не оставил.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
какие вы видите цели в привате

Инкапсуляция, инкапсуляция, инкапсуляция, черт вас возьми, сколько можно? Я понимаю, что мыслить проектами до 2 килострок какой-то там инкапсуляцией и полиморфизм с наследованием сложно, да. Ой, как я вас понимаю.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
(явно не 3-й)

С потолка взяли?

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Ну так ДОЛЖЕН язык ООП иметь зарезервированное слово private? Простой вопрос: да или нет? (то же самое к словам class, interface)

Да хоть назовите «коробочка», смысл от этого не меняется, не обеспечивает AS1 инкапсуляции, вам её самому надо реализовывать, с кучей недостатков. Вы придираетесь к самому наличию/отсутствию кейворда «private», а не к сути такого понятия, как приватность. Не реализована эта инкапсуляция на уровне языка в AS1, никаким образом, ни кейвордом, никак, вы это сами подтвердили высказыванием о том, что её можно легко реализовать. То, что у меня есть четыре колеса, вовсе не означает, что их можно назвать автомобилем. Вы из подручных средств пытаетесь собрать этот самый автомобиль, чтобы попытаться на нем поехать и при этом, всю эту кучу хлама, из которого собираетесь сделать автомобиль (не зная вообще, поедет ли он), уже называете это автомобилем.



Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Что значит САМОМУ?

Что значит? Наследование как реализовали? Через очень интересное свойство __proto__, очень документированное, руками. Не простым кейвордом extends без плясок, а аж пять строчек. Инкапсуляция как реализована? Последние страниц десять с горем пополам что-то сделали, и то, такой вариант не живет с наследованием, не говоря уже о забиванием памяти одинаковыми методами, которые даже экземпляру класса не принадлежат.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Есть синтаксические конструкции языка или нет, которые позволяют это делать? Есть.

Какие? extends — нету. private — нету. Интерфейсы? А что это такое? Ничего этого нет, вы для себя это придумываете, в мозгу, мол, вот такие методы вызывать нельзя, а эти переменны трогать тоже. Язык вам тут не поможет, он не умеет сам по себе такие вещи делать.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
А как можно судить об AS1 как языке ООП с точки зрения AS3?

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Потомучто нужно смотреть с точки зрения общей парадигмы ООП.

С точки зрения ООП как раз таки, а не AS3. AS3 взят в качестве примера, если хотите, можно взять в качестве примера Java или C#, не принципиально.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Не хотите тогда посмотреть на AS3 с точки зрения AS1 и обозвать хаками interface?

В AS1 нет полиморфизма, он просто настолько далек от этого, что просто не знает в принципе, что это такое.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Код:

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. Т. е. те же свойства, приватность, методы, переопределение и т. д.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
А где вы ДАЛЬШЕ сказали, что iNils ошибся? Надо думать забыли?

Вы меня объявили в некомпетентности, не удосужовшись прочитать дальнейший текст, каким тут боком iNils? Вы не прочитали текст до конца, потом тут же пишете тоже самое и говорите, что я что-то не понимаю? Оригинально.

Цитата:

Сообщение от chingachgoog (Сообщение 749350)
Ну значит вам не надо :)
А мне надо и интересно.

Вот именно, что вам интересно. Вам нравится реализовывать ООП на коленке, это уже и так понятно.


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

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