Зависит от того, что вы считаете преимуществом.
Первый CLOS - это объектная система на основе классов , по сравнению с объектно-ориентированными объектными системами, не основанными на классах. CLOS имеет классы с множественным наследованием . Объекты CLOS - это экземпляры классов.
CLOS не создает пространства имен классов. CLOS также не позволяет размещать методы внутри классов и пространств имен этих классов.
Это означает, что CLOS не является передачей сообщений OO . Нельзя передать сообщение какому-либо объекту, где объект затем запускает соответствующий метод.
Исторически более ранние объектные системы для Lisp, из которых была разработана CLOS, начинались как традиционные системы на основе классов и передачи сообщений ( LOOPS , Flavors ). После нескольких лет экспериментов и исследований модель CLOS лучше подходила для Lisp и была более мощной.
CLOS использует универсальную функциональную модель , основное преимущество которой заключается в том, что она лучше вписывается в парадигму функционального программирования . CLOS использует вызов функций универсальных функций . Общая функция может иметь более одного аргумента и может отправлять несколько аргументов.
Это вписывается в остальную часть Common Lisp, так как другие функции также могут иметь более одного аргумента. Общие функции CLOS также можно передавать, возвращать из функций или сохранять в структурах данных. Таким образом, они также являются первоклассными функциями . Если вы находите эти вещи полезными (функции высшего порядка и множественная диспетчеризация), то у CLOS есть преимущество. Кроме того, универсальными функциями CLOS являются сами объекты CLOS.
Несколько вещей отличаются от других ОО-систем на основе классов - отсутствие пространства имен для класса и то, что методы не организованы по классам, уже упоминалось выше. Поскольку CLOS не является ОО с передачей сообщений, пересылка всех сообщений, отправленных одному объекту, другому объекту не применяется - если передача сообщений отсутствует, мы не можем пересылать несуществующие сообщения.
Одно очевидное возможное преимущество состоит в том, что, поскольку класс CLOS не связывает методы и методы, могут быть определены индивидуально, класс и набор методов не являются закрытыми. Можно добавлять или удалять новые методы в любое время. Это означает, что для новой или измененной функциональности не требуется исходный код, каким-то образом «заново открывать» класс или даже создавать подкласс класса, чтобы добавить новую функциональность в подкласс. Все, что не нужно в CLOS.
Несколько других возможных преимуществ:
CLOS имеет для организации функциональности общую функцию . Таким образом, функциональность не должна быть разбросана по классам, но может быть объединена в общие функции.
механизм отправки CLOS чрезвычайно гибок. Во время выполнения эффективный метод может быть собран из набора применимых методов , и сборка может управляться практически произвольным образом. Таким образом, новые способы диспетчеризации могут быть реализованы пользователем без необходимости изменения базовой реализации. Примером является реализация Проектирование по контракту . CLOS настолько гибок, что это может быть реализовано пользователем.
Как правило, расширенные реализации CLOS основаны на идее, что это объектная система по умолчанию, но допускает широкий спектр настроек самой объектной системы. Таким образом, CLOS определяет область возможных объектных систем, а не одну фиксированную. Функциональность по умолчанию уже достаточно продвинута: множественное наследование, динамические обновления, многократная отправка, комбинации методов и т. Д.
Чтобы узнать больше о философии проектирования CLOS, Common Lisp Object System, см. Следующие статьи: