Подтвердить что ты не робот

Каковы преимущества, которые использует OO на основе прототипов в OO класса?

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

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

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

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

-

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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