Ббк 32. 973-018 г рецензент канд физ мат наук, Ф. А. Мурзин
Download 278.16 Kb.
|
FIT-Gor-PP3
Функциональные модели ООП
Чтобы сравнить дистанцию ООП с ФП П. Грем (Paul Graham) в описании стандарта языка Common Lisp предлагает рассмотреть модель встроенного в Lisp объектно-ориентированного языка (ОО-язык), обеспечивающего основы ООП. Встраивание ОО-языка показывает характерное применение ФП – моделирование разных стилей программирования (начиная со стандартного программирования в виде prog-формы, предложенной Дж. Маккарти). В языке Lisp есть разные способы размещать коллекции свойств. Один из них – представлять объекты как хэш-таблицы и размещать свойства как входы в нее. П. Грем приводит пример (8 строк) реализации ООП на базе хэш-таблиц. Фактически наследование обеспечивает единственная особенность языка Lisp: все это работает благодаря реализации рекурсивной версии GETHASH. Впрочем, Lisp по своей природе изначально был ОО-языком. Определение методов может достичь предельной гибкости благодаря возможности генерировать определения функциональных объектов с помощью DEFMACRO или функцией категории FSUBR. Реализация ООП с помощью хэш-таблиц обладает слегка парадоксальной окраской: гибкость у нее больше, чем надо и за большую цену, чем можно позволить. Уравновесить это может подобная реализация на базе простых векторов. Этот переход показывает, как функциональное программирование дает новое качество «на лету». В опорной реализации фактически не было реализационного разделения объектов на экземпляры и классы. Экземпляр – это просто класс с одним-единственным предком. При переходе к векторной реализации разделение на классы и экземпляры становится реальным, также становится невозможным превращать экземпляры в классы простым изменением свойства. Более прозрачная модель ООП на базе обычных списков, иллюстрирующая глубинное родство ФП и ООП, реализована в системе CLOS. Показанный ниже пример 56 работает по первому аргументу (выбор подходящего метода рассчитан на то, что достаточно разобраться с одним аргументом), CLOS делает это на всех аргументах, причем с рядом вспомогательных средств, обеспечивающих гибкий перебор методов и анализ классов объектов. Рассмотрим примеры использования классов и экземпляров объектов: (defclass ob () (f1 f2 ...)) Это означает, что каждое вхождение объекта будет иметь поля-слоты f1 f2 ... (Слот – это поле записи или списка свойств.) Чтобы сделать представителя класса, мы вызываем общую функцию: (SETF с (make-instance 'ob)) Чтобы задать значение поля, используем специальную функцию: (SETF (slot-value c) 1223) До этого значения полей были не определены. Простейшее определение слота – это его имя. Но в общем случае слот может содержать список свойств. Внешне свойства слота специфицируются как ключевые параметры функции. Это позволяет задавать начальные значения. Можно объявить слот совместно используемым: :allocation :class Изменение такого слота будет доступно всем экземплярам объектов класса. Можно задать тип элементов, заполняющих слот, и сопроводить их строками, выполняющими роль документации. Нет необходимости все новые слоты создавать в каждом классе, поскольку можно наследовать их из суперклассов.
Пример 56. ОО-определение Lisp-компилятора CLOS, естественно, использует модель обобщенных функций, но мы написали независимую модель, используя более старые представления, тем самым показав, что концептуально ООП – это не более чем перефразировка идей Lisp-а. ООП – это одна из вещей, которую Lisp изначально умеет делать. Для функционального стиля программирования в переходе к ООП нет ничего революционного. Такой переход практически не расширяет пространство решений. Это просто небольшая конкретизация механизмов перебора ветвей функциональных объектов. При переходе от императивного стиля ООП компенсирует избыточную целостность представления отлаживаемых программ, смягчает жесткость зависимости компонентов программы от потока информационных процессов. Более интересный вопрос, что же еще может дать функциональный стиль и традиция реализации функциональных систем программирования? – Похоже, что это средства освоения новых архитектур и технологий. Другая модель ООП, полученная на базе обычных списков свойств (атрибутов), также иллюстрирует глубинное родство ФП и ООП [10]. Нужно лишь уточнить определение Lisp-интерпретатора, чтобы методы рассматривались как особая категория функций, обрабатываемая специальным образом. Спецификация Таблица 38 Download 278.16 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling