Общее задание.
Необходимо создать приложение, моделирующее поведение сотрудников в офисе.
· Реализовать систему, используя ОО язык программирования (напримерJavaили C#).
· Реализовать unit-тесты, используя любую библиотеку для модульного тестирования (например, JUnitили NUnit).
· Написать скрипт для автоматической сборки и тестирования приложения (напримерAnt илиNAnt).
Блок схема «Поведение работника»:
Блок схема «Поведение менеджера»:
Решение.
1. Проектирования иерархии классов, описывающих офис:
Офис имеет прямоугольную форму и состоит из ячеек. В каждой ячейке расположена стена или кабинет . В кабинете могут находиться «сотрудники» и «бонусы». В каждом кабинете может быть неограниченное число сотрудников и только один бонус. Бонусов и сотрудников в кабинете может не быть.
Диаграмма классов:
Пример исходного кода:
publicclassRoom : Cell
{
privatereadonlyHashSet<Employee> employees;
privateBonusbonus;
public Room(Officeoffice, uint x, uint y)
: base(office, x, y)
{
this.employees = newHashSet<Employee>();
this.bonus = null;
}
publicvoidAddEmployee(Employee employee)
{
this.employees.Add(employee);
employee.Room = this;
}
publicvoidRemoveEmployee(Employee employee)
{
this.employees.Remove(employee);
employee.Room = null;
}
publicEmployee[] Employees
{
get { returnthis.employees.ToArray(); }
}
publicBonusBonus
{
get { returnthis.bonus; }
set
{
if (this.bonus != null)
this.bonus.Room = null;
this.bonus = value;
if (this.bonus != null)
this.bonus.Room = this;
}
}
}
Проектирования иерархии классов, описывающих работников:
В офисе работают различные сотрудники: работники и менеджеры . Все сотрудники могут перемещаться из одного кабинета в другой. Все сотрудники могут получать зарплату и прогуливать работу. Кроме того рабочие могут выполнять работу, а менеджеры штрафовать работников и выплачивать им премии.
Диаграмма классов:
Пример сходного кода:
publicclassManager : Employee
{
publicconstuintWorkerAward = 100;
public Manager(string name)
: base(name)
{
this.AwardWorkerDecisionMaker = newRandomDecisionMaker(0.50);
}
publicIDecisionMakerAwardWorkerDecisionMaker { get; set; }
publicoverridevoidPerformAction()
{
List<Worker> workers = newList<Worker>();
foreach (Employeeemployeeinthis.Room.Employees)
if (employee.GetType() == typeof(Worker))
workers.Add((Worker)employee);
if (workers.Count> 0 &&this.AwardWorkerDecisionMaker.ShouldPerformAction&&this.Money>WorkerAward)
{
workers[0].GiveMoney(WorkerAward);
this.AddWorkDay();
}
elseif (this.Room.Bonus != null&&this.Room.Bonus.CanApplyToManager)
this.Room.Bonus.ApplyToManager(this);
else
this.MoveToNeighbourRoom();
}
}
Проектирования иерархии классов, описывающих бонусы:
В кабинетах располагаются бонусы 3-х видов: работа, заработная плата и прогул. Сотрудники могут взаимодействовать с бонусами.
Диаграмма классов:
Пример исходного кода:
publicclassPayment : Bonus
{
privatereadonlyuint amount;
public Payment(uint amount)
{
this.amount = amount;
}
publicoverrideboolCanApplyToWorker
{
get { returntrue; }
}
publicoverrideboolCanApplyToManager
{
get { returntrue; }
}
publicoverridevoidApplyToManager(Manager manager)
{
base.ApplyToManager(manager);
this.ApplyToEmployee(manager);
}
publicoverridevoidApplyToWorker(Worker worker)
{
base.ApplyToWorker(worker);
this.ApplyToEmployee(worker);
}
privatevoidApplyToEmployee(Employee employee)
{
employee.GiveMoney(this.amount);
}
}