Форум 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 13:16

Цитата:

Сообщение от riden (Сообщение 749180)
Это значит, что все переменные (свойства) во внешней функции (классе) видны.

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

Цитата:

Сообщение от riden (Сообщение 749180)
P.S: нет, похоже, это у вас все таки каша в голове

Я, в отличие от вас, не редактирую по 10 раз посты после того, как на первоначальные редакции уже были даны ответы. Если вы будете продолжать сначала писать одно, потом редактировать и писать другое через полчаса, тогда мне не о чем с вами разговаривать. После этого вы начинаете утверждать, что, якобы, у меня каша в голове.

iNils 01.07.2008 13:30

Цитата:

...инициализируется объектом
Код:

function a () {
        trace (this);
}
function b(){
        trace (this);
        a()
}
new b()
setInterval(a, 1000);

[object Object]
_level0
undefined

Ну вот откуда тут _level0?

Яски 01.07.2008 13:47

Цитата:

Сообщение от BlooDHounD (Сообщение 749079)
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким :)

А кто вдруг решил, что в ООП обязательно должен быть this, что должны быть классы, множественное наследование. Например, в Си++ есть перегрузка операторов, но это дополнительная возможность, которой нет в истинном определении ООП.

Цитата:

Сообщение от __etc (Сообщение 749126)
А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript.

Может на эту тему тоже поспорим? :)

Цитата:

Сообщение от __etc (Сообщение 749126)
Кстати, наследование реализуется не так, как вы написали, ... Для наследования у вас есть скрытые костыли языка в виде __proto__ и __constructor__.

Спасибо, я и не знал.

Цитата:

Сообщение от __etc (Сообщение 749126)
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на 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, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП.

etc 01.07.2008 14:21

Цитата:

Сообщение от Яски (Сообщение 749194)
Может на эту тему тоже поспорим? :)

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

Цитата:

Сообщение от Яски (Сообщение 749194)
Да, пожалуйста:

Код:

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"

Даже немного компактнее получилось.

Мой трейс:

Цитата:

Сообщение от Flash CS3
undefined
undefined
abstract method
undefined
undefined
undefined
undefined
undefined
undefined
NaN
NaN
undefined

Не работает, вы не находите?

Цитата:

Сообщение от Яски (Сообщение 749194)
Как я уже говорил АС1 и JavaScript являются прототипными ООП. Что свойственно для языков программирования без жесткой типизации, в которых нельзя ввести определение класса.

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


Цитата:

Сообщение от Яски (Сообщение 749194)
Если ,etcs, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП.

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

p.S. В моем нике всего три буквы и два подчеркивания, но почему в нём постоянно делают ошибки? То буквы местами перепутают, то «c» с «s», то одно подчеркивания вместо двух (хотя подчеркивания можно и опустить совсем).

BlooDHounD 01.07.2008 14:24

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

Ромастый 01.07.2008 15:33

Цитата:

Сообщение от riden (Сообщение 748917)
Ложь. prototype нужен только лишь для организации наследования, как
Код:

Class.prototype = new SuperClass();
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw)
Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса).

Ну здрасте-приехали. Еще и во лжи объявили... :eek:
Если уж на то пошло, то и as1 класс создается НА ЭТАПЕ ИСПОЛНЕНИЯ кода в кадре, так что нет существенной разницы - добавили вы метод в конструкторе (так уж и быть, "теле" класса), или через prototype. Куда важнее, что а) - сохраняется область видимости; б) - все методы и свойства, добавленные в прототип, распространяются на ВСЕ экземпляры класса, а не создаются каждый заново при создании экземпляра. По мне, это куда ближе к концепции ООП.
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.
P.S. Задержался с ответом, но все же.

etc 01.07.2008 15:52

Цитата:

Сообщение от Ромастый (Сообщение 749233)
А создавать локальную функцию (по большому счету - независимый объект), делегировать ему функционал основного класса с помощью ссылки или apply/call - куда больший изврат.

Ну так мы же обеспечивали инкапсуляцию на уровне языка :)
Понятное дело, что проще инкапсулировать методы в собственной голове и закрыть глаза на то, что приваты торчат наружу.

chingachgoog 01.07.2008 16:00

Цитата:

Сообщение от __etc (Сообщение 748837)
Я буду скучен и повторю ответ BlooDHounD: Ну вы же знаете ООП? Тогда откуда такие вопросы?

Я буду еще скучнее и тоже повторюсь: мне понятно ваше желание не отвечать на этот вопрос.
Ведь как только такой ответ будет дан, сразу будет видно, что чему отвечает и соответствует.

Цитата:

Сообщение от wvxvw
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller

Народ, ну вы даете. Надо же так не знать, что такое объект активации :(
argumetns.caller - указатель на объект функции, но не на объект активации. Это разные вещи.
this - тоже не указатель на объект активации. Это свойство объекта активации, показывающее, чьим методом является функция.

Код:

function A(){
        function B(){
                trace(this)
        }
        B()
}
A() // [type Object] - это объект активации функции A, но не функции B!

Объект активации во ФП6 можно просмотреть for in с помощью ASSetPropFlags(), будет видно что все локальные свойства (var) внутренние (вложенные) функции, массив arguments, свойство this - все это содержиться в объекте активации.

etc 01.07.2008 16:31

Цитата:

Сообщение от chingachgoog (Сообщение 749242)
Я буду еще скучнее и тоже повторюсь: мне понятно ваше желание не отвечать на этот вопрос.
Ведь как только такой ответ будет дан, сразу будет видно, что чему отвечает и соответствует.

Я ответил на ваш вопрос вопросом, вы знаете ООП? Вы знаете, что такое инкапсуляция? Если знаете, то к чему вопрос, для какой цели созданы приваты? А созданы они для реализации инкапсуляции (одного из принципов ООП, это важно) на уровне языка. В AS1 также нет никакого полиморфизма на уровне языка, нет никакого контроля за сигнатурой в переопределенном методе, соответственно нет и интерфейсов.

Цитата:

Сообщение от chingachgoog (Сообщение 749242)
Объект активации во ФП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

Цитата:

Сообщение от __etc (Сообщение 749245)
Я ответил на ваш вопрос вопросом, вы знаете ООП? Вы знаете, что такое инкапсуляция? Если знаете, то к чему вопрос, для какой цели созданы приваты? А созданы они для реализации инкапсуляции (одного из принципов ООП, это важно) на уровне языка.

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

Сообщение от __etc (Сообщение 749245)
В AS1 также нет никакого полиморфизма на уровне языка, нет никакого контроля за сигнатурой в переопределенном методе, соответственно нет и интерфейсов.

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

Цитата:

Сообщение от __etc (Сообщение 749245)
iNils привел код, в котором нет объекта активации и код, в котором он является рутом.

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

Цитата:

Сообщение от __etc (Сообщение 749245)
И вообще, товарищ Гурский под объектом активации подразумевает как раз этот самый полуобъект-ссылку на локалку родительской функции, а вот большинство программистов, не знакомых с творчеством Гурского, под объектом активации понимают arguments.caller, т. е. метод/функция, вызвавший (активировавший) данный.

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

PS Кстати не __constructor__ а просто constructor


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

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