- •Содержательная (исходная) постановка задачи.
- •Объектно-ориентированная модель задачи
- •Структура модели на языке uml
- •Контракты классов.
- •Проектирование конструкторов и деструкторов классов.
- •Разработка методики тестирования классов и тестовых наборов данных.
- •Сценарий диалога с пользователем
- •Количественные характеристики программы
- •Текст программы (новых файлов)
-
Проектирование конструкторов и деструкторов классов.
Конструкторы и деструкторы обеспечивают учет количества существующих в данный момент объектов класса. Конструкторы при создании присваивают каждому объекту уникальный ID.
Конструкторы и деструкторы «говорящие». При создании и уничтожении объектов выводятся не только названия классов, но и значения проблемных данных и ID объектов.
-
Разработка методики тестирования классов и тестовых наборов данных.
Для проверки работоспособности всех возможных ветвей разработанной программы достаточно одного теста:
-
Выводы
Созданные классы точно соответствуют заданию и спецификации и корректно выполняют все поставленные задачи. Тестирующая программа полностью работоспособна и позволяет проверить все возможности разработанных классов.
Достоинство программы:
-
Решает поставленную задачу
-
Корректно работает на всех предложенных контрольных примерах
-
Имеет удобный интерфейс.
-
Говорящие конструкторы и деструкторы
Недостатков в программе не обнаружено.
-
Сценарий диалога с пользователем
Структура основного меню:
=======[Команды управления сообщениями]=======
Добавить новую актрису(клиент)
Зарегистрироват актрису на сервере
Показать всех актрис
Сказать одной из актрис передвинуться
Сказать всем актрисам передвинуться
=======[Остальные команды (старые)]===========\n");
Вывести параметры вида из ложи
Переместить вид из ложи
Переместить вид из ложи и актрис
Показать вид из ложи
Выйти из программы
Меню выводится циклически, т.е. появляется после выполнения каждой операции.
-
Количественные характеристики программы
Общая длина текста программы (в строках): 1901. Из них:
Количество строк новых классов: 182
Количество строк тестирующей программы: 115
Общее количество классов, используемых в программе: 17
Количество новых (разработанных при выполнении работы) классов: 2
Общее количество заголовочных файлов: 17
Общее количество файлов-кодов: 18
Всего файлов: 35
Перечень имен новых классов:
|
Имя класса |
Длина текста (в строках) описания класса |
Общее количество функций класса, описанных вне класса |
|
CServerView |
31 |
10 |
|
CClientActr |
28 |
7 |
-
Текст программы (новых файлов)
//Файл: Main.cpp
//Реализация системы обмена сообщениями
//Автор: Сергеев М.В. гр.3352
//Дата: 25.05.06, Редакция: 1.0
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include"ServerView.cpp"
void main()
{
int choice; //choice - переменная выбора пункта меню
// clrscr();
printf ("Реализация системы обмена сообщениями\n");
printf ("Автор: Сергеев М.В. гр.3352\n");
printf ("Дата: 23.04.06, Редакция: 1.0\n");
printf ("\n Создание нового вида из ложи, ансамбля актрис и сервера\n");
CServerView L;
getch();
do //цикл меню
{
// clrscr();
printf ("\n");
printf ("=======[Команды управления сообщениями]=======\n");
printf ("Добавить новую актрису(клиент)...............1\n");
printf ("Зарегистрироват актрису на сервере...........2\n");
printf ("Показать всех актрис.........................3\n");
printf ("Сказать одной из актрис передвинуться........4\n");
printf ("Сказать всем актрисам передвинуться..........5\n");
printf ("=======[Остальные команды (старые)]===========\n");
printf ("Вывести параметры вида из ложи...............6\n");
printf ("Переместить вид из ложи......................7\n");
printf ("Переместить вид из ложи и актрис.............8\n");
printf ("Показать вид из ложи.........................9\n");
printf ("Выйти из программы...........................0\n");
printf ("Ваш выбор");
scanf("%d",&choice);
printf ("\n");
switch(choice) //выбор пункта меню
{
case 1: //Добавление элемента
L.AddElem();
break;
case 2: //Регистрирование элемента
{
CServer* s = L.getPointer();
L.RegElemOnServ(s);
}
break;
case 3: //Вывод списка
L.PrintData();
break;
case 4: //Сдвиг одного элемента
{
CServer* s = L.getPointer();
L.MoveOneMsg(s);
}
break;
case 5: //Сдвиг всех элементов
{
CServer* s = L.getPointer();
L.MoveAllMsg(s);
}
break;
case 6: //Вывести параметры вида из ложи
L.PrintViewport();
break;
case 7: //Переместить вид из ложи
L.MoveViewport();
break;
case 8: //Переместить вид из ложи и актрис
L.MoveActView();
break;
case 9: //Показать вид из ложи
L.ShowScene();
break;
} //switch
} while(choice!=0);
} //main
//Файл: ServerView.h
//Класс "Вид из ложи со свойствами сервера". Прототип.
//Автор: Сергеев М.В. гр.3352
//Дата: 24.05.06, Редакция: 1.0
#include"View.cpp"
#include"Server.cpp"
class CServerView:
public CView,
public CServer
{
private:
static unsigned int countreal; // количество реально существующих объектов
static unsigned int countall; // количество созданных объктов
const unsigned int ID; //идентификатор
public:
CServerView(); //Создать
virtual void ShowScene() const; //Вывести актрис, которые находятся в области просмотра
virtual void MoveActView(); //Переместить область просмотра и актрис одновременно
virtual void MoveViewport(); //Перенести область просмотра в заданном направлении
virtual void MoveOne(); //Переместить одну из актрис
virtual void MoveAll(); //Переместить всех актрис
virtual int regCl(CClient*c); //register clients on server
virtual int resend(CMsg* m); //resend msg from registred user to registred user
virtual int resendAll(CClient* from, int comm);
virtual ~CServerView(); //Уничтожить
};
//Файл: ServerView.cpp
//Класс "Вид из ложи со свойствами сервера". Реализация.
//Автор: Сергеев М.В. гр.3352
//Дата: 24.05.06, Редакция: 1.0
#include<iostream.h>
#include<conio.h>
#include"ServerView.h"
unsigned int CServerView::countreal = 0;
unsigned int CServerView::countall = 0;
////////////////////////////////////////////////////////////////
CServerView::CServerView():ID(++countall) //Конструктор.Создать новый элемент
{
countreal++;
printf (">ID(%d)CServerView\n",ID);
}
//////////////////////////////////////////////////////////////////
CServerView::~CServerView() //Деструктор. Унчтожить элемент
{
printf (" >~ID(%d)CServerView\n",ID);
countreal--;
//getch ();
}
////////////////////////////////////////////////////////////////
void CServerView::ShowScene() const //Вывести актрис, которые находятся в области просмотра
{
CView::ShowScene();
}
////////////////////////////////////////////////////////////////
void CServerView::MoveActView() //Переместить область просмотра и актрис одновременно
{
CView::MoveActView();
}
////////////////////////////////////////////////////////////////
void CServerView::MoveViewport() //Перенести область просмотра в заданном направлении
{
CView::MoveViewport();
}
////////////////////////////////////////////////////////////////
void CServerView::MoveOne() //Переместить одну из актрис
{
CView::MoveOne();
}
////////////////////////////////////////////////////////////////
void CServerView::MoveAll() //Переместить всех актрис
{
CView::MoveAll();
}
////////////////////////////////////////////////////////////////
int CServerView::regCl(CClient*c) //register clients on server
{
return CServer::regCl(c);
}
////////////////////////////////////////////////////////////////
int CServerView::resend(CMsg* m) //resend msg from registred user to registred user
{
return CServer::resend(m);
}
////////////////////////////////////////////////////////////////
int CServerView::resendAll(CClient* from, int comm)
{
return CServer::resendAll(from, comm);
}
////////////////////////////////////////////////////////////////
//Файл: ClientActr.h
//Класс "Актриса со свойствами клиента". Прототип.
//Автор: Сергеев М.В. гр.3352
//Дата: 24.05.06, Редакция: 1.0
#include"Actress.cpp"
#include"Client.cpp"
class CClientActr:
public CActress,
public CClient
{
private:
static unsigned int countreal; // количество реально существующих объектов
static unsigned int countall; // количество созданных объктов
const unsigned int ID; //идентификатор
public:
CClientActr(); //Создать
virtual int readMsg(CMsg*m);
virtual void PrintData() const; //Вывести параметры актриссы
virtual int regOnSrv(CServer*s);//regiter on server
virtual int sendMsg(int com,CServer*s,int toID); //send msg to client #toID
virtual int sendMsgAll(int com,CServer*s); //send msg to all client througth server
virtual ~CClientActr(); //Уничтожить
};
//Файл: ClientActr.cpp
//Класс "Актриса со свойствами клиента". Реализация.
//Автор: Сергеев М.В. гр.3352
//Дата: 24.05.06, Редакция: 1.0
#include<iostream.h>
#include<conio.h>
#include"ClientActr.h"
unsigned int CClientActr::countreal = 0;
unsigned int CClientActr::countall = 0;
////////////////////////////////////////////////////////////////
CClientActr::CClientActr():ID(++countall) //Конструктор.Создать новый элемент
{
countreal++;
printf (">ID(%d)CClientActr\n",ID);
}
//////////////////////////////////////////////////////////////////
CClientActr::~CClientActr() //Деструктор. Унчтожить элемент
{
printf (" >~ID(%d)CClientActr\n",ID);
countreal--;
//getch ();
}
////////////////////////////////////////////////////////////////
int CClientActr::readMsg(CMsg*m)
{
int mes;
mes = CClient::readMsgRet(m);
CActress::MoveDX(mes);
return CClient::readMsg(m);
}
////////////////////////////////////////////////////////////////
void CClientActr::PrintData() const //Вывести параметры актриссы
{
CActress::PrintData();
}
////////////////////////////////////////////////////////////////
int CClientActr::regOnSrv(CServer*s)
{
return CClient::regOnSrv(s);
}
////////////////////////////////////////////////////////////////
int CClientActr::sendMsg(int com,CServer*s,int toID)
{
return CClient::sendMsg(com,s,toID);
}
////////////////////////////////////////////////////////////////
int CClientActr::sendMsgAll(int com,CServer*s)
{
return CClient::sendMsgAll(com,s);
}
////////////////////////////////////////////////////////////////
