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

Андрей Параничев 05.02.2009 22:50

"Классический" ООП в JavaScript
 
Несколько раз начинал писать этот пост, но в итоге решил не распинаться, а спросить коротко и ясно.

Используете ли вы эмуляцию "классического" ООП (с классами и наследованием на классах) в своих проектах, или пользуетесь конструкторами и наследованием на прототипах? Или вообще не пользуетесь наследованием?

Kolyaj 05.02.2009 23:43

Зависит от используемого фреймворка. В данный момент в основном Ext, соответственно и наследование через Ext.extend. Если что-то делается без фреймворка, то, как правило, и наследование не особо нужно.

Андрей Параничев 05.02.2009 23:51

Kolyaj,
Другими словами, если бы ты решал задачу уровня ExtJS, но без фреймворка, то реализовал бы классическую модель ООП?

Kolyaj 05.02.2009 23:55

Цитата:

Сообщение от Андрей Параничев
если бы ты решал задачу уровня ExtJS, но без фреймворка

Пожалуй задачу уровня ExtJS не то что без фреймворка, а с любым другим трудновато решить.

Цитата:

Сообщение от Андрей Параничев
то реализовал бы классическую модель ООП?

Давай определимся, чтобы не говорить о разном: что есть классическая модель ООП?

Dmitry A. Soshnikov 06.02.2009 00:00

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

Я практически всегда для примера привожу классовую модель Python'a, чтобы показать, что разницы между "динамическим ООП на классах" и "ООП на прототипах" практически нет (если нужно будет привести примеры и показать сходство, скажите).

Что же касается статической классовой ООП модели (aka Java или C++), то ее просто физически нельзя сделать в JS (даже эмуляцию). Во сколько бы обертор мы не обернули бы конструкторы, внутри все равно будет prototype-base inheritance.

Единственное, для чего можно использовать обертки - это улучшение code reuse - вынос повторяющегося блока наследования (обеспечение связки прототипов) в обертку. Как потом эту обертку называют - "Class", "Extend", "Inherit" и т.д. - не суть важно, главное, чтобы человек понимал, что он делает. Другой вопрос, когда начинается непонимание технологии ввиду того, что человек не имеет достаточного объема информации и может доказывать то, что к JS не имеет никакого отношения. Часто причиной этому могут быть статьи с громкими заголовками типа "Наследование на классах в JS", которые подсознательно могут откладываться в умах людей, который пока поверхностно разбираются в JS, как "доведем до ума этот бесклассовый недоязык". Это уже неправильно.

А в целом - никто не ограничивает делать обертки (для улучшения code reuse'a) и называть как вздумается. У меня в одном проекте был виджет-фреймворк написан, где было построено наследование виджетов (aka Widget -> WidgetPanel -> WidgetWindow -> WidgetDialog и т.д.). Для чего я использовал там обертку? - Чтобы вынести в нее блок кода, обеспечивающий связку прототипов. Все. Объективно, это единственная причина, т.к. вся эта мишура с оберткой, могла бы быть описана и без нее - и без потери какой-либо читабельности и функциональности. Но мне было удобней с обреткой.

Поэтому, если анализировать различия, то, повторю, в большей мере надо говорить о "статика vs. динамика"; пара же "прототип vs. класс" очень больших отличий не покажет.

Андрей Параничев 06.02.2009 00:00

Kolyaj,
Цитата:

Сообщение от Kolyaj
Пожалуй задачу уровня ExtJS не то что без фреймворка, а с любым другим трудновато решить.

Ну это вопрос чисто теоретический. Скорее вопрос должен был звучать "если бы ты писал ExtJS, ты бы использовал эмуляцию классического ООП?".

Цитата:

Сообщение от Kolyaj
Давай определимся, чтобы не говорить о разном: что есть классическая модель ООП?

Я по этим понятием подразумеваю описание классов и наследование, которое основывается на классах.

Kolyaj 06.02.2009 00:11

Цитата:

Сообщение от Андрей Параничев
если бы ты писал ExtJS, ты бы использовал эмуляцию классического ООП?

Так а че там? Сделали функцию-обертку для связывания прототипов, вот тебе и классическое ООП настолько, насколько это возможно и нужно в JavaScript.

Dmitry A. Soshnikov 06.02.2009 00:15

Цитата:

Сообщение от Kolyaj
вот тебе и классическое ООП

Вот тебе и ООП с оберткой. "Классическое", "основанное на классах" - не стоит в противоположном углу, относительно "прототипное". Противопоставляется только динамика-статика.

Kolyaj 06.02.2009 00:19

Dmitry A. Soshnikov,
ну я в рамках предложенного определения
Цитата:

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


Андрей Параничев 06.02.2009 00:34

Dmitry A. Soshnikov,
Спорить по вопросу статика vs. динамика в рамках JavaScript, как я понимаю, бессмысленно. Поэтому мы говорим только о динамической модели. Ясно, что реализация динамического классового ООП на JavaScript это то же прототипное ООП, вид сбоку.

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

Kolyaj,
Цитата:

Сообщение от Kolyaj
насколько это возможно и нужно в JavaScript.

Ключевое слово - нужно, а без такой обертки не реализовать удобное наследование?

Просто я не видел пример "элегантного" наследования на прототипах, которое бы сохраняло функциональность конструктора родительского класса, выстраивала цепочку прототипов (для instanceOf) и правильно линковала constructor. И чтоб она была без прослойки.


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