Основанное на прототипах программирование может быть описано, как
объектно-ориентированное программирование, но есть еще что-то большее.
Основанные на прототипах языки и системы состоят из объектов, которые
содержат(абстрактно) в себе описания самих себя, в отличии от классических
объектно-ориентированных систем, в которых объекты описываются классами.
Для этого для объектов используются ассоциативные массивы.
Они, конечно, динамически рассширяемые, и вы так же можете добавлять в них
методы. Вы можете делать это так же динамически, что невозможно в
в статических(основанных на классах) ОО языках.
Основанные на прототипах ОО методы концептуально проще, чем основанные на
классах ОО, но и являются более мощными.
Основанное на прототипах программирование - WikipediaПрототипно-ориентированное, или чаще: основанное на прототипах
программирование, - это особый стиль объектно-ориентированного
программирования. Первым примером языка основанного на прототипах был язык
Self, наработки которого затем были скопированны в других проектах,
таких как, языки программирования Cecil, JavaScript, NewtonScript, Io и MOO.
Традиционные ООВ традиционных ОО системах, объекты бывают двух основных типов.
Классы организуют основную структуру и функциональность других объектов,
а экземпляры являются "используемыми" объектами, основанными на образце,
который заложен в конкретный класс. Использование такой системы обычно подразумевает разработку
необходимых классов, а затем написание программы, которая создаёт различные экземпляры этих классов для работы с ними
пользователя.
Если вы посмотрит в внутрь компьютера, то вы быстро сможете увидеть причину этой
дихтомииКлассы, фактически, являются коллекциями кода для объектов, который одинаков
для всех экземпляров, поскольку экземпляры являются коллекциями памяти, в
которых хранятся данные объектов, которые отличают их друг от друга(концепция
известная как состояние). Такая модель в основном работает хорошо с
традиционными компиляторами и языками, когда сначала в основном пишут код и
затем этот код манипулирует данными.
Для примера, скажем, вы делаете приложение-записную книжку, которое сможет
звонить людям. Вы должны иметь класс "Человек" для хранения списка людей.
Люди имеют имена и телефонный номер. Если вы посмотрите на такую программу, то
найдете, что ваш "Человек" представлен блоком памяти с кодом для дозвона по
телефону и различные экземпляры(Боб, Мария и т.д.) являются блоками памяти с именами
и телефонами с указателями на их класс. Когда вы говорите системе
позвонить Бобу, то она посмотрт телефон Боба из данных экземпляра и затем
обратится по указателю к методу дозвона в классе "Человек".
Однако такие системы имеют серьезные проблемы, которые становятся
заметными когда размеры системы начинают расти. Программы редко остаются
статическими и постоянная структура исходного класса становится менее полезной.
В результате этого все больше кода добавлятеся в новые классы, что в большинстве
негативно сказывается на свойствах и ОО систем.
Было бы проще, если бы ваша программа могла изменить описание этих низлежащих
классов, но в большинстве систем они находятся в скомпилированном коде,
что не позволят их изменить.
ПрототипныеПрототипные языка избегают этой проблемы обходясь без
дуализма, который рождает проблему. Вместо содержащих данные экземпляров и
содержащих функции классов они имеют только объекты и ничего кроме объектов.
Для того, чтоб получить новый объект вы делаете копию одного из уже
существующих. Все такие системы начинают работу с всего лишь одного загруженнго объекта,
но все они имеют список общеиспользуемых объектов, работа с которыми позволяет их делать более
похожими на традицонные системы. Когда вы копируете какой-либо объект, то вы получаете
совершенно новый объект, который, однако, имеет такие же свойства, как его оригинал. Вместо
указателя на класс, этот новый объект содержит указатель на объект, который создал его.
Фактически новый объект, в большинстве своем, пустой. Он только тогда начинает
расти в памяти, когда программа менят его. Это совершенно отлично от
традиционных ОО систем, где каждый экземпляр класса всегда резервирует
известное количесво памяти. Здест базовый объект состоит только из
одного указателя.
Дополниетльный данные могут быть добавлены в объект в любое время. Если вы
хотите, чтоб ваш новый "Человек" имел имя "Боб", то вам нужно только добавить
его. Объект, начиная с этого действия, начнёт расти для сохранения
требуемых данных.
Есть одно очень важное различее с обычными языками. Объект увеличивается только
тогда, когда необходимо добавление чего-либо в объект. Хотите, чтоб объект
"Боб" имел номер сотового телефона? Сделайте это. Мари имеет номер факса?
Отлично. Фактически каждый объект такой системы стремится стать отличным от
других, не только данными, но и тем как данные в него были записаны.
Также важно рассмотреть то, что правило "добавить что-то" применимо и к методам.
Если объект "Мари" нуждается в методе, котрый никто не имеет, скажем "послать факс",
то вы можете добавить его используя такую же методолгоию. Вот почему многие основанные на
прототипах языки описывают и данные и методы, как "слоты".
Основынные на прототипах языки стремятся начинать с выбора базовых объектов,
которые затем вы сможете копировать. В основном эти объекты имеют тенденцию иметь
только описание методов, полагая, что прграммист добавит нужные данные.
Для примера, объект "Точка", который может помнить координаты на экране, так
же может содержать методы для добавления и стирания точек, но он не будет
содержать значения X и Y, их добавит программист индивидуально для каждой копииобъекта.
Как результат всего этого мы имеем огромную гибкость. Ошибки в методах
существующих объектов могут быть легко исправлены простой посылкой нового кода
(в форме блоков) в соответствующий "слот". Вы можете изменить любой объект в
другой, заменяя методы в такой же манере.
Разработка классов становится более простой задачей, потому, что вы можете легко
изменять описание "класса" в любое время и, что более важно,
из любого приложения( т.е. одно приложение может исправлять ошибки в
конкректном объекте и никому больше не будут видны эти исправления).
Copyright © 1996-2007 by Dr. Nikolai Bezroukov.