Прошу оценить реализацию шаблона "Состояние"
Передо мной стоит учебная задача применить шаблон State для отчётов в моём групповом проекте.
Для отчёта определено три состояния: создан, утверждён и отправлен. Отчёт может изменяться в состояниях по следующей схеме: создан <-> утверждён -> отправлен.
Проблема заключается в комментариях моего преподавателя к этому решению. Он утверждает, что количество методов в каждом классе избыточно и что можно обойтись одним методом в каждом. Я считаю, что текущее решение является классическим вариантом, и я не понимаю в чём заключается проблема, поэтому решил вынести этот вопрос сюда. Пожалуйста, дайте ваши комментарии по поводу этого решения и возможные пути его улучшения.
Интерфейс состояния и классы состояний
public interface IReportState
{
DateTime Date { get; set; }
User Changer { get; set; }
string Name { get; }
void Approve(Report report, DateTime date, User user);
void Send(Report report, DateTime date, User user);
void Cancel(Report report, DateTime date, User user);
}
public class CreatedState : IReportState
{
...
public void Approve(Report report, DateTime date, User user) =>
report.State = new ApprovedState(date, user);
public void Cancel(Report report, DateTime date, User user) =>
throw new IncorrectChangeReportStateException("You cannot cancel not approved report!");
public void Send(Report report, DateTime date, User user) =>
throw new IncorrectChangeReportStateException("You cannot send not approved report!");
}
public class ApprovedState : IReportState
{
...
public void Approve(Report report, DateTime date, User user)
{
return;
}
public void Cancel(Report report, DateTime date, User user) =>
report.State = new CreatedState(date, user);
public void Send(Report report, DateTime date, User user) =>
report.State = new SentState(date, user);
}
public class SentState : IReportState
{
...
public void Approve(Report report, DateTime date, User user) =>
throw new IncorrectChangeReportStateException("This report has been sent already!");
public void Cancel(Report report, DateTime date, User user) =>
throw new IncorrectChangeReportStateException("This report has been sent already!");
public void Send(Report report, DateTime date, User user)
{
return;
}
}
Класс отчёта
public class Report
{
IReportState State { get; set; }
...
public void Approve(DateTime date, User user) =>
State.Approve(this, date, user);
public void Send(DateTime date, User user) =>
State.Send(this, date, user);
public void Cancel(DateTime date, User user) =>
State.Cancel(this, date, user);
}