Какие преимущества имеет ОО на основе прототипа по сравнению с ОО на основе класса? - PullRequest
42 голосов
/ 18 мая 2009

Почему ОО на основе классов так популярен, а не ОО на основе прототипов? Они преподают последнее в школах? Хотя Javascript основан на прототипах, большинство людей используют его в основном функционально или через фреймворки, которые пытаются эмулировать систему, основанную на классах.

Я знаю, что Sun проводила некоторые исследования по Self - есть ли какой-либо другой источник знаний о oO на основе прототипа? желательно то, что доступно для самообучения.

Я нашел книгу, в которой опубликованы статьи: Программирование на основе прототипов: концепции, языки и приложения

Кто-нибудь читал это?

-

Так что я дал награду за ответ, который дал мне больше всего. Тем не менее, я не очень доволен. Мне бы хотелось услышать гораздо более технические ответы. Может быть, я не объяснил себя хорошо.

Ответы [ 7 ]

23 голосов
/ 25 мая 2009

Преимущество наследования прототипа заключается в том, что оно потенциально позволяет осуществлять простое метапрограммирование, поскольку цепочкой прототипов легко манипулировать. Это довольно академическое преимущество, потому что метапрограммирование является неправильным ответом в 99% случаев. Например, у вас может быть слой манипулирования данными в стиле Javascript Key-Value Observer со специальным DSL, который прозрачно переключается между локальной поддержкой SQLite в автономном режиме и хранилищем на основе REST при подключении через прототип. Я не уверен, что это лучший способ сделать это, но это лучшее, что я могу придумать так поздно. Это не та вещь, которую вы обычно хотите делать в коде проекта, так как такого рода косвенность является адской отладкой, когда вы начинаете работать с ней на нескольких уровнях, но это неплохо, когда вы храните ее в библиотеке.

Еще одним менее полезным преимуществом является то, что он позволяет вам создавать собственную систему классов. Я говорю менее полезно, потому что более или менее все библиотеки javascript имеют свой собственный слегка несовместимый подход к тому, как «классы» объединяются.

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

19 голосов
/ 20 мая 2009

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

Правда намного проще: классная ОО популярна, потому что Java использует классическую ОО, а Sun потратила миллионы долларов и очень долго строила популярность Java - убедившись, что люди знают, что она успешно используется в корпорациях широко в университетах, и на тестах AP средней школы.

Prototypal / classic OO - это просто разные способы организации ваших идей. Вы можете реализовать любой из них на языках, которые его не поддерживают изначально (на ум приходят Python и Java и JavaScript с другой стороны).

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

12 голосов
/ 18 мая 2009

Я не знаю точных причин этого, но вот мои причины

Я думаю, что этот аргумент аналогичен Dynamic vs Static, класс является статическим определением объекта, который можно легко использовать, чтобы узнать, чего ожидать от объекта, он также помогает инструментам языков иметь надлежащую поддержку intellisense и документация, потому что вы можете легко узнать, каковы различные члены и методы в объекте, другая вещь - это другая парадигма возможности объявления частных членов в классе, который не отображается на объекте, это не может быть сделано в прототипе парадигмы.

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

10 голосов
/ 08 октября 2009

Этот вопрос меня заинтриговал, поэтому я вернулся и прочитал несколько оригинальных статей о концепции. Похоже, это началось в середине 1980-х годов в мире Smalltalk, но в конечном итоге стало одним из основополагающих принципов Self . Много позже Javascript также принял его.

Аргумент, выдвигаемый в газетах, заключается в том, что его легче учить. Там действительно не предлагается никаких технических выгод, кроме обучения. Все статьи объясняют, как он так же выразителен, как и язык классов, но намного легче выучить. Люди естественно думают о вещах конкретным образом, а не абстрактно. Мы думаем о слоне, которого мы видели в зоопарке, а не об общем «слоне». Когда мы видим других слонов, мы классифицируем их как отличия от первого. Язык на основе прототипов облегчает это мышление. Думайте об этом как о программировании с помощью дифференциала.

Это достаточная причина, чтобы использовать его на языке? Может быть. За 25 лет, прошедших с тех пор, как идея впервые начала распространяться, я бы сказал, что абстрагированные концепции, такие как ОО на основе классов, не слишком сложны для изучения большинством людей. С другой стороны, возможно, существует потребность в языке программирования (например, Javascript), который проще, и это может быть способом сделать это.

Если интересно, вы можете начать с этой статьи о себе.

6 голосов
/ 20 мая 2009

http://en.wikipedia.org/wiki/Prototype-based_programming#Criticism, я думаю, это достаточно хорошо объясняется.

4 голосов
/ 01 июня 2013

Я действительно не хочу писать еще одну статью о наследовании прототипов, поэтому я просто свяжу вас с моими предыдущими статьями Имейте в виду, они действительно длинные, но их стоит прочитать:

  1. Преимущества наследования прототипа перед классическим?
  2. Почему вопросы наследования прототипа
3 голосов
/ 21 мая 2009

Я думаю, что разница в мощном динамическом (прототипном) языке дает вам. Javascript, как и LISP, дает практически неограниченные возможности программисту. Эта сила ограничена только ответственностью программиста и уровнем его уверенности в себе. Таким образом, обсуждение так же стара, как и статическая типизация или типизация. Если вы считаете, что ваша сила программирования и самодисциплина достаточно сильны - выбирайте прототип.

Перефразируя одно известное высказывание:

Талант делает то, что может (читай: на основе классов), гений делает то, что хочет (читай: на основе прототипов).

...