Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Объектно-ориентированный анализ и проектирование. Задачи и примеры на C++. Учебное пособие
.pdf
classGroup{
private:
std::vector<Person>students;
public:
voidaddPerson(Personp){
students.push_back(p);
}
voidprint(){
if(students.size()==0){
std::cout<<"Nopersonsinthegroup"<<std::endl;
return;
}
for(Person&p:students){
p.print();
std::cout<<std::endl;
}
}
};
intmain(intargc,char*argv[]){
Groupg;
std::cout<<"Beforeaddingstudents:"<<std::endl;
g.print();
g.addPerson(Person{"Ivan","Ivanov"});
g.addPerson(Person{"Elena","Sidorova"});
std::cout<<std::endl<<"Afteraddingstudents:"<<std::endl;
g.print();
return0;
}
Класс Group содержит список студентов – объектов класса Person.
Для хранения списка использован массив std::vector из стандартной
библиотеки. В группу можно добавить обучающегося с помощью метода addPerson(Person p). Вы можете самостоятельно реализовать метод для удаления из списка группы обучающегося с указанным именем. Также в классе Group имеется метод print()
для вывода на экран
списка студентов. В тестовой программе создается группа студентов,
затем в нее добавляется двое обучающихся.
41

5.2. ПРИМЕР РАЗРАБОТКИ ПРОГРАММЫ
Постановка задачи
Анализ предыдущей версии программы показал, что характеристики смартфона необходимо инкапсулировать в отдельный класс.
Это улучшит структуру программы, сделает классы более специализированными и компактными.
Проектирование
Для хранения информации о характеристиках смартфона разработаем специализированный класс SmartphoneSpec и перенесем в него
большинство полей и
методов из класса Smartphone. В классе
Smartphone оставим только сведения о модели устройства и стоимости
и добавим поле типа SmartphoneSpec, сделав описание характеристик
обязательной частью класса. На рисунке представлена диаграмма
классов новой версии программы.
Взаимосвязь модулей после добавления класса для описания
характеристик смартфона
42

Программная реализация
Ниже приведены исходные коды разработанных классов и тести-
рующей программы.
Листинг 5.2. Фрагмент файла SmartphoneSpec.h
#pragmaonce
//ПропущеныобъявленияперечисленийManufacturer,Color,OS,CPU
//Онианалогичныпредыдущейверсии
classSmartphoneSpec{
private:
Manufacturermanufacturer;Colorcolor;
floatdisplaySize;intram,storage;
CPUcpu;OSos;
public:
SmartphoneSpec();
SmartphoneSpec(Manufacturermanufacturer,
Colorcolor,floatdisplaySize,intram,
intstorage,CPUcpu,OSos);
ManufacturergetManufacturer()const;
ColorgetColor()
intgetRAM()const;intgetStorage()const;
CPUgetCPU()const;OSgetOS()const;
};
const;floatgetDisplay()const;
Листинг 5.3. Файл Smartphone.h
#pragmaonce
#include<string>
#include"SmartphoneSpec.h"
usingnamespacestd;
classSmartphone{
private:
stringmodel;doubleprice;SmartphoneSpecspec;
public:
Smartphone();
Smartphone(stringmodel,doubleprice,SmartphoneSpecspec);
stringgetModel()const;
SmartphoneSpecgetSpec()const;
doublegetPrice()const;
voidsetPrice(doubleprice);
};
43

Реализации методов данных классов не имеют особенностей, поэтому листинги SmartphoneSpec.cpp и Smartphone.cpp не приводится.
Метод из класса Catalog для поиска подходящих товаров необходимо
скорректировать так, чтобы он принимал искомую спецификацию
смартфона:
vector<Smartphone> search(const SmartphoneSpec&
searchSmartphoneSpec);
Реализация данного метода и тестовая программа несущественно
отличаются от предыдущего варианта, поэтому не будем приводить
здесь листинги из остальных файлов
.
Тестирование и оценка результатов
Программа сохранила свою работоспособность. Кроме того, улучшилось структурирование системы: класс Smartphone представляет
товар, характеристики которого описаны в классе SmartphoneSpec.
Для поиска необходимо указать только значения интересующих пользователя характеристик смартфона. В результате поиска пользователь
получает список товаров.
При изменении перечня характеристик класс Smartphone не изменяется. Изменения будут только в SmartphoneSpec. В этом заключается
сила инкапсуляции: независимость частей программы и возможность
модификации одних частей без изменения других. В результате упрощается процесс изменения кода.
Дальнейшее развитие системы будет связано с увеличением номенклатуры продаваемых товаров: что потребуется изменить, если
необходимо вести каталог разных устройств: умных часов
, фитнесбраслетов, планшетов, ноутбуков и т. д.? Что нужно изменить в программе для представления различных списков параметров устройств?
5.3. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
1. Заполните чек-листы (приложения 1 и 2) по программной реали-
зации, приведенной в этой главе.
2. Проводя аналогичные рассуждения, разработайте программу для
работы с каталогом других товаров – ноутбуков
.
3. Аналогичным образом разработайте программу для представле-
ния каталога книг.
4. Разработайте программу для представления каталога фильмов.
44

5. Разработайте программу для агентства недвижимости с катало-
гом продаваемых квартир.
6. Разработайте программу для учреждения дополнительного обра-
зования с каталогом курсов повышения квалификации.
7. Проводя аналогичные рассуждения, разработайте программу для
представления информации об успеваемости обучающихся. На основе
класса Catalog можно сделать класс для представления сведений
о группе студентов. На основе
класса Smartphone – создать класс для
хранения сведений о студенте. На основе класса SmartphoneSpec – разработать класс, представляющий список дисциплин, которые необходимо изучить, и полученные за них оценки. Поисковая система должна
предоставлять список студентов, сдавших указанные предметы на заданные оценки.
8. В текущей версии программы есть недостаток: в каталоге
хранятся сведения только о товарах, имеющихся в наличии. Скорректируйте программу таким образом, чтобы сведения о наличии и стоимости товара представлялись отдельным классом. В этом классе должна
быть ссылка на товар из каталога. Программа должна предоставлять
возможность поиска всех когда-либо выпущенных моделей смартфона
с подходящими характеристиками и поиска
имеющихся в наличии
подходящих смартфонов.
9. Добавьте в программу возможность продажи смартфонов
(из числа имеющихся в наличии). При этом должна вестись отчетность
о проданных смартфонах с возможностью вывода отчета за указанный
интервал дат.
10. Вернемся к исходному варианту представления характеристик
товара – в строковом формате. Измените класс SmartphoneSpec таким
образом, чтобы
сведения о характеристиках хранились в ассоциативном массиве (std::map<std::string, std::string>). Такая структура хранит
пары элементов вида «ключ», «значение». Для добавления, изменения
и удаления элементов используется ключ. Используя в качестве ключа
название характеристики, можно хранить сведения о произвольном
количестве параметров товара.
45

Глава 6. РАСШИРЕНИЕ
ВОЗМОЖНОСТЕЙ ПРОГРАММЫ
6.1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Наследование. Переопределение функций. Виртуальные функции
и полиморфизм
Наследование – концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа.
Наследование можно применять для достижения двух целей. Первый
вариант – когда наследование в большей степени относится к повторному использованию кода,
и функциональность ранее разработанных классов. Во втором случае
наследование служит для выражения отношения «является», когда на
основе существующих обобщенных (базовых) классов создаются узкоспециализированные производные классы. При этом базовым и производным классам присущи общие с точки зрения внешней среды черты
поведения, отличающиеся внутренней реализацией. Именно семанти
ческая связь базовых и производных классов способствует применению динамического полиморфизма. Пример такого отношения: персональный компьютер, ноутбук и планшет являются электронными
вычислительными машинами, и принципы их функционирования,
а также методы взаимодействия пользователя с ними имеют очень
много общего. На базовом уровне вы работаете с ними одинаково
(у них одинаковый
становятся важными отличия между этими видами устройств (например, отличие может быть в версии или семействе операционной системы, характеристиках процессора или видеоадаптера и т. д.). Динамиче-
интерфейс), и только в некоторых случаях для вас
новые классы расширяют содержание
-
46

ский полиморфизм – это механизм, с помощью которого можно определить несколько методов с одинаковыми именами и сигнатурами
в базовом классе и производном классе. В C++ такие методы называются виртуальными. При вызове такого метода через указатель или
ссылку базового типа выполняется та реализация функции, которая
соответствует типу фактически адресуемого объекта. Проиллюстрируем
это программой, приведенной в листинге 6.1.
Листинг 6.1. Пример использования наследования и виртуальных
функций
#include<iostream>
classPerson{
protected:
std::string_firstName;std::string_lastName;
public:
Person(std::stringfirstName,std::stringlastName):
_firstName{firstName},_lastName{lastName}{}
virtualvoidprint(){
std::cout<<_firstName<<""<<_lastName;
}
};
classStudent:publicPerson{
public:
Student(std::stringfirstName,
Person{firstName,lastName}{}
virtualvoidprint(){
std::cout<<"Student"<<_firstName<<""<<_lastName;
}
};
classTeacher:publicPerson{
public:
Teacher(std::stringfirstName,std::stringlastName):
Person{firstName,lastName}{}
virtualvoidprint(){
std::cout<<"Teacher"<<_firstName<<""<<_lastName;
std::stringlastName):
47

}
};
intmain(intargc,char*argv[]){
Studentstudent{"Ivan","Ivanov"};
Teacherteacher{"Elena","Sidorova"};
Person&person{student};
std::cout<<"Firstperson:";
person.print();
person=teacher;
std::cout<<std::endl<<"Secondperson:";
person.print();
return0;
}
В данной программе от базового класса Person (человек) унаследованы классы Student (обучающийся) и Teacher (преподаватель). Такая
структура классов может быть использована, например, для описания
состава молодежной научной лаборатории, в которой работают преподаватели и студенты. При печати сведений о лаборатории кроме имени
участника нужно вывести должность преподавателя или группу,
в которой учится студент. Для того чтобы в зависимости от типа участника
выводились разные сведения, применяется переопределенная виртуальная функция print(). В этой версии программы она выводит только
социальную роль участника. Вы можете самостоятельно добавить
в класс Teacher поле с названием должности, а в класс Student – поле
с номером группы
, а также изменить функцию print() в производных
классах так, чтобы они выводили дополнительные сведения.
Конструкторы производных классов передают значения параметров в конструктор базового класса. Если вы добавите дополнительные
поля в эти классы, то нужно скорректировать код так, чтобы значения
этих полей устанавливались конструктором.
В тестовой программе создается два объекта
разных производных
классов и ссылка, имеющая тип базового класса. Сначала ссылка связывается с объектом класса Student, и через нее печатаются сведения
об обучающемся. Затем ссылка связывается с объектом класса Teacher,
и печатается информация о нем.
48

6.2. ПРИМЕР РАЗРАБОТКИ ПРОГРАММЫ
Постановка задачи
Предположим, что управляющий магазином решил расширить
ассортимент товаров, и стал торговать не только смартфонами, но
и «умными» часами. Это потребовало внесения изменений в программу-каталог товаров. Проанализируем, что необходимо сделать для
представления в каталоге различных видов товара.
Проектирование
В качестве характеристик «умных» часов,
сведения о которых
нужно отражать в каталоге, выберем следующие: наименование производителя (manufacturer) и торговое наименование (model), цвет корпу-
са (color), наличие сенсорного дисплея (touchScreen) и модуля GPS
(GPS), цена товара (price). Данные характеристики можно представить
в классе SmartwatchSpec. Но можно заметить, что ряд параметров совпадает с характеристиками смартфона (manufacturer
и color), а сведения о модели и цене в предыдущей версии программы находились
в классе, представляющем устройство (Smartphone). Поэтому добав-
ление классов SmartwatchSpec и Smartwatch, устроенных аналогично
ранее разработанным, приведет к дублированию кода. Общие свойства этих объектов целесообразно представить в базовых классах
DeviceSpec и Device. Кроме того, использование общих
базовых клас-
сов позволит хранить в каталоге сведения обо всех видах устройств
и легко пополнить каталог новыми видами товаров.
Следующей модификацией программы будет усовершенствование
метода для поиска подходящих товаров. Поскольку в каталоге будут
храниться сведения о разных классах товаров, необходимо изменить
метод search() так, чтобы он не зависел от списка
характеристик товара. В отличие от предыдущего варианта программы, метод поиска не
будет сравнивать значения известных ему характеристик, а вызовет
метод matches() из класса спецификации устройства. Данный метод
проведет сравнение значений характеристик товара с требуемыми
и вернет true, если они соответствуют друг другу. Таким образом,
класс Catalog делегирует операцию сравнения характеристик
соответствующим классам. В результате каждый класс имеет дело с собственной функциональностью и меньше зависит от других классов.
Это приводит к ослаблению связности и способствует гибкости
49

программы: при появлении новых типов устройств не потребуется
больших изменений класса Catalog. Каждый объект решает конкретную задачу и не делает ничего лишнего.
С учетом предложенных изменений получим диаграмму классов,
представленную на рисунке. Стрелками с треугольными окончаниями
показана взаимосвязь производных и базовых классов.
Взаимосвязь модулей после добавления различных видов устройств
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
