Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Языки процедурного программирования).pdf
Добавлен: 23.04.2023
Просмотров: 594
Скачиваний: 2
СОДЕРЖАНИЕ
1. Понятие и классификация языков программирования
2. История появления языков программирования
2.1 Поколение языков программирования
2.1.1 Первое поколение языков программирования
2.1.2 Второе поколение языков программирования
2.1.3 Третье поколение языков программирования
3. Языки процедурного программирования
4. Недостатки структурного программирования
5. Объектно-ориентированный подход к программированию
6. Основные понятия объектно-ориентированного программирования
7. Основные принципы объектно-ориентированного программирования
7.1 Модификаторы доступа private и public
7.2 Инкапсуляция и скрытие данных
7.4.2 Множественное наследование
7.4.3 Спецификатор доступа protected
Имея написанный и отлаженный базовый класс, мы можем его больше не модифицировать, при этом механизм наследования позволит нам приспособить его для работы в различных ситуациях. Используя уже написанный код, мы экономим время и деньги, а также увеличиваем надежность программы. Наследование может помочь и при начальной постановке задачи программирования, разработке общей структуры программы. Важным результатом повторного использования кода является упрощение распространения библиотек классов. Программист может использовать классы, созданные кем-то другим, без модификации кода, просто создавая производные классы, подходящие для частной ситуации.
7.4.1 Суперклассы и подклассы
Суперкласс, или родительский класс (иногда называемый базовым), содержит все атрибуты и поведения, общие для классов, которые наследуют от него. Все подклассы включают эти атрибуты и поведения, поэтому нет необходимости дублировать их, спускаясь по дереву наследования, для каждого типа подклассов. Дублирование потребует много дополнительной работы, и, пожалуй, что вызывает наибольшее беспокойство, оно может привести к ошибкам и несоответствиям.
Подкласс, или дочерний класс (иногда называемый производным), представляет собой расширение суперкласса. Таким образом, подклассы наследуют все общие атрибуты и поведения от суперкласса.
Наследование обеспечивает большое количество преимуществ в
плане проектирования. При проектировании производного класса базовый класс предоставляет значительную часть требуемой функциональности[54].
7.4.2 Множественное наследование
Проектирование структур классов со множественным наследованием - трудная задача, решаемая путем последовательных приближений. Есть две специфические для множественного наследования проблемы - как разрешить конфликты имен между суперклассами и что делать с повторным наследованием.
Конфликт имен происходит, когда в двух или более суперклассах случайно оказывается элемент (переменная или метод) с одинаковым именем. Это главная беда множественного наследования: конфликт имен может ввести двусмысленность в поведение класса с несколькими предками.
Проблема повторного наследования решается тремя способами. Во-первых, можно его запретить, отслеживая при компиляции. Так сделано в языках Smalltalk и Eiffel (но в Eiffel, опять-таки допускается переименование для устранения неопределенности). Во-вторых, можно явно развести две копии унаследованного элемента, добавляя к именам префиксы в виде имени класса-источника (это один из подходов, принятых в C++). В-третьих, можно рассматривать множественные ссылки на один и тот же класс, как обозначающие один и тот же класс. Так поступают в C++, где повторяющийся суперкласс определяется как виртуальный базовый класс. Виртуальный базовый класс появляется, когда какой-либо подкласс именует другой класс своим суперклассом и отмечает этот суперкласс как виртуальный, чтобы показать, что это - общий (shared) класс[55].
7.4.3 Спецификатор доступа protected
Из методов класса можно получить доступ к членам (полям и методам) класса, если они имеют спецификатор public или protected . Но при использовании объекта, объявленного в программе, можно получить доступ только к данным со спецификатором public (например, используя операцию точки).
Предположим, что есть некий объект objA класса A. Метод funcA() является методом класса A. Оператор функции main() (или любой другой функции, не являющейся методом класса A) objA.funcA(); будет ошибочным, пока мы не объявим funcA() как public. Для объекта objA мы не можем использовать члены класса A, объявленные как private. Их могут использовать только методы самого класса A.
Однако при использовании наследования у нас появляется еще ряд добавочных возможностей. Возникает вопрос, могут ли методы производного класса иметь доступ к членам базового класса? Ответ будет таким: методы производного класса имеют доступ к членам базового класса, если они имеют спецификатор доступа public или protected. К членам, объявленным как private, доступа нет. Член, объявленный как protected, доступен методам своего класса и методам любого производного класса. При этом он не будет доступным из функций, не принадлежащих к этим классам.
Таким образом, если вы пишете класс, который впоследствии будет использоваться как базовый класс при наследовании, то данные, к которым нужно будет иметь доступ, следует объявлять, как protected[56].
7.4.4 Недостатки использования спецификатора protected
Следует знать, что существуют и недостатки использования спецификатора доступа protected. Допустим, вы написали библиотеку классов и публично ее распространяете. Любой программист сможет получить доступ к членам классов, объявленным как protected, просто создавая производные классы. Это делает члены, объявленные как protected, значительно менее защищенными, чем объявленные как private. Чтобы избежать порчи данных, часто приходится разрешать доступ производным классам только к тем методам базового класса, которые объявлены как public. И все же использование спецификатора доступа protected значительно упрощает программирование[57].
8. Полиморфизм
Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.
В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает упрощать сложность программ, разрешая использование того же интерфейса для задания единого класса действий.
Несмотря на то что полиморфизм тесно связан с наследованием, он часто упоминается отдельно от него как одно из наиболее весомых преимуществ объектно-ориентированных технологий. Если потребуется отправить сообщение объекту, он должен располагать методом, определенным для ответа на это сообщение. В иерархии наследования все подклассы наследуют от своих суперклассов. Однако, поскольку каждый подкласс представляет собой отдельную сущность, каждому из них может потребоваться дать отдельный ответ на одно и то же сообщение[58]. Полиморфизм обеспечивается за счет использования производных классов и виртуальных функций. Виртуальная функция — это функция, объявленная с ключевым словом virtual в базовом классе и переопределенная в одном или в нескольких производных классах. Виртуальные функции являются особыми функциями, потому что при вызове объекта производного класса с помощью указателя или ссылки на него С++, например, основываясь на типе объекта во время исполнения программы определяет, какую функцию вызвать.
Для разных объектов вызываются разные версии одной и той же виртуальной функции. Класс, содержащий одну или более виртуальных функций, называется полиморфным классом (polymorphic class). Виртуальная функция объявляется в базовом классе с использованием ключевого слова virtual. Когда же она переопределяется в производном классе, повторять ключевое слово virtual нет необходимости, хотя и в случае его повторного использования ошибки не возникнет.
В качестве примера полиморфизма и виртуальной функции рассмотрим следующую короткую программу:
#include <iostream>
#include <string>
using namespace std;
class Base {
public:
virtual void who() { // определение виртуальной функции
}
};
class first_d : public Base {
public:
void who() { // определение who() применительно к first_d
cout << "First derivation\n";
}
};
class seconded : public Base {
public:
void who() { // определение who() применительно к second_d
cout << "Second derivation\n";
}
};
int main()
{
Base *p;
first_d first_obj;
seconded second_obj;
p = &first_obj;
p->who(); // доступ к who класса first_d
p = &second_obj;
p->who(); // доступ к who класса second_
return 0;
}
Программа выдаст следующий результат:
First derivation
Second derivation
Проанализируем подробно эту программу, чтобы понять, как она работает. Как можно видеть, в объекте Base функция who() объявлена как виртуальная. Это означает, что эта функция может быть переопределена в производных классах. В каждом из классов first_d и second_d функция who() переопределена. В функции main() объявлен указатель р на класс Base. Затем объявлены две переменные. Первой является объект first_obj, имеющий тип first_d и second_obj, относящийся к производному классу seconded . После этого объявлен указатель р на объекты first_obj и second_obj, относящиеся к двум производным классам. Далее указателю р присвоен адрес объекта first_obj и вызвана функция who(). Поскольку эта функция объявлена как виртуальная, то С++ определяет на этапе исполнения, какую из версий функции who() употребить, в зависимости от того, на какой объект указывает указатель р. В данном случае им является объект типа first_obj, поэтому исполняется версия функции who(), объявленная в классе first_obj. Затем указателю р присвоен адрес объекта second_obj. После того, как функция who() была вызвана, С++ снова анализирует тип объекта, на который указывает р, для того, чтобы определить версию функции who(), которую необходимо вызвать. Поскольку р указывает на объект типа second_obj, то используется соответствующая версия функции who().
Ключевым в понимании полиморфизма является то, что он позволяет вам манипулировать объектами различной степени сложности путём создания общего для них стандартного интерфейса для реализации похожих действий.
Заключение
Объектно-ориентированный подход в значительной мере облегчает процесс разработки программ. В масштабных системах ООП отлично справляется с поставленной задачей, обладает гибкостью в обслуживании и возможностью повторного использования кода. Наследование позволяет экономить время; при создании нового класса нет необходимости заново прописывать все методы и свойства класса.
Инкапсуляция - это еще одно преимущество ООП, сокрытие деталей реализации классов повышает надежность работы программного кода, поскольку защищает наиболее критичные данные от несанкционированного доступа.
Полиморфизм также очень полезен при программировании. С его помощью есть возможность создавать функции с одинаковыми именами, но разным набором инструкций.
Технология ООП далеко шагнула вперед по сравнению с применявшимся раннее процедурным подходом. Объектно-ориентированная технология разработки программ широко и эффективно применяется среди разработчиков инструментальных средств, системного программирования, программирования пользовательских интерфейсов прикладных программ.
Библиография
- Гедранович, В.В. Основы компьютерных информационных технологий: учеб. -метод. комплекс / В.В. Гедранович, Б.А. Гедранович, И.Н. Тонкович.–2-е изд., стереотип.–Минск: Изд-во МИУ, 2011.– 344 с.
- История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –232с.
- Г.Буч Объектно ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Пер.с англ.—СПб.;М.: «Невский Диалект» — «Издательство БИНОМ», 1999г.
- В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-108.
- Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд., Питер, 2004. – 902с.
- Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — 304с.
- Основы информатики и вычислительной техники // URL: http://www.opengl.org.ru/osnovy-informatiki-i-vychislitelnoi-tekhniki/osnovy-informatiki-i-vychislitelnoi-tekhniki-str41.html (Дата обращения: 07.06.2018).
- Процедурное программирование // URL:https://mydocx.ru/10-47202.html (Дата обращения: 20.06.2018).
-
Основы информатики и вычислительной техники//URL: http://www.opengl.org.ru/osnovy-informatiki-i-vychislitelnoi-tekhniki/osnovy-informatiki-i-vychislitelnoi-tekhniki-str41.html (Дата обращения: 07.06.2018)
-
Гедранович, В.В. Основы компьютерных информационных технологий: учеб. -метод. комплекс / В.В. Гедранович, Б.А. Гедранович, И.Н. Тонкович. –2-е изд., стереотип. –Минск: Изд-во МИУ, 2011. – 344 с. ↑
-
Гедранович, В.В. Основы компьютерных информационных технологий: учеб. -метод. комплекс / В.В. Гедранович, Б.А. Гедранович, И.Н. Тонкович. –2-е изд., стереотип. –Минск: Изд-во МИУ, 2011. – 344 с. ↑
-
Основы информатики и вычислительной техники//URL: http://www.opengl.org.ru/osnovy-informatiki-i-vychislitelnoi-tekhniki/osnovy-informatiki-i-vychislitelnoi-tekhniki-str41.html (Дата обращения: 07.06.2018) ↑
-
Гедранович, В.В. Основы компьютерных информационных технологий: учеб. -метод. комплекс / В.В. Гедранович, Б.А. Гедранович, И.Н. Тонкович. –2-е изд., стереотип. –Минск: Изд-во МИУ, 2011. – 344 с. ↑
-
Гедранович, В.В. Основы компьютерных информационных технологий: учеб. -метод. комплекс / В.В. Гедранович, Б.А. Гедранович, И.Н. Тонкович. –2-е изд., стереотип. –Минск: Изд-во МИУ, 2011. – 344 с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –26с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –30с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –27с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –37с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –45с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –192с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –119с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –92с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –104с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –194с. ↑
-
В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-6с. ↑
-
Г.Буч Объектно ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Пер.с англ.—СПб.;М.: «Невский Диалект» — «Издательство БИНОМ», 1999г. ↑
-
В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-7с. ↑
-
В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-8с. ↑
-
В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-9с. ↑
-
В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-11с. ↑
-
В.В.Мухортов,В.Ю.Рылов Объектно-ориентированное программирование, анализ и дизайн: метод. пособие / В.В.Мухортов,В.Ю.Рылов.-Новосибирск: Изд-во Новософт, 2002г.-11с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –194с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –197с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –195с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –196с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –199с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –198с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –198с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –199с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –200с. ↑
-
Процедурное программирование//URL:https://mydocx.ru/10-47202.html (Дата обращения: 20.06.2018) ↑
-
Процедурное программирование//URL:https://mydocx.ru/10-47202.html (Дата обращения: 20.06.2018) ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –206с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –207с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –207с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –205с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –205с. ↑
-
История вычислительной техники: учеб. пособие / И.А. Казакова. –Пенза: Изд-во ПГУ, 2011. –206с. ↑
-
Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд., Питер, 2004. - С.33-35 ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 37 с. ↑
-
Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд., Питер, 2004. - С.36 ↑
-
Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — 25 с. ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 69 с. ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 85 с. ↑
-
Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд., Питер, 2004. – С.39-40 ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 39 с. ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 40 с. ↑
-
Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — 36 с. ↑
-
Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — 37 с. ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 91 с. ↑
-
Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — 40 с. ↑
-
Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — С.41-42 ↑
-
Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд. - М.: Бином, 1998. - 102 с. ↑
-
Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд., Питер, 2004. – С.366-367 ↑
-
Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд., Питер, 2004. – С.368 ↑
-
Вайсфельд М. Объектно-ориентированное мышление. — СПб.: Питер, 2014. — С.44-45 ↑