Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
M_RIO2.DOC
Скачиваний:
7
Добавлен:
21.03.2015
Размер:
1.01 Mб
Скачать

2.3.3. Идентификация связей между классами и объектами

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

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

Класс TWall. Для данного класса переопределяются методы GetDistance и Show. Для обеспечения доступа к атрибуту theAngle при имитации взаимодействия шаров со стенкой вводится метод GetAngle.

Класс THole. Для данного класса переопределяются методы GetDistance и Show.

Класс TBall. Объекты подклассов данного класса взаимодействуют между собой, со стенками и лузами. При взаимодействии изменяются атрибуты, поэтому вводим операции доступа и изменения атрибутов theEnergy и theDirection, соответственно, GetEnergy, GetDirection, SetEnergy, SetDirection.

Классы TWhiteBall, TBlackBall. Поведение белых и черных шаров различается при взаимодействии с лузой, поэтому следует ввести замещающий метод HitOnHole для этих двух классов.

2.3.4. Реализация классов и объектов

Все разработанные классы и выявленные объекты должны быть включены в проект. Уточненные диаграммы классов и объектов показаны на рис. 13, 14. Для диаграммы объектов составлена диаграмма взаимодействия (рис. 15), иллюстрирующая порядок взаимодействия шара с другими объектами. На рис. 16 представлена диаграмма переходов для объекта класса TBlackBall.

Относительно универсальные классы TPoint и TFigure, могут быть использованы в любой графической программной системе. Они составят модуль Figures (рис. 17). Оставшиеся классы относятся к изучаемой предметной области и будут входить в модуль Billiard. Кроме того, для графического изображения простейших фигур необходимо использовать стандартный модуль графики Graphics. Головная программа main в данном случае является единственной и содержит инициализацию, выполнение и уничтожение единственного объекта класса TReality. Вся программная система реализуется одним процессом, поэтому нет необходимости составлять диаграмму процессов.

2.4. Программирование

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

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

Тестирование программного модуля (подпрограммы) рассмотрим на примере метода HitOnBall класса TBall. При восходящем тестировании сначала тестируются модули нижнего уровня. Модули последующих уровней тестируются в предположении, что используемые модули абсолютно надежны. В рассматриваемом случае программными модулями нижнего уровня являются методы GetDistance, GetCenter, GetDirection, SetDirection, GetEnergy, SetEnergy класса TBall. При тестировании метода класса следует иметь в виду, что кроме явно объявляемых параметров соответствующей процедуре передается указатель на объект, и поэтому поля объекта являются одновременно входными и выходными данными.

Спецификация тестируемого метода:

  • Имя: HitOnBall;

  • Назначение: изменить параметры движения двух шаров при их столкновении;

  • Аргумент: TBall *aBall (указатель на пассивный шар);

  • Квалификация: управление;

  • Расширение: добавление;

  • Действия: Если один из шаров находится в лузе, то выходные данные остаются без изменения. Если шары находятся на близком расстоянии, то каждый из сталкивающихся шаров изменяет направление таким образом, как будто он столкнулся со стенкой, расположенной посередине между направлениями их движения, при этом суммарная энергия двух шаров перераспределяется между шарами поровну.

Тесты допустимых границ входных данных (тесты 14) и функциональных границ (тесты 57) сведем в таблицу.

N

Входные данные

Выходные данные

1

Шары имеют нулевую энергию: this‑>theRadius==5; this‑>theCenter=={11,25}; this‑>theState==stOnField; this‑>theEnergy==0; this‑>theDirection==3*Pi/4; aBall‑>theRadius==5; aBall‑>theCenter=={15,25}; aBall‑>theState==stOnField; aBall‑>theEnergy==0; aBall‑>theDirection==-3*Pi/4.

Направление и энергия не изменяются: this‑>theEnergy==0; this‑>theDirection==3*Pi/4; aBall‑>theEnergy==0; aBall‑>theDirection==-3*Pi/4.

2

Шары имеют максимальную энергию: this‑>theRadius==5; this‑>theCenter=={11,25}; this‑>theState==stOnField; this‑>theEnergy==cMaxEnergy; this‑>theDirection==3*Pi/4; aBall‑>theRadius==5; aBall‑>theCenter=={15,25}; aBall‑>theState==stOnField; aBall‑>theEnergy==cMaxEnergy; aBall‑>theDirection==-3*Pi/4.

Направление и энергия изменяются: this‑>theEnergy==cMaxEnergy; this‑>theDirection==Pi/4; aBall‑>theEnergy==cMaxEnergy; aBall‑>theDirection==-Pi/4.

Продолжение

3

Первый шар находится в лузе: this‑>theRadius==5; this‑>theCenter==cLongWallCenter1; this‑>theState==stOnHole; this‑>theEnergy==cMaxEnergy/3; this‑>theDirection==3*Pi/4; aBall‑>theRadius==5; aBall‑>theCenter=={cLongWallCenter1.X, cLongWallCenter1.Y-4}; aBall‑>theState==stOnField; aBall‑>theEnergy==cMaxEnergy/5; aBall‑>theDirection==-3*Pi/4.

Направление и энергия не изменяются: this‑>theEnergy==cMaxEnergy/3; this‑>theDirection==3*Pi/4; aBall‑>theEnergy==cMaxEnergy/5; aBall‑>theDirection==-3*Pi/4.

4

Второй шар находится в лузе: this‑>theRadius==5; this‑>theCenter=={cLongWallCenter1.X, cLongWallCenter1.Y-4}; this‑>theState==stOnField; this‑>theEnergy==cMaxEnergy/5; this‑>theDirection==-3*Pi/4; aBall‑>theRadius==5; aBall‑>theCenter==cLongWallCenter1; aBall‑>theState==stOnHole; aBall‑>theEnergy==cMaxEnergy/3; aBall ‑>theDirection==3*Pi/4.

Направление и энергия не изменяются: this‑>theEnergy==cMaxEnergy/5; this‑>theDirection==-3*Pi/4; aBall‑>theEnergy==cMaxEnergy/3; aBall‑>theDirection==3*Pi/4.

5

Оба шара находятся в поле и движутся навстречу: this‑>theRadius==5; this‑>theCenter=={5,10}; this‑>theState==stOnField; this‑>theEnergy==0.1*cMaxEnergy; this‑>theDirection==Pi/4+Pi/2; aBall‑>theRadius==5; aBall‑>theCenter=={10,10}; aBall‑>theState==stOnField; aBall‑>theEnergy==0.3*cMaxEnergy; aBall‑>theDirection==Pi/4.

Направление и энергия изменяются в соответствии со спецификацией: this‑>theEnergy==0.2*cMaxEnergy; this‑>theDirection==Pi/4; aBall‑>theEnergy==0.2*cMaxEnergy; aBall‑>theDirection==Pi/4+Pi/2.

6

Оба шара находятся в поле и движутся в разные стороны: this‑>theRadius==5; this‑>theCenter=={5,10}; this‑>theState==stOnField; this‑>theEnergy==0.7*cMaxEnergy; this‑>theDirection==Pi/4;

Направление не изменяется: this‑>theDirection==Pi/4; this‑>theEnergy==0.5*cMaxEnergy; aBall‑>theDirection==Pi/4+Pi/2; aBall‑>theEnergy==0.5*cMaxEnergy.

Окончание

aBall‑>theRadius==5; aBall‑>theCenter=={10,10}; aBall‑>theState==stOnField; aBall‑>theEnergy==0.3*cMaxEnergy; aBall‑>theDirection==Pi/4+Pi/2.

Введем обозначения для ветвлений:

A: (theState==stOnField);

B: (aBall->GetDistance(GetCenter()) <= theRadius + cSmallSpace);

C: (aBall->theState==stOnField).

Построим диаграмму управления (рис.18) и, руководствуясь ею, составим матрицу учета ветвей.

Условия

1

2

3

4

5

6

A

(theState==stOnField)

T

X

X

X

X

X

F

X

B

(aBall->GetDistance(GetCenter()) <=

T

X

X

X

X

X

TheRadius+ cSmallSpace)

F

C

(aBall->theState==stOnField)

T

X

X

X

X

F

X

Из матрицы учета ветвей видно, что предусмотренные тесты не охватывают ситуацию B=F, поэтому дополнительно вводим еще тест:

7

Оба шара находятся в поле и движутся в разные стороны: this‑>theRadius==5; this‑>theCenter=={5,10}; this‑>theState==stOnField; this‑>theEnergy==cMaxEnergy/2; this‑>theDirection==Pi/4+Pi/2; aBall‑>theRadius==5; aBall‑>theCenter=={100,20}; aBall‑>theState==stOnField; aBall‑>theEnergy==cMaxEnergy/3; aBall‑>theDirection==Pi/4.

Направление и энергия не изменяются:

this‑>theEnergy==cMaxEnergy/2; this‑>theDirection==Pi/4+Pi/2; aBall‑>theEnergy==cMaxEnergy/3; aBall‑>theDirection==Pi/4.

Циклы и сложные логические условия в тестируемой процедуре отсутствуют, поэтому нет необходимости составлять соответствующие тесты. Драйвер для выполнения тестов с номерами 5, 6, 7 и результаты тестирования приводятся в приложениях 2 и 3. Отметим, что в тесте 5 несоответствие результата и ожидаемого значения обусловлено ошибкой округления. Тест 6 выявляет ошибку, вызванную тем, что в тестируемой подпрограмме направление шаров изменяется, если они расходятся. Исправление ошибки требует возврата к этапу проектирования. Аналогичная ошибка выявляется при тестировании TBall::HitOnWall.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]