МУ_ДЗ_2014 (Методические указания к лабораторным работам), страница 10
Описание файла
Файл "МУ_ДЗ_2014" внутри архива находится в папке "Методические указания к лабораторным работам". Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование на основе классов и шаблонов" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование на основе классов и шаблонов" в общих файлах.
Онлайн просмотр документа "МУ_ДЗ_2014"
Текст 10 страницы из документа "МУ_ДЗ_2014"
Далее целесообразно проанализировать предметную область и поставленную задачу и определить необходимость дополнительных классов для ее реализации. Эти классы могут быть технологическими (вспомогательными) и содержательными. Технологические классы могут быть выделены, например, для реализации контейнеров элементных объектов (списки, массивы, множества и т.д.) и для выполнения других функций решения задачи. Эти классы, возможно, не имеют явных аналогов в предметной области и выделяются на основе опыта программиста. Дополнительные содержательные классы могут потребоваться для комплексного решения задачи. Например, Для нашего случая это могут быть: класс городов (при построении карт), класс планов ремонта улиц (в ремонтной задаче), классы бюджетов оплаты жилья (для контроля оплаты квартир) и т.д.
Более важным является определение перечня возможных операций над объектами. Не всегда удается сразу определить его полностью: он наращивается и видоизменяется в процессе проектирования и реализации программной системы.
Пример. Предположим тема задания следующая - разработать систему классов для описания объектов строений/домов улиц (элементные объекты) и объектов типа улица, содержащих в себе элементные объекты (дома). Улица - это контейнерный объект. Задачи, для которых разрабатывается система классов, заданы выше. Для домов целесообразно выделить свойства создания дома (построение), удаления дома (снос дома), изменения свойств дома (установка признаков необходимости ремонта, числа жителей и т.д.). Для улиц возможные операции: добавление и удаление домов, переименование улицы, поверка признака ремонта улицы и домов на улице. Предположим, что нужно предусмотреть операции для контейнерного объекта: добавления строений, переименования улиц, сноса строений, печати списка домов, добавления строений и т.д. Более детально это расшифровано ниже, включая и раскрытие понятий предметной области:
-
В нашем случае, на первом этапе мы должны выделить следующие понятия: дома/строения и улицы, как упорядоченной совокупности домов.
-
Понятие дома - объекта, возможно, будет обладать следующими свойствами: номер дома, этажность дома, число жителей дома, расположение на левой или правой стороне улицы, название дома, характеристика строения и т.д.
-
Понятие улицы – объекта, возможно, будет содержать следующие свойства: название улицы, перечень домов улицы, число проживающих на улице, число домов, район расположения, город улицы и т.д.
-
Поведение дома – набор методов, возможно, будет содержать следующие действия: создание дома, разрушение дома, чтение параметров, изменение номера дома и название, установка число проживающих, изменение этажности – перестройка дома, распечатка дома и т.д.
-
Поведение улицы – набор методов, возможно, будет содержать следующие действия: создание улицы, удаление улицы, добавление дома на улицу, удаление дома с улицы, новая нумерация домов на улице, распечатка домов улицы, изменение названия улицы, чтение параметров улицы, объединение двух улиц, деление улиц на две и т.д.
-
Уже сейчас, можно придумать название для классов этих объектов: дом Home, а улица – Street ( Англоязычные названия используются для требований языков программирования. Они в переводе должны соответствовать содержанию объекта). Так как это описание классов на языке программирования, то мы должны давать названия латиницей. Лучше эти названия дать осмысленно.
-
В качестве технологических классов можно выделить классы: список (List) и элемент списка (listElement) и базовые абстрактные классы (по заданию ДЗ).
Еще раз уточню требования: в каждом варианте должно быть выделено, по крайней мере, три содержательных класса: один класс представляет собой описание конкретного материального или осмысленного объекта, а другой класс хранилище (список, массив, множество - контейнер) объектов первого класса с определенным порядком хранения, занесения и удаления объектов из него. Нужно придумать свойства и алгоритмы работы с этими объектами, продумать и вложить конкретный смысл в операции над ними. Над основными объектами и объектами контейнерных классов должны быть определены операции (объединения, сложения, удаления и т.д.).
Пример. В нашем случае материальный объект – дом/строение. Контейнерный объект улица, как совокупность домов. На первом этапе необходимо очень внимательно на понятийном уровне продумать смысл каждого свойства и каждого действия над выделенными типами объектов. Кроме того, как опытные разработчика, уже сейчас Вы должны "догадываться" во что в программе будут выливаться выделенные свойства и методы. К примеру ниже приведены некоторые свойства классов с описание содержания:
-
Номер дома порядковый – целочисленная переменная (int HomeNumber), а операции по изменению номера дома и чтению этих параметров (SetHomeNumber и GetHomeNumber) и т.д. Придуманные обозначения желательно поместить в таблицу, в которой будут перечислены все понятия их свойства и методы работы с данными объекта, их названия и типы.
-
Номер дома символьный – символьная переменная (char *Home_Number), потребуется, так как дома часто имеют различные индексы в номере (Например: “Дом 5а-стр.2”).
-
Название улицы – символьный массив (char NameStreet[30]) или указатель на имя (char * pNameStreet). Для добавления дома на улицу придумаем метод (AddHome), а для удаления дома с улицы (DeleteHome). И т.д. Придуманные обозначения желательно поместить в таблицу, в которой будут перечислены понятия/методы, их названия и типы.
Одновременно с разработкой классов должна быть разработана проектная документация в виде: диаграмм классов, диаграмм объектов тестового примера, техническое описание классов, уже на этом этапе нужно думать о сдаче проекта, поэтому продумывается и программа методика испытаний системы классов. Выделяется и разрабатывается также документация для эксплуатации программного продукта (см. ниже).
Д
иаграмма классов в нашем случае может иметь следующий вид:
В ней представлены следующие стандартные классы: CObject , CObArray (по варианту группы). Собственные классы ДЗ: AbstrHome , Home, Street, AbstrStreet. Между классами показаны связи: сплошная стрелка – наследование (от базового к производному) и накопления пунктирная стрелка.
Таблицы с описанием классов домов могут выглядеть примерно так:
Класс домов - Home | |||||||
Смысловое описание класса: класс домов используется для создания объектов типа дом для хранения информации о конкретном доме: номер, число жителей, число квартир, тип дома, требования к ремонту, число этажей. | |||||||
Базовые классы класса Home: AbstrHome | |||||||
Свойства класса Home | |||||||
№ п/п | Содержание свойства | Тип данных и название | Примечание | ||||
| Символьный номер дома | char *Home_Number; | |||||
| Номер дома числовой | int iHome; | |||||
| Число этажей в доме | int EtagCount; | |||||
| Число жителей в доме | int MenCount ; | |||||
| Тип дома | HomeType TypeHome ; | |||||
| Требуется ли ремонт дома | BOOL HomeRemont ; | |||||
| Число квартир в доме | int NumbApartament; | |||||
Методы класса Home | |||||||
№ п/п | Содержание метода | Тип метода | Прототип метода | Примечание | |||
| Создание дома без параметров | конструктор (конст.) | Home(); | Построение пустого дома | |||
| Создание дома по типу другого | конст. | Home( Home & H) ; | Построение | |||
| Создание дома по типу другого | конст. | Home( Home * pH); | Построение | |||
| Создание дома с симв. номером | конст. | Home(const char *HomName, const char *Number); | Построение | |||
| Создание дома с симв. И числовымномерами | конст. | Home(const char *HomName, const char *Number, int Numb) ; | Построение | |||
| Создание дома со всеми параметрами | конст. | Home(const char *HomName, const char *Number, int Numb, int Etag, int Men=0,HomeType Type = fast,int Apart=0) | Построение | |||
| Удаление дома | Деструктор | ~Home() | Снос дома | |||
| Изменить имя дома | Метод | void setName(const char *HomName , const char *Number=NULL); | ||||
| Получить имя дома | Метод | const char *getName(); | ||||
| Получить номер дома | Метод | const char *getNumb(); | ||||
| Получить числовой номер дома | Метод | int getNo(); | ||||
| Получить параметры дома | Метод | void getParam(int & iH, int & Etag ,int & Men ,HomeType & Type, int & Apart ); | ||||
| Установить параметры дома | Метод | void setParam(int iH, int Etag ,int Men ,HomeType Type, int Apart ); | ||||
| Установить все параметры дома | Метод | void setAllParam(const char *HomName , const char *Number, int iH, int Etag , int Men ,HomeType Type, int Apart , BOOL rem = false); | ||||
| Оператор присваивания | Оператор = | Home operator =(Home & H ); | Оператор должен быть перегружен, так как в объекте есть данные из динамической памяти | |||
| Сложение двух домов | Оператор + | friend Home & operator +(Home & H1 , Home & H2); | Дружественная функция | |||
Виртуальные методы класса Home | |||||||
| Получить тип класса | Виртуальный метод | virtual int classType(); | ||||
| Получить имя класса | Виртуальный метод | virtual char *className(); | ||||
| Распечатать параметры дома | Виртуальный метод | Virtual void printOn (ostream & out); | ||||