
Лекция 1 |
Общие свойства объектов |
1 |
Л Е К Ц И Я 1
НЕМНОГО ИСТОРИИ ПРОГРАММИРОВАНИЯ____________________________________________ 1
МОДЕЛЬ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ ____________________ 1
Абстракция данных _____________________________________________________________________ 2 Инкапсуляция__________________________________________________________________________ 2 Наследование _________________________________________________________________________ 2 Полиморфизм__________________________________________________________________________ 3 Методология ООП ______________________________________________________________________ 3
НЕМНОГО ИСТОРИИ ПРОГРАММИРОВАНИЯ
Смело вперёд, понимание придёт потом.
Наполеон Бонапарт
Первые программы создавались посредством переключателей на панели компьютера. Вполне очевидно, что подобного рода способ подходил только для небольших программ. Затем программы стали писать на языке машинных команд. С изобретением ассемблера (язык низкого уровня) стали появляться сравнительно длинные программы. Настоящим прорывом в программировании стало создание первого языка программирования высокого уровня - Фортран в 1950 году. С этого времени появилась возможность писать программы до нескольких тысяч строк длинной. Однако увеличение объема программ привело к тому, что код больших программ становился практически нечитаемым, а зачастую даже неуправляемым. Избавление от подобного рода проблем неструктурного программирования пришло с изобретением в начале 60-х годов таких языков структурного программирования как Алгол, С и Паскаль. Начался "золотой век" структурного программирования. В основу структурного программирования легли точно обозначенные управляющие структуры. Оно характерно использованием автономных подпрограмм, в которых поддерживаются рекурсия и локальные переменные, и абсолютным неприятием операторов GOTO (переход на другую строку). С появлением структурного программирования появилась возможность разбивать программы на составляющие элементы. Применяя эти принципы программирования, появилась возможность создания и поддержки программ в несколько десятков тысяч строк.
Несомненно, что структурное программирование принесло выдающиеся результаты, но, как оказалось, даже эти принципы программирования становятся несостоятельными, когда программа достигает определенной длины. Для написания более сложных программ потребовался новый подход к программированию.
МОДЕЛЬ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Язык C++ был создан как объектно-ориентированное продолжение одного из самых популярных в мире языков для разработки коммерческих программ на языке C. Для реализации идей объектного программирования требовалась надежная и эффективная среда программирования.
Язык C был разработан как нечто среднее между языками высокого уровня для бизнес-приложений (таких как COBOL), и высокоэффективным, но трудным в использовании языком низкого уровня – ассемблер. Язык C является структурным, то есть решение задачи разбивается на небольшие участки кода, реализующего определенны. действия, называемые процедурами.
Программы, создаваемые в начале двадцать первого века, значительно сложней программ созданных в конце прошлого века. Обычно программы на основании процедурных подходов трудно управляемы, их тяжело сопровождать и модернизировать. Графический пользовательский интерфейс, Internet, цифровая и беспроводная телефонная связь, a также поддержка новых технологий существенно увеличили сложность проектов, при этом требования пользователей к качеству пользовательскою интерфейса значительно выросли.
Стремительное усложнение программ заставило разработчиков искать новые подходы в программировании. То, что они находили, их не удовлетворяло. Программы быстро устаревали, были ненадежны, содержали большое количество ошибок, которые трудно поддавались устранению. Кроме того, программы были очень дороги, что объяснялось трудоемкостью их создания. Проекты часто устаревали еще до того, как попадали на рынок. Расходы на поддержку и модернизацию этих проектов зачастую превышали доходы от их реализации.
Разработка программного обеспечения на основании объектно-ориентированных подходов оказалось выходом из тупика. Объектно-ориентированные языки программирования обеспечивают прочную связь между структурами данных и методами, с помощью которых ими манипулируют. Но самым большим преимуществом объектно-ориентированного программирования является то, что программист больше не
Выжол Ю.А. |
Объектно-ориентированное программирование |
Лекция 1 |
Общие свойства объектов |
2 |
обязан заботиться о структуре данных и управляющих функциях. Все, что необходимо, – это правильно использовать соответствующий объект.
Другим преимуществом объектно-ориентированного программирования является то, что модель ООП более адекватна модели окружающего мира и человеческого мышления. Мир наполнен объектами: автомобили, собаки, деревья, облака, цветы – все это объекты. Каждый объект имеет свойства (быстрый, дружелюбный, коричневый, пушистый, милый). Объекты ведут себя определенным образом (едут, лают, растут, проливаются дождем, увядают).
Суть структурного программирования является представление программы в виде совокупности взаимосвязанных процедур и данных, которыми эти процедуры оперируют. Используя структурное программирование, средний программист может создавать и сопровождать программы до нескольких десятков тысяч строк длиной.
Для написания более сложных задач понадобился новый подход к программированию, который и был реализован в модели ООП. Модель ООП основана на нескольких основополагающих концепциях.
Абстракция данных
Абстракция данных – это возможность определять новые типы данных, с которыми можно работать почти так же, как и с основными типами данных. Такие типы часто называются абстрактными типами данных, хотя термин "типы данных, определяемые пользователем" является более точным.
Инкапсуляция
Инкапсуляция – это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает то и другое от постороннего вмешательства.
Для реализации этих двух основополагающих концепций в языке С++- используются классы. Термином класс определяется тип объектов. При этом каждый представитель (или экземпляр) класса называется объектом. Каждый объект всегда имеет свое, уникальное состояние, определяемое текущими значениями его данных-членов (элементов-данных). Функциональное назначение класса определяется возможными действиями над объектами класса, которые задаются его функциями-членами (функциями- элементами или методами). Причем термин "метод" чаще используется в литературе, посвященной языку Object Pascal. В каждом классе определяется память для хранения данных, и устанавливаются допустимые операции для каждого объекта данных данного типа.
Создание объектов данного класса производится специальной функцией-членом, которая называется конструктором, а уничтожение – другой специальной функцией-членом, которая называется деструктором. Класс позволяет делать недоступными внутренние данные, представляя их как открытые (public), закрытые (private) и защищенные (protected). Класс устанавливает четко определенный интерфейс для взаимодействия объектов этого типа с остальным миром. Закрытые коды или данные доступны только внутри этого объекта.
С другой стороны, открытые коды и данные, несмотря на то, что они заданы внутри объекта, доступны для всех частей программы. Открытая часть объекта как раз и используется для создания интерфейса объекта с остальным миром. Полученными объектами можно управлять при помощи вызова функцийчленов.
Наследование
Наследование – это процесс, посредством которого один объект может приобретать свойства другого. Это означает, что в ООП на основе уже существующих классов можно строить производные классы. Произ-
водный класс также называют классом-потомком, а родительский класс – классом-предком.
При этом производный класс обладает следующими свойствами: наследует элементы-данные и члены от своих родительских классов;
может добавлять к наследуемым членам свои собственные данные и методы; в производном классе наследуемые функции могут быть переопределены.
Таким образом, можно построить целую иерархию классов, связанных между собой отношением родитель – потомок. Термин базовый класс используется как синоним родительскому классу в иерархии классов. Если объект наследует свои атрибуты (данные-члены и функции-члены) от одного родительского класса, говорят об одиночном (или простом) наследовании. Если объект наследует атрибуты от нескольких родителей, говорят о множественном наследовании. Наследование позволяет значительно сократить определение класса-потомка благодаря тому, что классы-потомки являются расширениями родительских классов.
Выжол Ю.А. |
Объектно-ориентированное программирование |
Лекция 1 |
Общие свойства объектов |
3 |
Полиморфизм
Полиморфизм (от греческого "polymorphos" – множественность форм) – это свойство кода вести себя по-разному, в зависимости от ситуации, возникающей в момент выполнения. Полиморфизм – это характеристика функций-членов класса и проявляется, в частности, в возможности использования одного имени функции-члена для функций, имеющих различные типы аргументов.
Если выполняемые функцией действия определяются типом переданных ей аргументов, то этот тип полиморфизма называется перегрузкой функции.
Если выполняемые операцией действия определяются типом операндов переданных ей аргументов, то этот тип полиморфизма называется перегрузкой операции.
Другими словами, полиморфизм – это способность указателей на базовый класс принимать различные формы при использовании их для вызова виртуальных функций. Такая возможность в C++ является результатом позднего связывания. При позднем связывании адреса вызываемых функций-членов определяются динамически во время выполнения программы, а не статически во время компиляции, как в традиционных языках, в которых применяется раннее связывание. Позднее связывание выполняется только для виртуальных функций.
Методология ООП
В методологии ООП решаемая задача представляется не в виде алгоритмической модели, а в виде совокупности объектов различных классов, которые обмениваются запросами. Объект, получивший запрос, отвечает на него посредством вызова соответствующей функции-члена. Нахождение общности между типами объектов задачи – далеко не простой процесс. Он осуществляется на стадии объектно-
ориентированного проектирования.
На этой стадии вначале рассматривается вопрос о применимости ООП к решаемой задаче. При этом для принятия решения о применимости ООП решающую роль играет та степень общности между классами, которую можно использовать, применяя механизмы наследования и виртуальные функции. В некоторых задачах, таких как разработка графического интерфейса приложения, разработка приложений баз данных и компьютерная графика, простор для ООП поистине безграничен. Кроме того, методы ООП позволяют скрыть детали низкоуровневых сетевых протоколов. Поэтому они широко применяются при программировании приложений, работающих в сетях (как локальных, так и глобальных, например, в Internet). В случае принятия решения о применимости ООП на следующем этапе проектирования разрабатываются классы как строительные блоки для других типов и изучаются возможности выделения в классах тех свойств, которые могут быть переданы базовому классу. Затем проектируются те запросы, которыми будут обмениваться объекты, и осуществляется реализация разработанных объектов и запросов.
Пусть вас не смущает, если не все из этих понятий сразу станут ясны. Возвратитесь к данному разделу после прочтения нескольких последующих глав.
Выжол Ю.А. |
Объектно-ориентированное программирование |