Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   "Классический" ООП в JavaScript (https://javascript.ru/forum/misc/2740-klassicheskijj-oop-v-javascript.html)

Pavel_Volodko 03.03.2009 16:46

Цитата:

Сообщение от Zeroglif (Сообщение 13539)
Отсюда 2 вывода - то ли вам важны локальные переменные ($className), то ли вам не нравится "обвешивать" объект-прототип руками или через for-in...

Локальные переменные не важны. Это просто одна из возможностей.
А вот "обвешивать" объект мне не нравится - это точно.

Цитата:

Сообщение от Zeroglif (Сообщение 13540)
instanceof не оправдывает своего названия буквально и является терминологической натяжкой из чужого class-based мира, в js объекты наследуют от объектов, понятия "класс" не просто нет, а если бы оно даже и было, то мы бы столкнулись с задачей определения, что включить в этот термин - прототип или прототипы, конструктор или конструкторы, или всё вместе, что участвовало в создании цепочки или её составляет, при этом, если цепь прототипов после содания хе-хе "instance" можно считать стабильной и связанной с ним, то свойству 'prototype' конструкторов можно присваивать другие значения, что делает алгоритм instanceof в этом случае бесполезным.

Тут не соглашусь. instanceof работает как ему положено. Вопрос в том, правильно ли мы его используем. Понятно, что в javascript-е можно перехерачить любой объект до неузнаваемости, но в таком случае, его никто и не узнает :)
Если архитектура приложения правильная, то иерархия наследования не может быть не стабильной. Если цепочка где-то ломается - плохая архитектура.
Язык дает программисту полную свободу, но не стоит ей злоупотреблять.

Zeroglif 03.03.2009 17:06

Цитата:

Сообщение от Pavel_Volodko
А вот "обвешивать" объект мне не нравится - это точно.

Ну, вот и причина.

Цитата:

Сообщение от Pavel_Volodko
Вопрос в том, правильно ли мы его используем.

А как бы вы его (оператор) правильно использовали? Пусть мы узнали, что sidorov instanceof Person, и что дальше с этим делать?

x-yuri 03.03.2009 17:06

Цитата:

Дело не в эмулировании. Дело в том, что я расширяю стандартные возможности javascript или пытаюсь сделать что-то немного удобнее для использования при разработке. Если решение мне помогает - цель достигнута.
если тебе помогает, это хорошо. Я просто не знаю, как оно мне может помочь :blink:

Цитата:

Насчет "естественный вариант должен быть проще, по идее" - проще не значит лучше. Я и сам за простые решения.
имелось в виду "Сделай так просто, как возможно, но не проще этого"

Цитата:

Кстати, с этой точки зрения, моё решение абсолютно естественное, т.к. построено на элементарных возможностях прототипного наследования
оно не может быть абсолютно естественным, т.к. это наследование, построенное на базе прототипного (естественного) наследования

Цитата:

Если архитектура приложения правильная, то иерархия наследования не может быть не стабильной. Если цепочка где-то ломается - плохая архитектура
что-то мне кажется, что не все так однозначно - "только классические иерархии, к которым мы привыкли в статических языках"

Pavel_Volodko 03.03.2009 17:15

Цитата:

Сообщение от Zeroglif (Сообщение 13544)
Ну, вот и причина.


А как бы вы его (оператор) правильно использовали? Пусть мы узнали, что sidorov instanceof Person, и что дальше с этим делать?

:confused: Даже не знаю, что и сказать... Да что нужно, то и делайте. Это же просто инструмент. Это тоже самое, что сказать "ну есть у меня молоток и что с ним делать?". Не знаете что делать, значит вам не нужен молоток :)

Kolyaj 03.03.2009 17:21

Зачем нам instanceof, если у нас duck typing?

Pavel_Volodko 03.03.2009 17:22

Цитата:

Сообщение от x-yuri (Сообщение 13545)
если тебе помогает, это хорошо. Я просто не знаю, как оно мне может помочь :blink:


имелось в виду "Сделай так просто, как возможно, но не проще этого"


оно не может быть абсолютно естественным, т.к. это наследование, построенное на базе прототипного (естественного) наследования


что-то мне кажется, что не все так однозначно - "только классические иерархии, к которым мы привыкли в статических языках"

Это уже какая-то философия.

Ещё раз повторюсь - я сделал то, что мне было нужно, исходя из своих собственных представлений о процессе разработки на javascript. Если вы не видите как это можно использовать, значит вам это и не нужно. Всего-то.

Я просто хочу показать, что можно делать вот так, но не утверждаю, что по-другому нельзя.

Zeroglif 03.03.2009 17:24

Цитата:

Сообщение от Pavel_Volodko
Не знаете что делать, значит вам не нужен молоток

Я знаю, что этот молоток мне совершенно не поможет, поэтому давно его не использую. Вообще. Просто вы сказали, что instanceof надо правильно использовать, что это определитель принадлежности объекта классу и проч., так как вы с ним работаете? На примере того же sidorov-а, допустим мы с помощью молотка instanceof узнали, что Person.prototype находится в где-то в цепи прототипов sidorov-a, и дальше что?

Pavel_Volodko 03.03.2009 17:40

Цитата:

Сообщение от Zeroglif (Сообщение 13551)
Я знаю, что этот молоток мне совершенно не поможет, поэтому давно его не использую. Вообще. Просто вы сказали, что instanceof надо правильно использовать, что это определитель принадлежности объекта классу и проч., так как вы с ним работаете? На примере того же sidorov-а, допустим мы с помощью молотка instanceof узнали, что Person.prototype находится в где-то в цепи прототипов sidorov-a, и дальше что?

Под "правильно использовать" имелось ввиду с архитектурной точки зрения.
Загляните в код Prototype. Там есть примеры использования.

Dmitry A. Soshnikov 03.03.2009 17:49

Цитата:

Сообщение от Pavel_Volodko
Под "правильно использовать" имелось ввиду с архитектурной точки зрения.

Ну вот, всё-таки, интерес больше академический, нежели прикладной (это тоже хорошо). Однако, в данном случае получается instanceof ради instanceof; на практике он вряд ли пригодиться.

А в целом, если Вам удобно и иерархическая структура при использовании этой обёртки Вам кажется более удобной - это самое главное (с учётом, естественно, что Вы знаете и понимаете, как это работает без обёртки).

А вообще,
Цитата:

Сообщение от x-yuri
это наследование, построенное на базе прототипного (естественного) наследования

Что значит на базе? Это и есть прототипное наследование. Просто в удобной (в конкретном случае, для конкретного человека) обёртке. Суть там никак не меняется.

update:
Цитата:

Сообщение от Kolyaj
Зачем нам instanceof, если у нас duck typing?

а зачем подобный оператор в других языках (Python, Ruby) и при наличии duck typing'a?

x-yuri 03.03.2009 18:05

Цитата:

Что значит на базе? Это и есть прототипное наследование. Просто удобной (в конкретном случае, для конкретного человека) обёртке. Суть там никак не меняется
реализация - прототипное наследование естественно, но ведь автор хочет сэмулировать классовое наследование. Возможно будут ситуации, когда прийдется вспомнить, что в Javascript нету классового наследования

Цитата:

А в целом, если Вам удобно и иерархическая структура при использовании этой обёртки Вам кажется более удобной - это самое главно (с учётом, естественно, что Вы знаете и понимаете, как это работает без обёртки)
:yes:

Kolyaj 03.03.2009 18:08

Цитата:

Сообщение от Dmitry A. Soshnikov
а зачем подобный оператор в других языках (Python, Ruby) и при наличии duck typing'a?

Я первый спросил.

Dmitry A. Soshnikov 03.03.2009 18:13

Цитата:

Сообщение от x-yuri
но ведь автор хочет сэмулировать классовое наследование. Возможно будут ситуации, когда прийдется вспомнить, что в Javascript нету классового наследования

А там не велика разница - если язык динамический ;) -

http://javascript.ru/forum/misc/2740...html#post12189

x-yuri 03.03.2009 18:19

мне показалось, что Pavel_Volodko скорее хочет классовое наследование как в статических языках?

Zeroglif 03.03.2009 18:38

Цитата:

Сообщение от Pavel_Volodko
Загляните в код Prototype. Там есть примеры использования.

Не хотите говорить - не надо, только в либы не посылайте... ;)
Цитата:

Сообщение от Dmitry A. Soshnikov
Python

У тебя словно переключатель в голове с надписью python, чуть потемнело - чик, "а вот в pythone так там вообще..." ;)

x-yuri 03.03.2009 18:57

Цитата:

У тебя словно переключатель в голове с надписью python, чуть потемнело - чик, "а вот в pythone так там вообще..."
Zeroglif судя по всему там действительно вообще :blink:

Dmitry A. Soshnikov 03.03.2009 19:15

Цитата:

Сообщение от Zeroglif
У тебя словно переключатель в голове с надписью python, чуть потемнело - чик, "а вот в pythone так там вообще..."

Ну здрасте! Переключатель! :) Что теперь, если идеологии, действительно, похожи (но не идентичные, естественно), а терминология разная? Можно подумать, я на пустом месте это говорю.

Цитата:

Сообщение от Zeroglif
чуть потемнело

наоборот - чуть найдена очередная схожесть конкретных технологий в общих "закономерностях"

P.S.>: да и... ты забыл Ruby еще ;) чик, "а там еще интересней Python'a и тоже - похоже на JS"

kefi 24.03.2009 16:31

Цитата:

Сообщение от Zeroglif (Сообщение 13540)
instanceof не оправдывает своего названия буквально и является терминологической натяжкой из чужого class-based мира, в js объекты наследуют от объектов, понятия "класс" не просто нет, а если бы оно даже и было, то мы бы столкнулись с задачей определения, что включить в этот термин - прототип или прототипы, конструктор или конструкторы, или всё вместе, что участвовало в создании цепочки или её составляет, при этом, если цепь прототипов после содания хе-хе "instance" можно считать стабильной и связанной с ним, то свойству 'prototype' конструкторов можно присваивать другие значения, что делает алгоритм instanceof в этом случае бесполезным.

Почему же нельзя определить Класс как пару Конструктор + прототип ?
При этом оговориться что он определяет только Начальный (т.е. при его создании) тип экземпляра.
Включать в понятие несколько конструкторов или несколько прототипов не требуется, т.к. данный конструктор содержит вызовы родительских, а данный прототип из пары Конструктор-прототип - ссылку __proto__ на родительские прототипы , что однозначно определяет всю цепь наследования. Конечно возможны с помощью данного конструктора создание экземпляров с разным набором свойств в зависимости от заданных конструктору параметров , но тем не менее - другого начального создателя у экземпляра НЕТ.

Q: Как использовать instanseof , если в текущий момент экземпляр уже на 100 км отличается от того, что использовался при его создании ?
A: Так же как и если бы он не отличался. Т.е., imho ,это вопрос вообще говоря о том, как вобще использовать instanceof в классическом ООП.

Zeroglif 24.03.2009 21:26

Цитата:

Сообщение от kefi
Почему же нельзя определить Класс как пару Конструктор + прототип ?

Можно определить, никто не мешает тому, как именно держать это в уме.

Цитата:

Сообщение от kefi
что однозначно определяет всю цепь наследования

Ваш первоначальный конструктор может быть пустой безымянной функцией, которая связывает прототип с объектом и тихо помирает - ни имени, ни тела, ничего. То, что это первоначальный создатель видно по коду, но обычными словами род/тип объекта не выразить, признаков нет, уцепиться не за что. Суть объекта (что он наследует) возможно будет выражена где-то выше, допустим в цепи его прототипов есть Func.prototype, и этот конструктор Func вполне себе попадает в instanceof, хотя конструктором вышеуказанного объекта не является ни разу.

kefi 24.03.2009 22:07

[code=Zeroglif]Можно определить, никто не мешает тому, как именно держать это в уме.[/code]
Так я же попытался не в уме , а на бумаге это определить.
Цитата:

Сообщение от Zeroglif
Ваш первоначальный конструктор может быть пустой безымянной функцией

Ввиду слабости в javascript я как-то не могу себе представить, как это возможно анонимный конструктор и его прототип сделать потомками еще какой бы то ни было пары Конструктор-прототип, т.е. я имею ввиду направить свойство __proto__ прототипа сопровождающего анонимный конструктор на другой прототип , ведь прототип , сопровождающий анонимный конструтор это Function.prototype :
Имеются тождества :
{n:"132" }.constructor===Object ;
{}.constructor===Object ;
function(){}.constructor===Function ;
Т.е. не будет в цепи наследования анонимных конструкторов .
Докажите, плз, если, где я ошибаюсь.
Впрочем, есть и такой вариант :
var s=new function(){this.n="132" ; } ; s.constructor!==Function
Но все равно и здесь не направить, свойство __proto__ на предка.

Вот. Но это одно.
А второе - если основывать приложения на простом правиле - не делать в цепи наследования анонимных конструкторов, то вопрос снимается .

Для ненаследуемого же экземпляра , созданого анонимным конструктором всегда можно говорить , что это экземпляр типа(класса)
и далее приводить литеральное описание класса, который использовался для создания. Что конечно многословно, но для устранения многословнояти при описании можно пользоваться придумаными именами для обозначения этого класса .

x-yuri 24.03.2009 23:26

ну это все детали, на самом деле
меня вот, например, интересует, зачем использовать классическое наследование в js. Пока я вижу одну причину: так привычнее людям, пришедшим с других языков

kefi 25.03.2009 00:00

2 x-yuri > Мне кажется не в привычках дело, а в моделях (паттернах) и соответствено подходах к их построению , В классическом ООП создано много полезных моделей, не использовать которые было бы странно . Вообще До объектного подхода языками программирования не предлагалось никаких прикладных моделей . Модель - это главное слово в программировании. Поэтому не стесняюсь повторить его столько раз.
Конечно все imho, но как-то не вижу аргументов против.

x-yuri 25.03.2009 00:46

я так понимаю, речь идет о паттернах. Потому что под моделью я понимаю нечто, обладающее основными свойствами моделируемой сущности

так вот, имхо, паттерны находятся на более высоком уровне, на котором не важно, классическое это наследование или прототипное. По-крайней мере, сходу никаких проблем с этим связанных в голову не приходит

kefi 25.03.2009 13:39

2 x-yuri >
Я так понимаю - модель есть фундаментальное сильное красивое слово, которым можно обозначить все, что угодно, важно только понимать его смысл(отражение (и реализация этого отражения) некого предмета(предметной области) для достижения поставленной цели). Паттерн, разумеется, тоже модель, причем для своей реализации использующий как раз подходы ООП.
Т.е., паттерны (шаблоны), по-моему ( если ошибаюсь, докажите ) находятся как раз на уровне , привязаном к OOП. Просто я не встречал шаблонов для прототипного программирования (ПП), если Вы встречали - укажите где.
Из вышесказанного следует также отношение к вопросу - нужно ли использовать обертки для эмулирования классов:
классовые обертки позволяют сделать язык (т.е. инструмент) создания моделей более ясным (и значит, эффективным), что для реальных (т.е сложных) задач единственно возможный путь достуижения адекватного результата . Хотя опять же , что поднимать под обертками - я , например, пока предпочел бы пользоваться парой функций extend и mixing из http://javascript.ru/tutorial/object...nktsiia-extend а создаваемые с помощью их классы (Конструктор + наполнение его прототипа методами) оформлять текстуально в примечаниях (// Класс A ...<Здесь его конструктор A и наполнение его прототипа A.prototype > // Конец класса A) , что по моему как раз будет соответсвующим той гибкости, ради которой и задумывалось ПП.

Zeroglif 25.03.2009 14:53

Цитата:

Сообщение от kefi
я , например, пока предпочел бы пользоваться парой функций extend и mixing

Это нельзя назвать шаблоном для ПП?

kefi 25.03.2009 16:12

2 Zeroglif > Можно, Но что с этого ? Это шаблон для эмуляции классового наследования (или, если хотите, классов ),т.е. это низкоуровневый шаблон. А шаблоны, о которых я вел речь выше, есть шаблоны построения из классов прикладных моделей . Есть такие для ПП ? Я не настаиваю, может и есть, я просто спрашииваю.

x-yuri 25.03.2009 16:19

kefi, они просто есть, вне зависимости от ООП это или ПП. Возможно в обоих парадигмах есть специализированые. Но есть общие более высокого уровня (и таких, думаю, большинство). Поправьте, если ошибаюсь. Есть какие-нибудь примеры шаблонов, которые нельзя реализовать с помощью ПП?

kefi 25.03.2009 17:04

2 x-yuri > Мне кажется, что патерны получили свое происхождение от ООП, и модели, которые они предлагают в проектировании оперируют понятиями класса , для прототипа же имеется отдельный шаблон, его использование во взаимосвязи с остальными еще нужно поизучать ...
Вот почитайте , http://ru.wikipedia.org/wiki/Шаблоны_проектирования .
Есть ли примеры, которые нельзя реализовать с помощью ПП, не знаю, но думаю, что есть, которые будут встречать большие трудности , чем их ООП реализации.

x-yuri 25.03.2009 18:33

kefi, ПП в некотором смысле сродни динамическим языкам. Кроме того, так же как при попытке эмуляции классического наследования нужно придерживаться некоторых соглашений, так и при реализации паттернов не будет такого жесткого контроля, как при использовании статических языков. Т.е. дело скорее в динамичности языка, чем в прототипном наследовании. Но ведь шаблоны вполне себе применяются в динамических языках

Кроме того, я не понимаю чем прототипное наследование так отличается от классического, что паттерны к нему неприменимы. Тем более, что вы рассматриваете не "низкоуровневые шаблоны", а "шаблоны построения из классов прикладных моделей" (хоть я и не понимаю, что последнее значит, но это, похоже, высокоуровневые шаблоны имеются в виду)


Часовой пояс GMT +3, время: 15:10.