7. Упражнения. Выполните идентификацию компонент и описание их обязанностей для одного из перечисленных технических устройств: видеомагнитофон, телевизор, автомат по продаже газированных напитков, лифт.
Выполните идентификацию компонент применительно к игре в морской бой (примеры компонент – игровое поле и корабли) или для игры "объемный тетрис".
С помощью CRC-карточек опишите компоненты программы "музыкальный проигрыватель", в которой предусмотрено ведение базы данных музыкальных файлов и их воспроизведение.
Лекция 3. Объявление классов в Си++ В данной лекции рассматривается объявление классов в языке Си++, которое включает в себя описание переменных и методов, содержащихся в классах. Необходимо понимать, что объявление класса и создание объекта класса – это различные действия. В первом случае просто указывается новый тип данных. Объявление характеризует общие свойства и общее поведение множества объектов, но само по себе объявление класса не создает новых данных. Это происходит при создании объекта класса. Данную операцию можно рассматривать как разновидность объявления переменной. Создание объектов описывается в следующей лекции.
1. Инкапсуляция поведения и состояния Инкапсуляция (encapsulation) – это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования.
Классы можно рассматривать с нескольких точек зрения. Применительно к операции объявления удобно рассматривать классы как абстрактные типы данных. При программировании, основанном на абстракции данных, программный код, реализующий типы данных, разбивается на две части. Интерфейсная часть, доступная пользователю типа, представляет собой совокупность операций, которые определяют поведение абстракций. Вторая часть, часть реализации, видна программисту, выполняющему реализацию этого типа данных. В части реализации видны значения переменных, которые нужны для поддержания внутреннего состояния объекта.
В качестве примера рассмотрим АТД "стек". Пользователь видит описание допустимых операций: push, pop, top и т.д. С другой стороны, программисту, реализующему стек, необходимо работать с конкретными структурами данных, где хранятся значения стека, например, для целочисленного стека емкостью до 100 чисел это может быть массив int n[100]. Т.о. оказывается. что конкретные детали скрыты (инкапсулированы) внутри более абстрактного объекта.
Для обозначения представителя класса используется термин "объект". Для обозначения внутренней переменной объекта будет применяться термин "переменная объекта" или "атрибут". Каждый объект имеет свою собственную совокупность атрибутов. Обычно они не изменяются клиентами напрямую, а только с помощью специально предназначенных для этой цели методов классов.
Объект инкапсулирует внутри себя состояние и поведение. Состояние описывается атрибутами объекта, а поведение характеризуется методами. Снаружи клиенты могут узнать только о поведении объектов. Изнутри доступна полная информация о том, как методы обеспечивают необходимое поведение, изменяют состояние и взаимодействуют другими объектами.
2. Разновидности классов Большинство классов, использующихся в ООП, можно разделить на 4 категории (хотя, конечно, существуют и другие, более редкие категории классов):
управление данными (менеджеры данных, Data Managers);
источники и приемники данных (Data Sources и Data Sinks);
классы для просмотра данных (Views);
вспомогательные классы, упрощающие проектирование программ (Facilitators).
В некоторых случаях оказывается, что класс относится сразу к двум категориям. Тогда, возможно, его следует разбить на два класса.
Основная обязанность классов для управления данными – хранение и организация доступа к информации о состоянии чего-либо. Например, для абстрактной модели карточной игры основная задача класса CCard – хранение масти и ранга (достоинства) карты. Классы-менеджеры данных являются фундаментальными блоками программы. В спецификации проекта прототипами таких классов обычно являются существительные.
Классы-источники данных служат для генерации данных по запросам других классов. Пример подобного класса – генератор случайных чисел. Приемники данных предназначены для приема и дальнейшей передачи данных (например, это класс для записи данных в файл). В отличие от менеджеров данных, источники и приемники не хранят данные внутри себя неопределенно долго, а генерируют (источники данных) или обрабатывают данные (посредники данных) по запросу.
Классы для просмотра данных используются практически во всех программах, осуществляющих вывод информации на экран. Исходный текст для реализации этих классов обычно является сложным, часто модифицируется и в значительной степени не зависит от содержания отображаемых данных.
При проектировании программ принято отделять классы, содержащие специфические данные программы (модель данных, например, сведения о элементах чертежа в чертежном редакторе) от классов отображения этих данных (которые выполняют непосредственное рисование чертежа на экране). Это упрощает многократное использование кода, поскольку одни и те же классы отображения можно применять во многих программах. Часто модель может иметь несколько визуальных представлений. Например, финансовую информацию о курсе валют можно представить в виде гистограмм, или круговых диаграмм, или таблиц.
К категории вспомогательных классов относятся те классы, которые не содержат важной для программы информации, но облегчают выполнение сложных операций. Например, при отображении игральной карты на экране может использоваться вспомогательный класс, рисующий линии и текст на экране. Другой служебный класс может, например, обслуживать связный список для хранения карт (колоду).
|