Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ.




Скачать 117.78 Kb.
НазваниеЛекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ.
Дата публикации19.04.2014
Размер117.78 Kb.
ТипЛекция
uchebilka.ru > Информатика > Лекция

Парадигмы

Лекция 9. Объектно-ориентированное программирование



Эволюция подходов к организации структур данных на уровне задач и реализации программ. Реализация абстрактных типов данных. Контроль типов данных при разработке и применении программ. Инкапсуляция. Уточнение типов данных для компилятора. Методы обработки данных, управляемые типами данных. Наследование свойств и «дружественный» доступ. Расширяемость программ при объектно-ориентированном подходе к программированию. Библиотеки типов данных и методов их обработки. Функциональная модель ОО-языка. Компоненты: объекты, субъекты, аспекты. Подходы к декомпозиции программ и накоплению компонент программ. Схемы программ. Свертка информационно-замкнутых конфигураций. Спецификация интерфейсов и верификация реализации компонент. Контекст исполнения компонент. Факторизация программ и программных компонент.
Анализируется содержательное родство между функциональным (ФП) и объектно-ориентированным (ООП) программированием. Рассмотрены основные принципы ОО-программирования и проанализированы схемы их реализации в рамках функционального программирования на базе ряда структур данных на примере простой модели ОО-языка, встраиваемого в Лисп. Отмечены особенности CLOS, поддерживающей ООП на GNU Clsip. Реализация методов обработки объектов заданного класса сводится к отдельной категории функций, вызов которых управляется анализом принадлежности аргумента классу.
Сборка программы из автономно развивающихся компонентов опирается на формулировку достигаемой ими цели, понимание которой гарантирует не только корректность полученного результата, но и рациональность его использования. Формулировать цели частей программы - процесс нетривиальный. В его основе лежат весьма различные подходы к классификации понятий.
ООП объединяет в рамках единой методики организации программ классификацию на базе таких понятий как класс объектов, структура данных и тип значений. Тип значений обычно отражает спектр низкоуровневых реализационных средств, учет которых обеспечивает эффективность кода программы, получаемого при компиляции. Структура данных обеспечивает конструктивность построений, гарантирует доступ к частям, из которых выстроено данное любой сложности. Класс объектов характеризуется понятным контекстом, в котором предполагается их корректная обработка. Обычно контекст содержит определения, структуру объектов и их свойства.
Текст программы одновременно представляет и динамику управления процессами, и схему информационных потоков, порождаемых при исполнении программы. Кроме того, последовательность написания программы и ее модификации по мере уточнения решаемой задачи могут соответствовать логике, существенно отличающейся от процесса выбора системных и реализационных решений. Обычно программирование скрывает сложность таких деталей управления процессами путем сведения его к общим функциям, преобразующим любые аргументы в определенные результаты. Модификации осуществляются в процессе изменения состава ветвей непосредственно в определении каждой функции.
ООП структурирует множество частных методов, используемых в программе, в соответствии с иерархией классов объектов, обрабатываемых этими методами, реализуемыми с помощью функций и процедур, в предположении, что определяемые в программе построения могут локально видоизменяться при сохранении основных общих схем информационной обработки. Это позволяет выполнять модификации объявлением новых подклассов и дописыванием методов обработки объектов отдельных классов без радикальных изменений в ранее отлаженном тексте программы.
При анализе задач, решаемых в терминах объектов, некоторая деятельность описывается так, что постепенно продумывается все, что можно делать с объектом данного класса. Потом в программе достаточно лишь упоминать методы обработки объекта. Если методов много, то они структурированы по иерархии классов, что позволяет автоматизировать выбор конкретного метода. На каждом уровне иерархии можно немного варьировать набор методов и структуру объектов. Таким образом, описание программы декомпозируется на интерфейс и реализацию, причем интерфейс скрывает сложность реализации так, что можно обозревать лишь необходимый для использования минимум средств работы с объектом.
Типичная гипотеза при программировании работы с объектами:

^ Объект не изменен, если на него не было воздействий из программы.
Но реальность зачастую требует понимания и учета более сложных обстоятельств, что может существенно продлить время жизни программы или ее компонентов. В таком случае удобно предоставлять объектам большую свободу, сближающую их с понятием субъекта, описание которого содержит все, что он может делать. Программа может давать ему команды-сообщения и получать ответы-результаты.
Связь методов с классами объектов позволяет вводить одноименные методы над разными классами объектов (полиморфизм), что упрощает представление логики управления: на уровне текста программы можно не выражать распознавание принадлежности объекта классу, это сделает система программирования. Таким образом обычно реализовано сложение, одинаково изображаемое для чисел, строк, векторов, множеств и т.п. Фактически субъектом является суперкласс, объединяющий классы объектов, обрабатываемые одноименными методами, т.е. функциями одного семейства. Так, при организации сложения можно считать, что существует суперкласс «слагаемые», которое умеют складываться с другими слагаемыми. При этом они используют семейство функций, реализующих сложение. В зависимости от полноты семейства результат может быть получен или не получен. Семейство легко пополняется добавлением одноименных функций с новыми комбинациями типов параметров.

Дальнейшее развитие подходов к декомпозиции программ связано с выделением отдельных аспектов и шагов при решении сложных задач. Понятие аспекта связано с различием точек зрения, позволяющим описывать решение всей задачи, но отражать в описании только видимые детали. По мере изменения точек зрения могут проступать новые детали, до тех пор, пока дальнейшая детализация не утрачивает смысл, т.е. улучшение трудно заметить или цена его слишком высока. Так, представление символьной информации в Лиспе выделено в отдельный аспект, независимый от распределения памяти, вычисление значений четко отделено от компиляции программ, понятие связывания имен с их определениями и свойствами не зависит от выбора механизмов реализации контекстов исполнения конструкций программы.
Понятие шага обычно связывается с процессом раскрутки программ, оправданным в тех случаях, когда целостное решение задачи не может гарантировать получение приемлемого результата в нужный срок – это влечет за собой непредсказуемо большие трудозатраты.
Удобный подход к организации программ «отдельная работа отдельно программируется и отдельно выполняется» успешно показал себя при развитии операционной системы UNIX как работоспособный принцип декомпозиции программ. Но существуют задачи, например реализация систем программирования, в которых прямое следование такому принципу может противоречить требованиям к производительности. Возможен компромисс «отдельная работа программируется отдельно, а выполняется взаимосвязано с другими работами» [А. Л. Фуксман], что требует совмещения декомпозиции программ с методами сборки - комплексации или интеграции программ из компонентов. Рассматривая комплексацию как еще одну «отдельную» работу, описываемую, например, в терминах управления процессами, можно констатировать, что эта работа больше сказывается на требованиях к уровню квалификации программиста, чем на объеме программирования. При достаточно объективной типизации данных и процессов, возникающих при декомпозиции и сборке программ определенного класса, строят библиотеки типовых компонентов и разрабатывают компонентные технологии разработки программных продуктов - Corba, COM/DCOM, UML и т.п.. Одна из проблем применения таких компонентов – их обширность.
При реализации экспериментальных языков и систем программирования цель применения раскрутки - минимизация трудозатрат, основанная на учете формальной избыточности средств языков программирования. Можно выделить небольшое ядро, на основе которого методично программируется все остальное. Каждый шаг реализации по схеме раскрутки должен обеспечивать:


  • уменьшение трудоемкости последующих шагов,




  • отладку прототипов сложных компонентов,




  • подготовку демонстрационного материала.


Выбор конретных шагов можно соотнести с декомпозицией определения языка программирования на синтаксические и семантические, функциональные и машинно-ориентированные, языково-ориентированные и системные аспекты. При такой декомпозиции можно на первых шагах как бы «снять» синтаксическое и семантическое разнообразие языка, как имеющее чисто технический характер. Именно в этом смысл выделения элементарного Лиспа. Такая методика может быть успешна при освоении любого класса, информацию о котором можно представить в виде частично формализуемых текстовых и графовых форм.
Дальнейшие шаги раскрутки можно упорядочить по актуальности реализации компонентов, обеспечивающих положительную оценку системы пользователем. Это позволяет развить представление о принципах декомпозиции программ более созвучно ООП: « отдельная работа обнаруживается независимо от остальных работ». Наиболее устойчивая и значимая классификация работ по реализации системы программирования может быть установлена как обеспечение механизмов надежного функционирования информационных систем – «отдельная работа – это отдельное средство повышения надежности программирования». Ряд таких средств можно выделить в любом языке программирования: вычисления, статическое и динамическое управление процессами, логика выбора хода обработки информации, дисциплина именования памяти и доступа к расположенным в ней данным, правила укрупненных воздействий на блоки данных и иерархию процессов, диагностика и обработка событий – перечень открытый.

При переходе от обычного стандартного программирования с ООП связывают радикальное изменение способа организации программ. Это изменение произошло под давлением роста мощности оборудования. ООП взламывает традиционное программирование по многим направлениям. Вместо создания отдельной программы, оперирующей массой данных, приходится разбираться с данными, которые сами обладают поведением, а программа сводится к простому взаимодействию новой категории данных - "объекты".
Чтобы сравнить дистанцию с функциональным программированием, рассмотрим самодельный встроенный в Лисп объектно-ориентированный язык (ОО-язык), обеспечивающий основы ООП. Встраивание ОО-языка - идеальный пример, показывающий характерное применение функционального программирования, при котором типичные понятия ООП отображаются в фундаментальные абстракции. Другая строна ООП – накопительный стиль программирования, поддерживающий расширение постановки решаемой задачи.
Прозрачная модель ООП получается на базе обычных списков свойств, заодно иллюстрирующая глубинное родство ФП и ООП:
(defun classes (cl) (cond

(cl (cons (cdar cl) (classes (cdr cl)))) ))
; вывод формулы классов аргументов из определения параметров метода

; Nil - произвольный класс
(defun argum (cl) (cond

(cl (cons (caar cl) (argum (cdr cl)))) ))
; вывод списка имен аргументов из определения параметров метода
(defun defmet (FMN c-as expr)

(setf (get FMN 'category) 'METHOD)

(setq ML (cons(cons(cons FMN (classes c-as))

(list 'lambda (argum c-as) expr) ) ML))

FMN )
; объявление метода и расслоение его определения

; для удобства сопоставления с классами аргументов
(defun defcl (NCL SCL FCL ) ; имя, суперкласс и поля/слоты класса

(setq ALLCL (cons NCL ALLCL))

(set NCL (append FCL SCL)) )
; значением класса является список его полей, возможно, со значениями
(defun ev-cl (vargs) (cond
; вывод формата фактических аргументов для поиска метода их обработки
(vargs (cons (cond

((member (caar vargs) ALLCL) (caar vargs)) )

(ev-cl (cdr vargs)))) ))

; Nil если не класс
(defun m-assoc (pm meli) (cond (meli (cond ((equal (caar meli) pm)(cdar meli))

(T(m-assoc pm (cdr meli)))))))
; поиск подходящего метода, соответствующего формату классов данных
(defun method (MN args &optional c)

(apply (m-assoc (cons mn (ev-cl args)) ML)

args c))
; если метода не нашлось, в программе следует выполнить приведение

; параметров к нужному классу
(defun instance (class &optional cp) (cond
; подобно Let безымянная копия контекста
(class (cond ((atom (car class))(instance (cdr class) cp))

((assoc (caar class) cp) (instance (cdr class) cp))

(T(instance (cdr class) (cons (car class) cp)))

)) ) cp)
(defun slot (obj fld) (assoc fld obj))
; значение поля объекта
Остается лишь слегка подкорректировать определение Лисп-интерпретатора, заодно используя необязательные параметры, осовобождающие от простейших вспомогательных определений, например от обязательного вхождения накопителей типа ассоциативного списка.
(DEFUN evcon- (c &optional a)

; |_________ключ, объявляющий

; необязательные параметры

(COND

((eval-p (car (car c)) a) (eval-p (car (cdr (car c))) a) )

( T (evcon- (cdr c) a) ) ))
(DEFUN evlis- (m &optional a)

(COND

((EQ m Nil) Nil)

( T (cons (eval-p (car m) a)

(evlis- (cdr m) a) ) ) ))
(defun eval-p (e &optional c)

(cond ((atom e) (value e c))

((atom (car e))(cond
((eq (car e) 'QUOTE) (car (cdr e)))

((eq (car e) 'COND) (evcon- (cdr e) a))

((get (car e) 'METHOD)

(method (car e) (evlis(cdr e)) c) )

( T (apply-p (car e)(evlis- (cdr e) c) c))

) )

(T (apply-p (car e)(evlis- (cdr e) c) c))

))
(defun apply-p (f args &optional c)

(cond ((atom f) (apply-p (function f c) args c))

((atom (car f))(cond ((get (car f) 'macro)

(apply-p (apply-p (get (car f) 'macro) (cdr f) c) args c))
(T (apply-p (eval f c) args c))

) )

(T (apply-p (eval f c) args c))

))
(print (eval-p 1))

(print (eval-p 'a))

(print (eval-p '(quote b)))

(print (eval-p '(cond (Nil 6)(T 88) )))

(print (eval-p '(car '(3 2))))

Показанный в [ ] пример работает по первому аргументу (выбор подходящего метода рассчитан на то, что достаточно разобраться с одним аргументом), CLOS делает это на всех аргументах, причем с рядом вспомогательных средств, обеспечивающих гибкий перебор методов и анализ классов объектов.
^ Классы и экземпляры объектов
(defclass ob () (f1 f2 ...))
Это означает, что каждое вхождение объекта будет иметь поля-слоты f1 f2 ...

(Слот – это поле записи или списка свойств.)
Чтобы сделать представителя класса, мы вызываем общую функцию:
(setf с (make-instance 'ob))
Чтобы задать значение поля, используем специальную функцию:
(setf (slot-value c) 1223)
До этого значения полей были не определены.

^ Свойства слотов
Простейшее определение слота - это его имя.

Но в общем случае слот может содержать список свойств.

Внешне свойства слота специфицируются как ключевые параметры функции.
Это позволяет задавать начальные значения.
Можно объявить слот совместно используемым.
:allocation :class
Изменение такого слота будет доступно всем экземплярам объектов класса.
:documentation - свойство слота
Можно задать тип элементов, заполняющих слот.
Суперкласс
Нет необходимости все новые слоты создавать в каждом классе
;oop-compile
(defclass expr ()

((type :accessor td) (sd :accessor ft))

(:documentation "C-expression"))
(defclass un (expr)

; \_____суперкласс для унарных форм
((type :accessor td) ;; можно убрать ???

(sd :accessor ft)) ;; можно убрать ???

(:documentation "quote car *other *adr"))
(defclass bin (expr)

((type :accessor td)

(sd :accessor ft)

(sdd :accessor sd) )

(:documentation "cons + lambda let"))
(defclass trio (expr)

((type :accessor td)

(sd :accessor ft)

; (bin) ;; не объявлять sdd ???

(sdd :accessor sd)

(sddd :accessor td) )

(:documentation "if label"))
(defmethod texrp ((x expr) (nt atom))

(setf (slot-value x 'type) nt)

(setf (td x) nt) ;;--;; variant

(:documentation "объявляем тип выражения"))
(defmethod spread ((hd (eql 'QUOTE))

(tl expr))

(let ( (x (make-instance 'un)) )

(setf (ft x) (car tl))

(setf (td x) hd)

) (:documentation "распаковка выражения"))
(defmethod compl ((hd (eql 'QUOTE))

(tl expr))

(list 'LDC tl)

) (:documentation "сборка кода"))
(defmethod compl ((hd (eql 'CAR))

(tl expr))

(append (compl(ft tl) N) '(CAR))

) (:documentation "сборка кода"))
(defmethod spread ((hd (eql 'CONS))

(tl expr))

(let ( (x (make-instance 'bin)) )

(setf (ft x) ( car tl))

(setf (sd x) ( cadr tl))

(setf (td x) hd)

) (:documentation "распаковка выражения"))
(defmethod compl ((hd (eql 'CONS))

(tl bin) N )

(append (compl(sd tl) N) (compl(ft tl) N) '(CONS))

) (:documentation "сборка кода"))
(defmethod compl ((hd (eql '+))

(tl bin) N )

(append (compl(ft tl) N) (compl(sd tl) N) '(ADD))

) (:documentation "сборка кода"))
(defmethod spread ((hd (eql 'IF))

(tl expr))

(let ( (x (make-instance 'trio)) )

(setf (ft x) ( car tl))

(setf (sd x) ( cadr tl))

(setf (td x) ( caddr tl))

(setf (td x) hd)

) (:documentation "распаковка выражения"))
(defmethod compl ((hd (eql 'IF))

(tl expr) N )

(let ( (then (list (compl(sd tl) N) '(JOIN)))

(else (list (compl(td tl) N) '(JOIN))) )

(append (compl(ft tl) N) (list 'SEL then else) )

)(:documentation "сборка кода"))
(defmethod parh ((x expt))

(let (ftx (ft x))

(cond

((atom ftx) (spread 'ADR ftx))

((member (car ftx) '(QUOTE CAR CONS + IF LAMBDA LABEL LET))

(spread (car ftx) (cdr ftx))

(T (spread 'OTHER ftx) ))

)(:documentation "шаг разбора"))


;====test==========

(setf test1 (make-instance 'expr))

(texpr test1 'expr)

(setf (slot-value test1 'sd) (read))

()
(setf e1 (make-instance 'expr))

(setf e2 (make-instance 'expr))

(setf e3 (make-instance 'expr))

(print (tf e2))

(setf (slot-value e3 'type) 'expr)

(print (tf e3))

(setf (slot-value e3 'sd) '(quote const))
(defmethod ep ((x expr))

((lambda (xt)

(setf (slot-value x 'type) xt))

(car (slot-value x 'sd) )))

(print (ep e3))

(print (tf e3))

(print (td e3))

(print (sd e3))
(defmethod ep-q ((x (eql 'quote)) (y expr))

(setf y (make-instance 'un)))

(setf (slot-value y 'type) 'quote)

(setf (slot-value y 'sd) y)

))


(print (tf (e3 'sd)))
(print (tf e1))

(print(setf (slot-value e1 'type) (tf e1)))

(setf (slot-value e2 'sd) 'atom1)

(print (tf (sd e2)))
(print(setf (slot-value e3 'sd) '(quote const)))

(print (tf e3))
CLOS, естественно, использует модель обобщенных функций, но мы написали независимую модель, используя более старые представления, тем самым показав, что концептуально ООР – это не более чем перефразировка идей Лиспа. ООП - это одна из вещей, которую Лисп изначально умеет делать. Для функционального стиля программирования в переходе к ООП нет ничего неожиданного. Это просто небольшая конкретизация механизмов перебора ветвей функциональных объектов.




Добавить документ в свой блог или на сайт

Похожие:

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconЛекция 10 Объектно-ориентированное программирование
Лекция 10 Объектно-ориентированное программирование 10. 1 Основные принципы ооп 10 1 Методология структурного программирования

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconКурсовая работа по дисциплине «Объектно-ориентированное программирование»
Объектно-ориентированное программирование это метод программирования, развивающий принципы структурного программирования и основанный...

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconОбъектно-ориентированное программирование
Объектно-ориентированное программирование — это методология программирования, основанная на организации программы в виде совокупности...

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconПояснительная записка к курсовому проекту по дисциплине: «Объектно-ориентированное...
Содержание пояснительной записки к курсовому проекту по дисциплине «Объектно-ориентированное программирование»

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconВ настоящее время объектно-ориентированное программирование (ооп)...
В настоящее время объектно-ориентированное программирование (ооп) является доминирующим стилем при создании больших программ. Рассмотрим...

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconМетодические указания к выполнению контрольной работы (ргр) по дисциплине...
Методические указания к выполнению контрольной работы (ргр) по дисциплине «Объектно-ориентированное программирование» (для студентов...

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconЛабораторная работа №8 Тема Объектно-ориентированное программирование...
Тема Объектно-ориентированное программирование с использованием средств языка С++

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconПояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное...
Целью работы является создание программной системы, которая реализует действия выполняемые пользователем почтового отделения с использованием...

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconЛекция Функциональное программирование
Базовые операции и их свойства. Унификация структур данных при реализации. Накапливающие параметры. Связывание имен. Функциональные...

Лекция Объектно-ориентированное программирование Эволюция подходов к организации структур данных на уровне задач и реализации программ. iconЛекция Машинно ориентированное программирование Рассматривается два...
Язык Little – пример традиционной организации вычислений над структурированными битовыми строками. Основные конструкции аналогичны...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<