ТиМП Лабораторная работа 2
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ Отчет по лабораторной работе №2
по дисциплине «Технологии и методы программирования» Вариант №6
Студент гр. 7x3-x
___________ xxxxxxxxxx
___________ yyyyyyyyyy
___________
Принял Преподаватель кафедры БИС
______ ___________ К. В. Меденцев
___________
Томск 2025
|
Оглавление |
Введение................................................................................................................... |
3 |
1 ХОД РАБОТЫ ....................................................................................................... |
4 |
Заключение .............................................................................................................. |
7 |
2
Введение
Целью работы является изучение основных паттернов проектирования и реализация их на практике согласно варианту.
Вариант №6: Телефон. Атрибуты: номер, баланс. Операции: позвонить, ответить на звонок, завершить разговор, пополнить баланс. Состояния: ожидание, звонок, разговор.
3
1 ХОД РАБОТЫ
Для выполнения лабораторной работы было необходимо выбрать паттерн проектирования, который далее должен быть реализован в программе.
Был выбран поведенческий паттерн State (состояние).
Телефон может находится в четырёх состояниях: ожидание звонка
(WaitingState), входящий вызов (IncomingCallState), разговор (InCallState).
Класс для каждого состояния наследуется от интерфейса PhoneState с
методами Call, RecieveCall, Answer, EndCall.
WaitingState:
–Call: создает вызов и переходит в InCallState;
–RecieveCall: телефон переходит в состояние IncomingCallState;
–Answer: нет входящих вызовов, появляется об этом сообщение,
перехода в новое состояние нет;
– EndCall: нет активного звонка, появляется об этом сообщение,
перехода в новое состояние нет.
IncomingCallState:
–Call: нельзя совершить вызов, появляется об этом сообщение, перехода
вновое состояние нет;
–RecieveCall: телефон уже находится в состоянии, когда есть входящий вызов, появляется об этом сообщение, перехода в новое состояние нет;
–Answer: принимается входящий вызов, переход в InCallState;
–EndCall: входящий вызов отклонен, переход в WaitingState.
InCallState:
– Call: нельзя позвонить во время звонка, появляется об этом сообщение,
перехода в новое состояние нет;
– RecieveCall: нельзя принять еще один звонок во время разговора,
появляется об этом сообщение, перехода в новое состояние нет;
– Answer: телефон уже в состоянии звонка, появляется об этом сообщение, перехода в новое состояние нет;
4
– EndCall: завершается звонок, переход в WaitingState.
Класс Phone. Поля: Number (номер телефона), Balance (баланс номера телефона), State (состояние, в котором находится телефон). Методы:
–SetPhoneNumber: изменяет номер телефон;
–SetBalance: изменяет баланс на телефоне;
–GetNumber: возвращает номер телефон;
–GetBalance: возвращает баланс на телефоне;
–Call, RecieveCall, Answer, EndCall: для каждого состояния выполняет свои процедуры, описанные выше;
–TopUpBalance: пополняет баланс на определенную сумму.
На рисунке 1.1 представлена диаграмма классов, на которой отображены все описанные выше классы.
Далее на языке программирования C# была написана программа согласно диаграмме классов, реализующую паттерн по варианту.
5
Рисунок 1.1 – Диаграмма классов
6
Заключение
В ходе выполнения лабораторной работы была достигнута поставленная
цель.
7
Приложение А
(обязательное)
Программа реализации паттерна
using System.Text.RegularExpressions;
class Phone
{
public string Number { get; set; } public decimal Balance { get; set; } public PhoneState State { get; set; }
public Phone(string number, string balance)
{
this.SetPhoneNumber(number);
this.SetBalance(balance); this.State = new WaitingState();
}
public void SetPhoneNumber(string number)
{
string pattern = @"^(\+7 |8 )?\d{3} \d{3} \d{2} \d{2}$"; try
{
if (number == null)
{
throw new ArgumentNullException();
}
else if (!Regex.IsMatch(number, pattern))
{
throw new FormatException();
}
}
catch (ArgumentNullException)
{
Console.WriteLine($"Введите номер телефона"); return;
}
catch (FormatException)
{
Console.WriteLine("Неверный формат номера телефона.\n" + "Пример: +7 000 000 00 00 или 8 000 000 00 00");
return;
}
8
catch
{
Console.WriteLine("Неизвестная ошибка"); return;
}
this.Number = number;
}
public void SetBalance(string balance)
{
string pattern = @"^\d+\,\d{2}$"; try
{
if (Regex.IsMatch(balance, pattern))
{
decimal sum = decimal.Parse(balance); if (sum <= 0)
{
throw new ArgumentOutOfRangeException();
}
}
else
{
throw new FormatException();
}
}
catch (OverflowException)
{
Console.WriteLine("Слишком большое число.\n" + "Пример: 100,99");
return;
}
catch (ArgumentNullException)
{
Console.WriteLine("Сумма баланса должна быть не пустым значением.\n" + "Пример: 100,99");
return;
}
catch (FormatException)
{
Console.WriteLine("Неверный формат баланса. После точки только 2
цифры\n" +
"Пример: 100,99");
return;
9
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("Баланс пополняется только на неотрицательную сумму"); return;
}
catch
{
Console.WriteLine("Неизвестная ошибка"); return;
}
this.Balance = decimal.Parse(balance);
}
public string GetBalance()
{
return $"Ваш баланс: {this.Balance}";
}
public string GetNumber()
{
return $"Ваш номер телефона: {this.Number}";
}
public void Call()
{
this.State.Call(this);
}
public void ReceiveCall()
{
this.State.ReceiveCall(this);
}
public void Answer()
{
this.State.Answer(this);
}
public void EndCall()
{
this.State.EndCall(this);
}
public void TopUpBalance(string deposit)
{
string pattern = @"^\d+\,\d{2}$"; try
{
if (!Regex.IsMatch(deposit, pattern))
10
