геометрическая фигура и унаследованных классов линия и
прямоугольник. Определение базового класса геометрических фигур
может выглядеть следующим образом:
/* геометрическая фигура,атрибуты:координаты на плоскости и цвет */
class Fig
{
154
public:
void SetXY(int nx, int ny) //
задание координат
{
x=nx;
y=ny;
}
void Pokras(int cvet)
{
color=cvet;
}
void Skryt
(); // скрыть — нарисовать черным
{
Pokras(BLACK);
Risui();
}
virtual int Risui()=0;
private:
int x, y;
int color;
};
Обратите внимание на следующее обстоятельство. Непосредственный
доступ к координатам x, y и цвету фигуры закрыт (модификатор
private
). Публичными объявлены функция SetXY, при использовании
которой возможна модификация координат, и функция Pokras для
изменения цвета фигуры. Данный подход широко применяется в объектно-
ориентированных программах. Еще один весьма важный момент связан с
объявлением функции Risui, предназначенной для отображения фигуры
на экране. Она не только объявлена как виртуальная — фигурирует запись
=0
, довольно оригинальная. Подобный необычный синтаксис в языке
программирования С++ предназначен для объявления так называемых
чистых виртуальных функций — функций, не подлежащих определению в
базовом классе. Действительно, мы не можем изобразить фигуру
вообще — не конкретно прямоугольник, треугольник или окружность, а
геометрическую фигуру. Конкретный вариант функции Risui
определяется в наследуемых классах:
// класс линия
class Linia: public Fig
{
public:
155
void Risui();
{
setcolor(color);
line(x,y,xk,yk);
}
//
конструктор
Linia (int ix,int iy, int ixk,int iyk)
{
x=ix;y=iy;xk=ixk;yk=iyk;
}
private:
int: xk,yk; //
координаты конца линии
};
//
класс прямоугольник
class Priam: public Fig
{
public:
void Risui();
{
setcolor(color);
rectungle(x,y,xk,yk);
}
//
конструктор
Priam (int ix,int iy, int ish,int iv)
{
x=ix;y=iy;shir=ish;vys=iv;
}
private:
int: shir,vys; //
ширина, высота
};
Класс, содержащий хотя бы одну чистую виртуальную функцию,
называется абстрактным классом. Создать объект абстрактного класса
нельзя. Такой класс используется лишь как часть иерархии наследования
классов.
Контрольные вопросы
1.
Применим ли объектно-ориентированный подход за рамками
программирования?
156
2.
Можете ли вы назвать функциональные языки программирования,
поддерживающие ООП?
3.
Метод и функция-член в ООП — одно и то же? Атрибут и переменная-
член? Подкласс и наследуемый класс? Чем определяется применяемая
терминология?
4.
В чем заключается концепция абстрактного типа данных?
5.
Что такое полиморфизм? Приведите примеры.
6.
Опишите концепцию наследования в ООП. Какова связь между
наследованием и повторным использованием?
7.
В чем, по вашему мнению, заключаются недостатки и преимущества
множественного наследования?
8.
Что такое дружественная функция?
9.
Зачем используется переопределение функций?
10.
Какой из языков ООП появился первым и когда? С какими целями он
создавался и родственен ли Алголу?
11.
Является ли Smalltalk языком чистого объектно-ориентированного
программирования с наиболее полным воплощением концепции ООП?
Кем и с какими целями был создан язык Smalltalk?
12.
Что такое модификатор доступа? Какие модификаторы вам известны?
Если в программе на C++ не указать модификатор доступа, какими
будут члены класса по умолчанию — закрытыми или открытыми?
13.
Является ли концепция инкапсуляции уникальной для ООП?
14.
Что такое деструктор? Когда он вызывается?
15.
Что такое конструктор? Может ли у класса быть несколько
конструкторов?
16.
У каждого ли класса существует конструктор? Что такое конструктор
по умолчанию?
17.
Что такое виртуальная функция? Может ли она быть вызвана на
выполнение?
18.
Что такое чистая виртуальная функция и абстрактный класс?
19.
Поясните принцип действия модификатора доступа protected. Что
такое защищенные члены класса?
20.
Возможен ли доступ к членам класса через указатели? Приведите
примеры.
157
Достоинства и недостатки ООП
Как уже говорилось, в настоящее время объектно-ориентированное
программирование является магистральным путем развития в индустрии
информационных технологий. Апологеты ООП говорят прежде всего о
следующих достоинствах объектно-ориентированных систем:
возможности повторного использования;
упрощении создания сложных систем за счет использования
абстракции;
удобстве сопровождения и модификации объектно-ориентированных
программ.
В то же время у ООП есть и ряд довольно авторитетных критиков. К ним, в
частности, относится такой известный в мире программирования человек,
как Никлаус Вирт, создатель языков Паскаль, Модула и Оберон. Он
утверждает, в частности, что ООП — не более чем тривиальная надстройка
над структурным программированием и преувеличение его значимости,
выражающееся в том числе во включении в языки программирования все
новых модных «объектно-ориентированных» средств, безусловно, вредит
качеству разрабатываемого программного обеспечения. Н. Вирт очень
удивлен тем вниманием, которое уделяется ныне ООП. Другой критик
ООП — известный специалист по программированию Александр
Степанов, который участвовал в создании C++ вместе c Бьерном
Страуструпом, а впоследствии написал стандартную библиотеку шаблонов
языка программирования С++ (STL). А. Степанов полностью
разочаровался в парадигме ООП. Он пишет: «Я уверен, что ООП
методологически неверна. Она начинает с построения классов. Это как
если бы математики начинали бы с аксиом. Но реально никто не начинает
с аксиом, все начинают с доказательств. Только когда найден набор
подходящих доказательств, лишь тогда на этой основе выводится аксиома.
То есть в математике вы заканчиваете аксиомой. То же самое и с
программированием: сначала вы должны начинать развивать алгоритмы, и
только в конце этой работы приходите к тому, что вы в состоянии
сформулировать четкие и непротиворечивые интерфейсы. Именно из-за
этой неразберихи в ООП так популярен рефакторинг — из-за ущербности
парадигмы вы просто обречены на переписывание программы уже в тот
самый момент, когда только задумали ее спроектировать в ООП-стиле».
Патриарх свободно распространяемого ПО Ричард Столлмэн также
известен своим критическим отношением к ООП. Особенно любит он
шутить насчет мифа о том, что ООП «ускоряет разработку программ»:
«Как только ты сказал слово “объект”, можешь сразу забыть о
158
модульности».
Критики, в частности, обращают внимание на следующие обстоятельства:
Внедрение ООП требует дополнительных затрат на обучение
программистов и накладных расходов при создании программ — от 12
до 75 % времени.
Наследование — самая большая провокация в индустрии, ни в каком
моделировании наследования не существует.
Инкапсуляция и повторное использование возможны и без ООП при
правильной модульной организации программной системы.
В то же время ряд наиболее сложных и успешно используемых
программных систем созданы именно в рамках объектно-
ориентированного подхода, его применяют такие гиганты индустрии, как
Microsoft, IBM, Oracle.
Оставляем за читателем право самостоятельно сделать выводы о пользе и
недостатках объектно-ориентированного подхода к программированию.
Контрольные вопросы
1.
В чем заключаются плюсы объектно-ориентированных программных
систем?
2.
Можно ли сказать, что объектно-ориентированный подход — пустое
усложнение, не несущее выгод? Обоснуйте свое мнение.
159
Список литературы
1.
Современный компьютер: Сб. науч.-попул. Статей; Пер. с англ./Под
ред. В.М.Курочкина; предисл. Л.Н. Королева — М: Мир, 1986.
2.
Хофштадтер Д. Гедель, Эшер, Бах — эта бесконечная гирлянда. —
Самара: Бахрах-М, 2000.
3.
Тьюринг А. Может ли машина мыслить. — М.: Физматгиз, 1950.
4.
Лорьер Ж.-Л. Системы искусственного интеллекта. — М.: Мир, 1991.
5.
Ермаков И. Е. Лекции с обзором языков программирования.
6.
Непейвода Н. Стили и методы программирования. Курс лекций.
Учебное пособие. — М.: Интернет-университет информационных
технологий, 2005.
7.
Пентковский В. М. Язык программирования Эль-76. Принципы
построения языка и руководство к пользованию. — 2-е изд., испр. и
доп. — М.: Физматлит, 1989.
8.
Хамби Э. Программирование таблиц решений. — М.: Мир, 1976.
9.
Вирт Н. Систематическое программирование. Введение. — М.: Мир,
1977.
10.
Кнут Д. Искусство программирования. В 3 т. — М.: Вильямс, 2012.
11.
Керниган Б., Ритчи Д. Язык программирования Си. 2-е изд.— М.:
Издательский дом «Вильямс», 2013.
12.
C/С++. Программирование на языке высокого уровня / Т.А.
Павловская — СПб.: Питер, 2011 .
13.
Пустоваров
В. И.
Язык
ассемблера
в
программировании
информационных и управляющих систем. — М.: ДЕСС, 1998.
14.
Стерлинг Л., Шапиро Э. Искусство программирования на языке
Пролог. — М.: Мир, 1990.
15.
Тюгашев А.А. Графические языки программирования и их применение
в системах управления реального времени. — Самара: Изд-во СНЦ РАН
, 2009.
16.
ГОСТ 19.701–90. Единая система программной документации. Схемы
алгоритмов, программ, данных и систем. Условные обозначения и
правила выполнения. — М.: Госстандарт, 1991.
17.
Коварцев А. Н. Автоматизация разработки и тестирования
программных средств / Изд-во Самар. гос. аэрокосм. ун-та — Самара,
1999.
160
18.
Харьковский З. Путеводитель автостопщика по потаенным знаниям //
Компьютерра.- 2005. № 12. — С. 42–52.
19.
Страуструп Б. Язык программирования С++. 3-е изд. — М.: Бином,
2011.
20.
Кулямин В. В. Перспективы интеграции методов верификации
программного обеспечения // Труды ИСП РАН. — 2009. — Т.16:-С.73-
88,
21.
Дейкстра Э. Дисциплина программирования. — М.: Мир, 1978.
22.
Паронджанов В. Д. Как улучшить работу ума. — М.: Дело, 2001.
23.
Кауфман В. Языки программирования. Концепции и принципы. — М.:
ДМК Пресс, 2011.
24.
Пратт Т., Зелковиц М. Языки программирования: разработка и
реализация / Под общей ред. А. Матросова. — СПб.: Питер, 2002.
25.
Абельсон Х., Сассман Д. Структура и интерпретация компьютерных
программ. — М.: Добросвет, 2010.
|