Технологии программирования

 

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

Высшего профессионального образования

"Ярославский государственный технический университет"

Кафедра "Информационные системы и технологии"








КОНТРОЛЬНАЯ РАБОТА

на тему "Объектно-ориентированное программирование"

по дисциплине "Технологии программирования"




Выполнил студент 3 курса

заочного факультета группы

ЗИС-37 Аверьянов В.Е.








Ярославль 2014


Содержание


Причины возникновения объектно-ориентированного программирования

Классы

Объекты

Основные свойства объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм



Причины возникновения объектно-ориентированного программирования


Объектно-ориентированное программирование стало чрезвычайно популярно в последние годы. Производители программного обеспечения сломя голову бросаются создавать объектно-ориентированные версии своих продуктов. Появились бесчисленное количество книг и специальных журналов, посвященных этому предмету. Студенты стремятся к записи "компетентный в объектно-ориентированном программировании" в своих характеристиках.

Когда программисты спрашивают друг друга: "Чем же, в конечном итоге, есть объектно-ориентированное программирование?", - ответ чаще всего акцентируется на синтаксических свойствах таких языков, как С++ или Object Pascal, в сравнении с их предыдущими, не объектно-ориентированными версиями, то есть С или Pascal. Но при этом пренебрегают наиболее важным моментом в объектно-ориентированном программировании, которое не имеет ничего общего с вопросами синтаксиса.

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

Объектно-ориентированное программирование - это не просто несколько новых свойств, прибавленных к уже существующим языкам. Быстрее это новый шаг в осмыслении процессов декомпозиции задач и разработки программного обеспечения. Для того, чтобы эффективно использовать ООП, нужно смотреть на мир иначе. Собственное применение объектно-ориентированного языка программирования (такой как С++) не принуждает становиться объектно-ориентированным программистом.

Главные причины огромной популярности объектно-ориентированного программирования в течение последних десятилетий заключаются в:

. Надежды, что ООП может просто и быстро повлечь рост производительности и улучшение надежности программ, помогая тем самым развязать кризис в программном обеспечении;

. Возможности создавать большие программные компоненты, пригодные для повторного использования.

Многоразовое использование программного обеспечения - цель, которой постоянно хотят, однако изредка достигают. Основная причина этого - значительная взаимозависимость большей части программного обеспечения, созданного традиционными способами. Проблематично вытянуть из проекта фрагменты программного обеспечения, которое было бы легко использовать в новом программном продукте (каждая часть кода обычно связана с другими фрагментами). Как уже отмечено, ООП частично разрешает эту проблему.


Классы


Класс - разновидность абстрактного типа данных в объектно-ориентированном программировании (ООП), характеризуемый способом своего построения. Другие абстрактные типы данных - метаклассы, интерфейсы, структуры, перечисления, - характеризуются какими-то своими, другими особенностями. Наряду с понятием "объекта" класс является ключевым понятием в ООП (хотя существуют и бесклассовые объектно-ориентированные языки, например, Self, Lua; подробнее смотрите Прототипное программирование). Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен. Точный смысл этой фразы будет раскрыт ниже.

На практике объектно-ориентированное программирование сводится к созданию некоторого количества классов, включая интерфейс и реализацию, и последующему их использованию. Графическое представление некоторого количества классов и связей между ними называется диаграммой классов. Объектно-ориентированный подход за время своего развития накопил множество рекомендаций (паттернов) по созданию классов и иерархий классов.

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

Везде далее слова "класс", "объект", "интерфейс" и "структура" будут употребляться в своих специальных значениях, заданных в рамках ООП.

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

Все объекты одного и того же класса обладают одинаковым интерфейсом и реализуют этот интерфейс одним и тем же способом. Два объекта одного класса в ООП могут отличаться только текущим состоянием, причем всегда теоретически возможно так изменить состояние одного объекта, чтобы он стал равным другому объекту.

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

Индивидуальные объекты называются экземплярами класса, а класс в ООП - это шаблон по которому строятся объекты. Таким образом, наша банковская система состоит из экземпляров трех классов: класса счетов, класса банкоматов и класса клиентов. Названия классов в ООП пишутся с большой буквы, а названия объектов - с маленькой. Представленная ниже графическая схема классов соответствует обозначениям, принятым в Унифицированном языке моделирования UML.


Классы в учебной банковской системе


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


Разделение счетов на разные классы


Чем отличается понятие класса в ООП от таких понятий как "интерфейс" или "тип"? Интерфейс - это внешняя часть класса. Интерфейс определяет, как объекты данного класса могут взаимодействовать с другими объектами этого или других классов. Однако, если у двух объектов совпадают интерфейсы это еще не значит что они принадлежат к одному и тому же классу. Кроме совпадения интерфейсов необходимо, чтобы и их реализация и поведение были одинаковыми. Тип - это область определения некой величины, т.е. множество ее возможных значений и набор применимых операций. Тип может задаваться классом.


Объекты


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

Предположим что нам нужно разработать систему автоматизации банка. Эта система могла быть осуществлена следующим образом:


Схема взаимодействия объектов


В операции снятия денег через банкомат участвуют 3 объекта: "клиент Иванов", "банкомат на Тверской" и "счет № 66579801?, который открыт в данном банке для Иванова. Подойдя к банкомату и засунув свою карточку, объект "клиент Иванов" посылает банкомату сообщение "Начать работу". Получив такое сообщение, банкомат выводит на экран какую-нибудь информацию и запрашивает код доступа, т.е объект "банкомат на Тверской" посылает сообщение объекту "клиент Иванов" - "Сообщить идентификационный код". Если идентификация прошла успешно, "клиент Иванов" просит выдать ему 1000 рублей. Он посылает сообщение об этом банкомату, а тот в свою очередь объекту "счет № 66579801?. Приняв это сообщение объект "счет № 66579801? проверяет есть ли у него 1000 рублей, и, если есть, пересылает разрешение на снятие денег, одновременно уменьшая свой баланс на соответствующую сумму. Банкомат передает деньги и на этом процедура заканчивается.

Объекты выполняют необходимые действия передавая друг другу сообщения.

Описание в виде объектов позволяет определить различные компоненты системы. Те же самые объекты - "счет № 66579801? и "клиент Иванов" - будут учавствовать в другой операции при которой клиент приходит в отделение банка для снятие или зачисления денег на свой счет.

Приведенная ситуация является ярким примером сущности понятия "объект в ООП". Сложно дать четкое определение этому понятию, приведу цитату этого определения Ивара Якобсона:

Объект в ООП - это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния.

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

·абстракция понятия: объект - это модель какого-то понятия предметной области;

·абстракция действия: объект объединяет набор операций для выполнения какой-либо функции;

·абстракция виртуальной машины: объект объединяет операции, которые используются другими, более высокими уровнями абстракции;

·случайная абстракция: объект объединяет не связанные между собой операции.

Состояние объекта в ООП

Каждый объект в ООП характеризуется своим состоянием. Состояние банковского счета - это сумма лежащих на нем денег. Состояние банкомата включает в себя состояние "включен" или "выключен", готов или не готов к принятию запроса, наличию денег в банкомате.

Состояние объекта характеризуется текущим значением его атрибутов. В нашем примере у счета есть атрибут -баланс. В простейшем случае он отражается числом - количеством рублей и копеек на счету. Операция снятия или зачисления на счет изменяет баланс и атрибут объекта "счет № 66579801?. У объекта "банкомат на Тверской" есть несколько атрибутов. Количество денег в банкомате может характеризоваться числом. Состояние "включен" или "выключен" и состояние "готов или не готов к принятию запроса" - логическим значением.

Стоит заметить, что атрибутами объекта в ООП могут быть не только простейшие значения (число, логическое значение и т.д.), но и сложные величины или другие объекты. Например, наш банк для целей контроля будет хранить историю всех транзакций. Транзакция - это объект, который имеет атрибуты (характеристики) тип транзакции, сумма переведенных денег, место совершения и имена контрагентов этой операции. У объекта "счет № 66579801? появится новый атрибут - "история транзакций", который будет состоять из набора объектов-транзакций.

объектный программирование класс инкапсуляция

Основные свойства объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм


Инкапсуляция (encapsulation) - это механизм, который объединяет данные и код, манипулирующий зтими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый "чёрный ящик". Когда коды и данные объединяются таким способом, создаётся объект (object). Другими словами, объект - это то, что поддерживает инкапсуляцию.

Внутри объекта коды и данные могут быть закрытыми (private). Закрытые коды или данные доступны только для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.

На самом деле объект является переменной определённого пользователем типа. Может показаться странным, что объект, который объединяет коды и данные, можно рассматривать как переменную. Однако применительно к объектно-ориентированному программированию это именно так. Каждый элемент данных такого типа является составной переменной.

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).

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

Полиморфизм может применяться также и к операторам. Фактически во всех языках программирования ограниченно применяется полиморфизм, например, в арифметических операторах. Так, в Си, символ + используется для складывания целых, длинных целых, символьных переменных и чисел с плавающей точкой. В этом случае компилятор автоматически определяет, какой тип арифметики требуется. В С++ вы можете применить эту концепцию и к другим, заданным вами, типам данных. Такой тип полиморфизма называется перегрузкой операторов (operator overloading).

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

Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации. Например, подумайте об описании жилого дома. Дом - это часть общего класса, называемого строением. С другой стороны, строение - это часть более общего класса - конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным. Наследование играет очень важную роль в OOP.



Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение Высшего профессионального образован

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ