Заполнение объекта может быть реализовано в несколько способов. Один из них - это использование конструкторов или Helper методов. Но проблема в том, что таких методов может быть много, а также количество и тип входных параметров может меняться, что вызывает трудности при чтении.
// Можно использовать конструкторы
Event event = new Event(EventType.Conference);
// Использование Helper методов, которые немного упрощают чтение, но не всегда нуждаются во всех параметрах
Event bigConference = Conference("Global AQA meetup", 500, Type.Public);
Event dailyMeeting = Meeting("Daily standup", 10, Regular);
Event discussion = Meeting("Strategy", 3, null);
// Использование боллее специфических методов
Event syncup = WeeklyMeeting("QA syncup", 5);
Решением является использование Builder классов, которые возвращают объект этого же класса с частично заполненными данными.
Event bigConference = EventBuilder
.Conference()
.WithName("Global AQA meetup")
.WithType(Type.Public)
.WithCapacity(500)
.Build();
Реализация такого класса будет выглядеть так
class EventBuilder
{
Event event;
private EventBuilder(EventType type)
{
event = new Event(type);
}
public static EventBuilder Conference()
{
return new EventBuilder(EventType.Conference);
}
public EventBuilder WithName(string name)
{
event.Name = name;
return this;
}
public EventBuilder WithAccess(Access access)
{
event.Access = access;
return this;
}
public EventBuilder WithCapacity(int capacity)
{
event.Capacity = capacity;
return this;
}
public Event Build()
{
return event;
}
}
Также в методе Build можно выполнять преобразования или проверку обязательных полей, если в этом есть необходимость.
Comments