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

Преимущества CLOS над другими системами OO класса

Я столкнулся с утверждениями, что Common Lisp Object System (CLOS) превосходит традиционные (основанные на классе) объектно-ориентированные системы. Википедия для CLOS упоминает различия между двумя подходами - в основном многократная отправка и разделение классов и методов в CLOS. Являются ли эти просто отличиями или истинными преимуществами CLOS?

4b9b3361

Ответ 1

Зависит от того, что вы видите как преимущество.

Первый CLOS - это объектная система на основе классов, по сравнению с объектно-ориентированными объектно-ориентированными объектами, основанными не на классе. CLOS имеет классы с множественным наследованием. Объекты CLOS являются экземплярами классов.

CLOS не создает пространства имен классов. CLOS также не делает методы находящимися внутри классов и пространств имен этих классов.

Это означает, что CLOS не передает сообщения OO. Один не передает сообщение некоторому объекту, где объект затем запускает соответствующий метод.

Исторически ранее объектные системы для Lisp, из которых был разработан CLOS, запускались как традиционные системы на основе классов и сообщений (LOOPS, Ароматизаторы). С несколькими годами экспериментов и исследований модель CLOS была лучше приспособлена к Lisp и была более мощной.

CLOS использует общую функциональную модель, основным преимуществом которой является то, что она лучше подходит к парадигме функционального программирования. CLOS использует функцию вызова общих функций. Общая функция может иметь более одного аргумента и может отправлять более одного аргумента. Это вписывается в остальные Common Lisp, поскольку другие функции также могут иметь более одного аргумента. Общие функции CLOS также могут быть переданы, возвращены из функций или сохранены в структурах данных. Таким образом, они также являются первоклассными функциями. Если вы обнаружите, что эти вещи (функции более высокого порядка и многократная отправка) полезны, то CLOS имеет преимущество. Кроме того, общие функции CLOS являются самими объектами CLOS.

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

Очевидным возможным преимуществом является то, что поскольку класс CLOS не связывает методы, а методы могут быть определены индивидуально, класс и набор методов не закрываются. Можно добавлять или удалять новые методы в любое время. Это означает, что для новой или измененной функциональности не требуется исходный код, как-то "повторно открыть" класс или даже подкласс класса, чтобы добавить новую функциональность в подкласс. Все, что не нужно в CLOS.

Несколько других возможных преимуществ:

  • CLOS имеет для организации функциональности общую функцию. Таким образом, функциональность не обязательно должна быть разбросана по классам, но может быть объединена в общие функции.

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

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

Чтобы узнать больше о философии дизайна CLOS, Common Lisp Object System, см. следующие статьи: