Каковы преимущества ООП на основе прототипов по сравнению с ООП на основе классов?

StackOverflow https://stackoverflow.com/questions/879061

Вопрос

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

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

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

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

--

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Я думаю, что этот аргумент аналогичен динамическому и статическому: класс — это статическое определение объекта, которое можно легко использовать, чтобы узнать, чего ожидать от объекта. Это также помогает оснастить языки необходимой поддержкой и документацией IntelliSense, потому что вы можете легко узнать, каковы различные члены и методы в объекте, другое дело - другая парадигма возможности объявлять частные члены в классе, которые не отображаются в объекте, это невозможно сделать в прототипе парадигма.

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

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

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

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

Если интересно, можно начать с Эта бумага о себе.

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

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

  1. Преимущества прототипного наследования по сравнению с классическим?
  2. Почему важно прототипное наследование

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top