Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.06.2008, 22:24
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 1  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
riden, вы уже давно ведетесь на уловки etc и пытаетесь переписать АС3 на АС1. С таким же успехом я могу доказать, что АС3 не ООП язык хотя бы потому, что в нем нет inline методов. Я перешел на АС3 совсем недавно и мне совсем не интересно изучать старую технологию. Но положение дел в этой теме меня совсем не устраивает, и я попытаюсь сам доказать, что АС1 - ООП язык. АС1 использует частный случай ООП - Прототипное_программирование. Так или иначе ООП предусматривает три основных парадигмы, рассмотрим каждую из них:
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
"
И чем проще код, тем сложнее допустить ошибку.


Последний раз редактировалось Яски; 30.06.2008 в 22:28.
Старый 01.07.2008, 10:44
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на 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 или нет.


Последний раз редактировалось etc; 01.07.2008 в 10:47.
Старый 01.07.2008, 13:47
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 3  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким
А кто вдруг решил, что в ООП обязательно должен быть this, что должны быть классы, множественное наследование. Например, в Си++ есть перегрузка операторов, но это дополнительная возможность, которой нет в истинном определении ООП.

Цитата:
Сообщение от __etc Посмотреть сообщение
А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript.
Может на эту тему тоже поспорим?

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

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


Последний раз редактировалось Яски; 01.07.2008 в 13:59.
Старый 01.07.2008, 14:21
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Яски Посмотреть сообщение
Может на эту тему тоже поспорим?
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"
Даже немного компактнее получилось.
Мой трейс:

Цитата:
Сообщение от Flash CS3
undefined
undefined
abstract method
undefined
undefined
undefined
undefined
undefined
undefined
NaN
NaN
undefined
Не работает, вы не находите?

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


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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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