Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Объектно-ориентированный анализ и проектирование. Задачи и примеры на C++. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
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; } }
};  intmain(intargc,char*argv[]){ Groupg; std::cout<<"Beforeaddingstudents:"<<std::endl; g.print();  g.addPerson(Person{"Ivan","Ivanov"}); g.addPerson(Person{"Elena","Sidorova"}); std::cout<<std::endl<<"Afteraddingstudents:"<<std::endl; g.print(); return0; }
Класс 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::stringfirstName,std::stringlastName): _firstName{firstName},_lastName{lastName}{}  virtualvoidprint(){ std::cout<<_firstName<<""<<_lastName; } }; 
classStudent:publicPerson{ public:
Student(std::stringfirstName, Person{firstName,lastName}{}  virtualvoidprint(){ std::cout<<"Student"<<_firstName<<""<<_lastName; } }; 
classTeacher:publicPerson{ public:
Teacher(std::stringfirstName,std::stringlastName): Person{firstName,lastName}{}  virtualvoidprint(){ std::cout<<"Teacher"<<_firstName<<""<<_lastName;
std::stringlastName):
47
} };
intmain(intargc,char*argv[]){
Studentstudent{"Ivan","Ivanov"}; Teacherteacher{"Elena","Sidorova"}; Person&person{student};  std::cout<<"Firstperson:"; person.print();  person=teacher; std::cout<<std::endl<<"Secondperson:"; person.print(); return0; }
В данной программе от базового класса 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]