Приложения с наследованием классов



Понятие наследования класса имеет важное применение в программировании графического пользовательского интерфейса (grafical user interface – GUI) и системах баз данных. Графические приложения фокусируют внимание на окнах, меню, диалоговых окнах и так далее. Базовое окно – это структура данных с данными и операциями, являющимися общими для всех типов окон. Операции включают открытие окна, создание или изменение заголовка окна, установку линеек прокрутки и областей перетаскивания и т.д. Приложения GUI состоят из классов диалога, классов меню, классов текстовых окон и так далее, которые наследуют базовую структуру и операции от базового класса окна. Например, следующая иерархия класса включает класс Dialog и класс TextEdit, порожденные от класса Window.

 

 


Этот пример класса Window показывает одиночное наследование, в котором производный класс имеет только один базовый класс. Однако при множественном наследовании (multiple inheritance) класс порождается от двух или более базовых классов. Некоторые приложения GUI используют это свойство. Программа текстового процессора объединяет редактор (editor) с менеджером просмотра (view manager) для пролистывания текста в некотором окне. Редактор читает строку символов и вносит изменения, вставляя и удаляя строки, и вводя информацию форматирования. Менеджер просмотра отвечает за копирование текста на экран с использованием информации о шрифте и окне. Редактор экрана может быть определен как производный класс, использующий класс Editor (редактора) и класс View (менеджера просмотра) в качестве базовых классов.

Множественное наследование

 

 


Разработка объектно-ориентированных программ

Большие программные системы становятся все более сложными и требуют новых подходов к разработке. Традиционная разработка использует модель управления, которая предполагает наличие администратора верхнего уровня (top administrator), понимающего систему и поручающего задачи менеджерам. Такая нисходящая программная разработка (top-down program design) рассматривает систему как набор подпрограмм, состоящий из нескольких слоев.

 

 

 


На верхнем уровне главная программа управляет работой системы, выполняя последовательность вызовов подпрограмм, которые производят вычисления и возвращают информацию. Эти подпрограммы могут далее поручать выполнение некоторых задач другим подпрограммам. Элементы нисходящей программной разработки необходимы для всех систем. Однако, когда задача становится слишком большой, этот подход может оказаться неудачным, поскольку его сложность подавляет способность отдельного человека управлять такой иерархией подпрограмм. Кроме того, простые структурные изменения в подпрограммах около вершины иерархии могут потребовать дорогих и занимающих длительное время изменений в алгоритмах для подпрограмм, находящихся в нижней части диаграммы.

Объектно-ориентированное программирование использует другую модель системной разработки. Оно рассматривает большую систему как набор объектов (агентов), которые взаимодействуют для выполнения задач. Каждый объект имеет методы, управляющие его данными.

Целью программной разработки является создание читабельной и поддерживаемой архитектуры, которая может быть расширена, как диктует необходимость. Хорошо организованные системы легче понимать, разрабатывать и отлаживать. Все философии разработки пытаются преодолеть сложность программной системы с помощью принципа разделения и подчинения. Нисходящая программная разработка рассматривает систему как набор функциональных модулей, состоящий из слоев. Объектно-ориентированное программирование использует объекты как основу разработки. Не существует единственного способа программной разработки и строго определенного процесса, которому необходимо следовать. Разработка программ – это вид деятельности человека, который должен включать творческую свободу и гибкость. В этой книге мы обсуждаем общий подход, определяющий методологию разработки программного продукта (software development methodology). Этот подход включает отдельные фазы разработки программного продукта, среди которых анализ задачи и определение программы, разработка объекта и процесса, кодирование, тестирование и поддержка (сопровождение).

 

1.6.1. Анализ задачи/определение программы

Программная разработка начинается, когда клиент обозначит некоторую задачу, которая должна быть решена. Эта задача часто определяется свободно, без ясного понимания, какие именно данные имеются в наличии (вход) и какая новая информация должна быть получена в результате (выход). Программист анализирует задачу вместе с клиентом и определяет, какую форму должны принять вход и выход и алгоритмы, которые используются при выполнении вычислений. Этот анализ формализуется в фазе разработки программы.

1.6.2. Разработка

Программная разработка описывает объекты, которые являются основными строительными блоками программы. Разработка описывает также управляющие модули, руководящие взаимодействием между объектами.

В фазе объектной разработки определяются объекты, которые будут использоваться в программе, и пишется объявление для каждого класса. Класс тестируется путем его использования с какой-либо небольшой программой, тестирующей методы класса при управляемых условиях. Тот факт, что классы могут тестироваться отдельно, вне области большого приложения, является одной из важнейших возможностей объектно-ориентированной разработки.

Фаза разработки управления процессом использует нисходящую разработку путем создания главной программы и подпрограмм для управления взаимодействием между объектами. Главная программа и подпрограммы образуют каркас разработки (design framework).

Главный управляющий модуль соответствует главной функции в программе C++ и отвечает за поток данных программы. При нисходящей программной разработке система делится на последовательность действий, которые выполняются как независимые подпрограммы. Главная программа и ее подпрограммы организуются в нисходящую иерархию модулей, называемую структурным деревом (structure tree). Главный модуль является корнем этого дерева. Каждый модуль заключается в прямоугольник, а каждый класс, который используется модулем, заключается в овал. Мы представляем каждый модуль, указывая имя функции, входные и выходные параметры и краткое описание ее действия.

 

1.6.3. Кодирование

В фазе кодирования пишутся главная программа и подпрограммы, реализующие каркас программной разработки.

1.6.4. Тестирование

Реализация и тестирование объектов выполняются в течение фазы объектной разработки. Это позволяет нам сосредоточить внимание на разработке управляющего модуля. Мы можем проверять кодирование программы, тестируя взаимодействие каждого объекта с управляющими модулями в каркасе разработки.

1.6.5. Иллюстрация программной разработки: Dice график

Разработку и реализацию объектно-ориентированной программы иллюстрирует использование графика для записи частоты результатов бросания при игре в кости. В последующих разделах описывается каждая фаза в жизненном цикле программы.

Анализ задачи. Предположим, событие – это бросание двух костей. Для каждого бросания сумма лежит в диапазоне от 2 до 12. Используя повторное бросание костей, мы определяем эмпирическую вероятность того, что сумма равна 2, 3 ... , 11 или 12, и строим диаграмму, которая отражает вероятность каждого возможного результата.

Замечание

Эмпирическая вероятность определяется моделированием большого количества событий и записью результатов. Отношение количества появлений некоторого события к количеству всех моделируемых событий представляет эмпирическую вероятность того, рассматриваемое событие произойдет. Например, если бросание костей повторится 100000 раз и сумма 4 возникнет 10000 раз, то эмпирическая вероятность этой суммы равна 0,10.

Прежде всего следует ясно определить задачу. Этот процесс включает понимание входа, выхода и промежуточных вычислений. В фазе анализа задачи клиент формирует серию требований к системе. Они включают контроль за вводом данных, указание вычислений и используемых формул и описание желаемого выхода.

Определение программы. Программа запрашивает пользователя ввести число N – количество бросаний двух костей. Поскольку бросание костей имеет случайный результат, используем для моделирования N бросаний случайные числа. Программа ведет запись количества появлений каждой возможной суммы S (2 < S < 12). Эмпирическая вероятность определяется делением количества результатов S на N. Что касается выхода, это дробное значение используется для определения высоты прямоугольника на нашей диаграмме. Результаты выводятся на экран как столбцовая диаграмма.

Объектная разработка. Программа использует класс Line для создания осей координат и класс Rectangle – для построения столбцов. Эти классы вводятся в разделе 1.4 Разработка объектов. Бросание костей – это метод в классе Dice, который обрабатывает две кости. Далее следует объявление класса Dice. Его реализация и тестирование приводятся в программе вместе с реализацией и тестированием классов Line и Rectangle.

#include random.h

class Dice

private:

// данные-члены

int diceTotal; // сумма д вух костей

int diceList[2]; // список очков двух костей

// класс генератора случайных чисел, используемый для

// моделирования бросаний

RandomNumber rnd;

public:

// конструктор

Dice(void);

// методы

void Toss(void);

int Total(void) const;

void DisplayToss(void) const;

};

Разработка управления процессом. Для построения диаграммы бросания костей главный модуль вызывает три подпрограммы, которые выполняют основные действия программы. Функция SimulateDieToss использует методы из класса Dice для бросания костей N раз. Draw Axes вызывает метод Draw в классе Line для рисования осей координат графика, a Plot рисует серию прямоугольников, которые образуют столбцовую диаграмму. Функция Plot вызывает Мах для определения максимального количества появлений любой возможной суммы. Это значение позволяет нам вычислить относительную высоту каждого прямоугольника диаграммы. Структурное дерево этой программы показано на рис. 1.8. Далее следуют объявления для каждого управляющего модуля в структурном дереве.

 

 

 


 

 

Рис. 1.8. Древовидная структура программы Dice Graph

 

main

Передаваемые параметры: Нет

Выполнение:

Запросить у пользователя количество бросаний костей в моделировании. Вызвать функцию SimulateDieToss для выполнения бросаний и записать количество раз, когда возникает каждая возможная сумма: (2 < Total <. 12). Нарисовать оси координат функцией DrawAxes и создать столбцовую диаграмму функцией Plot.

Возвращаемые параметры: Нет

SimulateDieToss

Передаваемые параметры:

tossTotal Массив tossTotal содержит количество появлений каждой суммы в диапазоне от 2 до 12. tossTotal [i] – это количество появлений суммы i при бросании костей tossCount раз.

tossCount Количество бросаний N при моделировании.

Выполнение:

Создать объект Dice и использовать его для бросания костей указанное количество раз, записывая в массив tossTotal количество раз, когда возникает сумма 2, количество раз, когда возникает сумма 3, . . . , количество раз, когда возникает сумма 12.

Возвращаемые параметры:

Массив tossTotal с количеством раз, когда возникает каждая сумма.

DrawAxes

Передаваемые параметры:

Нет Выполнение:

Создать два объекта Line: один – для вертикальной оси (оси у) и один – для горизонтальной оси (оси х). Ось у – это линия от (1.0, 3.25) до (1.0, 0.25) . Ось х – это линия от (0.75, 3.0) до (7.0, 3.0) . Вертикальный диапазон графика равен 2,75.

Возвращаемые параметры: Нет

Передаваемые параметры:

а Массив, содержащий длинные значения данных,

n Количество значений данных в а.

Выполнение:

Найти максимальное значение элементов в массиве а.

Возвращаемый параметр:

Максимальное значение в массиве.

Plot

Передаваемый параметр:

tossTotal Массив, содержащий количество появлений каждой возможной суммы, вычисленной в SimulateDieToss.

Выполнение:

Поиск максимальной суммы (maxTotal) в массиве tossTotal для диапазона индекса 2-12. Затем каждый элемент в массиве генерирует соответствующую часть (tossTotal [i]/ maxTotal) вертикального диапазона графика. Разделить 6-дюймовый интервал оси х от (1.0, 3.0) до (7.0, 3.0) на 23 равных сегмента и построить соответствующие прямоугольники, чьи высоты – это функция (tossTotal [i]) / maxTotal*2.75, 2 < i < 12.

Возвращаемые параметры: Нет


Дата добавления: 2018-10-25; просмотров: 212; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!