Объектно-ориентированное программирование
Увеличение размеров программ приводило к необходимости привлечения большего числа программистов, что, в свою очередь, потребовало дополнительных ресурсов для организации их согласованной работы.
Но не менее важными оказались качественные изменения, связанные со смещением акцента использования компьютеров. В эпоху "больших машин" основными потребителями программного обеспечения были крупные заказчики. Стоимость таких вычислительных устройств для небольших предприятий и организаций была слишком высока.
Позже появились персональные компьютеры, которые имели гораздо меньшую стоимость и были значительно компактнее. Это позволило широко использовать их в малом и среднем бизнесе. Основными задачами в этой области являются обработка данных и манипулирование ими, поэтому вычислительные и расчетно-алгоритмические задачи с появлением персональных компьютеров отошли на второй план. Как показала практика, традиционные методы процедурного программирования не способны справиться ни с нарастающей сложностью программ и их разработки, ни с необходимостью повышения их надежности. Во второй половине 80-х годов возникла настоятельная потребность в новой методологии программирования, которая была бы способна решить весь этот комплекс проблем. Ею стало объектно-ориентированное программирование (ООП).
Объектно-ориентированный подход к проектированию основан на представлении предметной области задачи в виде множества моделей для независимой от языка разработки программной системы на основе ее прагматики.
Рис. 9. 18. Семантика (смысл программы с точки зрения выполняющего ее компьютера) и прагматика (смысл программы с точки зрения ее пользователей).
Прагматика определяется целью разработки программной системы, например, обслуживание чемпионата мира по легкой атлетики (который проходил во время написания данного фрагмента). В формулировке цели участвуют предметы и понятия реального мира, имеющие отношение к создаваемой системе (рис. 9.18). При объектно-ориентированном подходе эти предметы и понятия заменяются моделями, т.е. определенными формальными конструкциями.
Модель содержит не все признаки и свойства представляемого ею предмета или понятия, а только те, которые существенны для разрабатываемой программной системы. Таким образом, модель "беднее", а, следовательно, проще представляемого ею предмета или понятия.
Простота модели по отношению к реальному предмету позволяет сделать ее формальной. Благодаря такому характеру моделей при разработке можно четко выделить все зависимости и операции над ними в создаваемой программной системе. Это упрощает как разработку и изучение (анализ) моделей, так и их реализацию на компьютере.
Объектно-ориентированный подход обладает такими преимуществами, как:
- Уменьшение сложности и повышение надежности программного обеспечения.
- Возможность модификации отдельных компонентов программного обеспечения без изменения остальных.
- Повторное использование отдельных компонентов программного обеспечения.
Систематическое применение объектно-ориентированного подхода позволяет разрабатывать хорошо структурированные, надежные в эксплуатации, достаточно просто модифицируемые программные системы. Этим объясняется интерес программистов к объектно-ориентированному подходу и объектно-ориентированным языкам программирования. ООП является одним из наиболее интенсивно развивающихся направлений теоретического и прикладного программирования.
Объекты
Объект -это понятие, абстракция или любой предмет с четко очерченными границами, имеющий смысл в контексте рассматриваемой прикладной проблемы. Введение объектов преследует две цели:
- Понимание прикладной задачи (проблемы).
- Введение основы для реализации на компьютере.
Каждый объект имеет определенное время жизни. В процессе выполнения программы, или функционирования какой-либо реальной системы, могут создаваться новые объекты и уничтожаться уже существующие.
Каждый объект имеет состояние, обладает четко определенным поведением и уникальной идентичностью.
Состояние
Состояние (state) - совокупный результат поведения объекта: одно из стабильных условий, в которых объект может существовать, охарактеризованных количественно. В любой момент времени состояние объекта включает в себя перечень (обычно статический) свойств объекта и текущие значения (обычно динамические) этих свойств.
Поведение
Поведение (behavior) - действия и реакции объекта, выраженные в терминах передачи сообщений и изменения состояния; видимая извне и воспроизводимая активность объекта.
Для каждого объекта существует определенный набор действий, которые с ним можно произвести. Результат выполнения действий зависит от состояния объекта на момент совершения действия.
Программа, написанная с использованием ООП, обычно состоит из множества объектов, и все эти объекты взаимодействуют между собой. Обычно говорят, что взаимодействие между объектами в программе происходит посредством передачи сообщений между ними.
Программу, построенную по технологии ООП, можно представить себе как виртуальное пространство, заполненное объектами, которые условно "живут" некоторой жизнью. Их активность проявляется в том, что они вызывают друг у друга методы, или посылают друг другу сообщения. Внешний интерфейс объекта, или набор его методов,- это описание того, какие сообщения он может принимать.
Уникальность
Уникальность (identity) - свойство объекта; то, что отличает его от других объектов.
Например, у вас может быть несколько одинаковых монет. Даже если абсолютно все их свойства (атрибуты) одинаковы (год выпуска, номинал и т.д.) и при этом вы можете использовать их независимо друг от друга, они по-прежнему остаются разными монетами.
В машинном представлении под параметром уникальности объекта чаще всего понимается адрес размещения объекта в памяти. На один объект может указывать несколько ссылок, и ссылки могут менять свои значения (ссылаться на другие объекты).
Классы
Класс - это шаблон поведения объектов определенного типа с заданными параметрами, определяющими состояние. Все экземпляры одного класса (объекты, порожденные от одного класса) имеют один и тот же набор свойств и общее поведение, то есть одинаково реагируют на одинаковые сообщения.
Все объекты одного и того же класса описываются одинаковыми наборами атрибутов. Однако объединение объектов в классы определяется не наборами атрибутов, а семантикой. В классе вводятся имена атрибутов, которые определены для объектов. В этом смысле описание класса аналогично описанию типа структуры или записи (record), широко применяющихся в процедурном программировании; при этом каждый объект имеет тот же смысл, что и экземпляр структуры (переменная или константа соответствующего типа).
В соответствии с UML (Unified Modelling Language - унифицированный язык моделирования), класс имеет следующее графическое представление (рис. 9.19).
Рис. 9. 19. Графическое представление класса
Класс изображается в виде прямоугольника, состоящего из трех частей. В верхней части помещается название класса, в средней - свойства объектов класса, в нижней - действия, которые можно выполнять с объектами данного класса (методы).
Каждый класс также может иметь специальные методы, которые автоматически вызываются при создании и уничтожении объектов этого класса:
- Конструктор (constructor) - выполняется при создании объектов.
- Деструктор (destructor) - выполняется при уничтожении объектов.
Обычно конструктор и деструктор имеют специальный синтаксис, который может отличаться от синтаксиса, используемого для написания обычных методов класса.
Инкапсуляция
Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса). При использовании объектно-ориентированного подхода не принято применять прямой доступ к свойствам какого-либо класса из методов других классов. Для доступа к свойствам класса принято задействовать специальные методы этого класса для получения и изменения его свойств.
Внутри объекта данные и методы могут обладать различной степенью открытости (или доступности).
Открытые члены класса составляют внешний интерфейс объекта. Это та функциональность, которая доступна другим классам. Закрытыми обычно объявляются все свойства класса, а также вспомогательные методы, которые являются деталями реализации и от которых не должны зависеть другие части системы.
Благодаря сокрытию реализации за внешним интерфейсом класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы. Это свойство называется модульность.
Обеспечение доступа к свойствам класса только через его методы также дает ряд преимуществ. Во-первых, так гораздо проще контролировать корректные значения полей, ведь прямое обращение к свойствам отслеживать невозможно, а значит, им могут присвоить некорректные значения.
Во-вторых, не составит труда изменить способ хранения данных. Если информация станет храниться не в памяти, а в долговременном хранилище, таком как файловая система или база данных, потребуется изменить, лишь ряд методов одного класса, а не вводить эту функциональность во все части системы.
Наконец, программный код, написанный с использованием данного принципа, легче отлаживать. Для того, чтобы узнать, кто и когда изменил свойство интересующего нас объекта, достаточно добавить вывод отладочной информации в тот метод объекта, посредством которого осуществляется доступ к свойству этого объекта.
Наследование
Наследование (inheritance) - это отношение между классами, при котором класс использует структуру или поведение другого класса (одиночное наследование), или других (множественное наследование) классов. Наследование вводит иерархию "общее/частное", в которой подкласс наследует от одного или нескольких более общих суперклассов. Подклассы обычно дополняют или переопределяют унаследованную структуру и поведение.
Например, классы "Легковой автомобиль" и "Грузовой автомобиль" имеют общую функциональность: 4 колеса, двигатель, могут перемещаться и так далее. Разумно вынести эти общие свойства и функциональность в отдельный класс, например, "Автомобиль" и наследовать от него классы "Легковой автомобиль" и "Грузовой автомобиль", чтобы избежать повторного написания одного и того же кода в разных классах (рис. 9.20).
Рис. 9. 20. Обобщение классов "Легковой автомобиль" и "Грузовой автомобиль"
Отношение обобщения обозначается сплошной линией с треугольной стрелкой на конце. Стрелка указывает на более общий класс (класс-предок или суперкласс), а ее отсутствие - на более специальный класс (класс-потомок или подкласс).
Использование наследования способствует уменьшению количества кода, созданного для описания схожих сущностей, а также способствует написанию более эффективного и гибкого кода.
Множественное наследование на диаграмме изображается точно так же, как одиночное, за исключением того, что линии наследования соединяют класс-потомок сразу с несколькими суперклассами.
Не все объектно-ориентированные языки программирования содержат языковые конструкции для описания множественного наследования.
Полиморфизм
Полиморфизм (polymorphism) - положение теории типов, согласно которому имена (например, переменных) могут обозначать объекты разных (но имеющих общего родителя) классов. Следовательно, любой объект, обозначаемый полиморфным именем, может по-своему реагировать на некий общий набор операций.
Типы отношений между классами
Как правило, любая программа, написанная на объектно-ориентированном языке, представляет собой некоторый набор связанных между собой классов. Подобно тому, как стена складывается из кирпичей, компьютерная программа с использованием ООП строится из классов. Причем эти классы должны иметь представление друг о друге, для того чтобы сообща выполнять поставленную задачу.
Возможны следующие связи между классами в рамках объектной модели (приводятся лишь наиболее простые и часто используемые виды связей):
- агрегация (Aggregation);
- ассоциация (Association);
- наследование (Inheritance);
- метаклассы (Metaclass).
Агрегация
Отношение между классами типа "содержит" (contain) или "состоит из" называется агрегацией(aggregation), или включением. Например, если компьютерная аудитория заполнена студентами, то можно сказать, что аудитория агрегирует в себе компьютеры и студентов.
Такое отношение включения, или агрегации изображается линией с ромбиком (рис. 9.21). Необязательное название отношения записывается посередине линии
Рис. 9. 21. Изображение агрегации
Ассоциация
Если объекты одного класса ссылаются на один или более объектов другого класса, но, ни в ту, ни в другую сторону отношение между объектами не носит характера "владения", или контейнеризации, такое отношение называют ассоциацией (association). Отношение ассоциации изображается так же, как и отношение агрегации, но линия, связывающая классы,- простая, без ромбика.
Наследование
Наследование является важным случаем отношений между двумя или более классами. Подробно оно рассматривалось выше.
Метаклассы
Итак, любой объект имеет структуру, состоящую из полей и методов. Объекты, имеющие одинаковую структуру и семантику, описываются одним классом, который и является, по сути, определением структуры объектов, порожденных от него.
В свою очередь, каждый класс, или описание, всегда имеет строгий шаблон, задаваемый языком программирования или выбранной объектной моделью. Он определяет, например, допустимо ли множественное наследование, какие существуют ограничения на именование классов, как описываются поля и методы, набор существующих типов данных и многое другое. Таким образом, класс можно рассматривать как объект, у которого есть свойства (имя, список полей и их типы, список методов, список аргументов для каждого метода и т.д.). Также класс может обладать поведением, то есть поддерживать методы. А раз для любого объекта существует шаблон, описывающий свойства и поведение этого объекта, значит, его можно определить и для класса. Такой шаблон, задающий различные классы, называется метаклассом.
Чтобы представить себе, что такое метакласс, рассмотрим пример некой бюрократической организации. Будем считать, что все классы в такой системе представляют собой строгие инструкции, которые описывают, что нужно сделать, чтобы породить новый объект (например, нанять нового служащего или открыть новый отдел). Как и полагается классам, они описывают все свойства новых объектов (например, зарплату и профессиональный уровень для сотрудников, площадь и имущество для отделов) и их поведение (обязанности служащих и функции подразделений).
В свою очередь, написание новой инструкции можно строго регламентировать. Скажем, необходимо использовать специальный бланк, придерживаться правил оформления и заполнить все обязательные поля (например, номер инструкции и фамилии ответственных работников). Такая "инструкция инструкций" и будет представлять собой метакласс в ООП.
Итак, объекты порождаются от классов, а классы - от метакласса. Он, как правило, в системе только один.
Достоинства объектно-ориентированного программирования
Чтобы справиться со сложностью проектирования программ, необходимо абстрагироваться от деталей. В этом смысле классы представляют собой весьма удобный инструмент.
- Классы позволяют проводить конструирование из полезных компонентов, обладающих простыми инструментами, что позволяет абстрагироваться от деталей реализации.
- Данные и операции над ними образуют определенную сущность, и они не разносятся по всей программе, как нередко бывает в случае процедурного программирования, а описываются вместе. Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения.
- Инкапсуляция позволяет привнести свойство модульности, что облегчает распараллеливание выполнения задачи между несколькими исполнителями и обновление версий отдельных компонентов.
ООП дает возможность создавать расширяемые системы. Это одно из основных достоинств ООП, и именно оно отличает данный подход от традиционных методов программирования. Расширяемость означает, что существующую систему можно заставить работать с новыми компонентами, причем без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе исполнения программы.
Полиморфизм оказывается полезным преимущественно в следующих ситуациях.
- Обработка разнородных структур данных. Программы могут работать, не различая вида объектов, что существенно упрощает код. Новые виды могут быть добавлены в любой момент.
- Изменение поведения во время исполнения. На этапе исполнения один объект может быть заменен другим, что позволяет легко, без изменения кода, адаптировать алгоритм в зависимости от того, какой используется объект.
- Реализация работы с наследниками. Алгоритмы можно обобщить настолько, что они уже смогут работать более чем с одним видом объектов.
- Создание "каркаса" (framework). Независимые от приложения части предметной области могут быть реализованы в виде набора универсальных классов, или каркаса (framework), и в дальнейшем расширены за счет добавления частей, специфичных для конкретного приложения.
Часто многоразового использования программного обеспечения не удается добиться из-за того, что существующие компоненты уже не отвечают новым требованиям. ООП помогает этого достичь без нарушения работы уже имеющихся клиентов, что позволяет извлечь максимум из многоразового использования компонентов.
- Сокращается время на разработку, которое может быть отдано другим задачам.
- Компоненты многоразового использования обычно содержат гораздо меньше ошибок, чем вновь разработанные, ведь они уже не раз подвергались проверке.
- Когда некий компонент используется сразу несколькими клиентами, улучшения, вносимые в его код, одновременно оказывают положительное влияние и на множество работающих с ним программ.
- Если программа опирается на стандартные компоненты, ее структура и пользовательский интерфейс становятся более унифицированными, что облегчает ее понимание и упрощает использование.
Вопросы для ПОВТОРЕНИЯ И самоконтроля
1. Что такое команда присваивания ?
2. Как записывается команда присваивания?
3. Объясните выполнение команды присваивания.
4. Можно ли заменять знак "присвоить" знаком равенства?
5. Поясните, как изменяется величина в ряду присвоений.
6. Что такое форма записи алгоритма?
7. Какие формы записи алгоритмов вам известны?
8. Чем объясняется разнообразие форм записи?
9. Охарактеризуйте словесно-пошаговую (текстовую) форму.
10. Охарактеризуйте табличную форму записи алгоритма.
11. Как осуществляется запись на алгоритмическом языке?
12. Что такое результат выполнения алгоритма?
13. Что такое исходные данные?
14. Что представляет собой графическая запись алгоритма?
15. Охарактеризуйте основные блоки.
16. Каков порядок составления блок - схемы алгоритма?
17. Как определяются исходные данные?
18. Как определяется результаты алгоритма ?
19. Какие выделяют виды алгоритмов ?
20. Охарактеризуйте линейный вид алгоритма.
21. Охарактеризуйте разветвляющийся вид алгоритма.
22. Охарактеризуйте циклический вид алгоритма.
23. Какой алгоритм называют комбинированным?
24. Какие структуры может включать в себя алгоритм?
25. Охарактеризуйте данные структуры.
26. Какими ключевыми словами можно пользоваться при определении вида алгоритма?
27. Для чего необходимо ветвление в алгоритмах?
28. Что такое условие?
29. Какие формы ветвления различают?
30. Сравните формы ветвления между собой.
31. Как оформляется ветвление в алгоритмах, записанных в виде блок-схемы?
32. Как оформляется ветвление в алгоритмах, записанных на алгоритмическом языке?
33. Как осуществляется выполнение действий в ветвлении при записи алгоритма на алгоритмическом языке?
34. Какими формулами пользуются при нахождении суммы или произведения ряда чисел? Охарактеризуйте их.
35. Как математически записываются данные формулы?
36. Как определить по ним величину - счетчик, ее начальное и конечное значение, шаг и аргумент?
37. В чем отличие языков программирования от остальных способов составления алгоритмов?
38. Какие уровни языков программирования вам известны?
39. Языки высокого уровня делятся на…?
40. Сущность, достоинсва и недостатка процедурно-ориентированного программирования.
41. Что такое объектно-ориентированное программирование?
42. В чем заключается преимущества объектно-ориентированного подхода перед процедурно-ориентированным?
43. Что такое "объект" в объектно-ориентированном программировании?
44. Что такое "состояние" в объектно-ориентированном программировании?
45. Что такое "поведение" в объектно-ориентированном программировании?
46. Что такое "уникальность" в объектно-ориентированном программировании?
47. Что такое "класс" в объектно-ориентированном программировании?
48. Что такое "инкапсуляция" в объектно-ориентированном программировании?
49. Что такое "наследование" в объектно-ориентированном программировании?
50. Что такое "полиморфизм" в объектно-ориентированном программировании?
51. Что такое "агрегация" в объектно-ориентированном программировании?
52. Что такое "ассоциация" в объектно-ориентированном программировании?
53. Что такое "метаклассы" в объектно-ориентированном программировании?
54. Приемущества и недостатки объектно-ориентированного программирования?
Дата добавления: 2015-11-26; просмотров: 2618;