#oop #refactoring
#ооп #рефакторинг
Вопрос:
Пытаюсь разбить большой совокупный корень и просто хочу получить помощь, чтобы убедиться, что я делаю это правильно
Рассмотрим следующую совокупную корневую «команду», которая выглядит следующим образом
public class Team : IAggregateRoot
{
public List<Player> Players {get; set;}
// Lots of other properties
public void AddPlayer(Player player){}
public void RemovePlayer(string playerId){}
public void MakePlayerCaptain(string playerId){}
// More Methods
}
Итак, чтобы разбить это и уменьшить класс Team, я создаю новый класс под названием Roster
public class Roster
{
public List<Player> Players {get; set;}
public void AddPlayer(Player player){}
public void RemovePlayer(string playerId){}
public void MakePlayerCaptain(string playerId){}
}
И команда теперь становится
public class Team : IAggregateRoot
{
public Roster Roster {get; set;}
// Lots of other properties
// More Methods
}
что делает команду меньше и дает мне более сплоченные модели.
Но это заставляет меня заглядывать в корень team aggregate, чтобы получить доступ к реестру и внести изменения. то есть
team.Roster.MakePlayerCaptain()
Или я бы просто добавил методы обратно в team, а затем они вызвали объект реестра? Но затем я возвращаюсь к тому, что в моем командном объекте много методов (но, я думаю, меньше).
Какой самый чистый подход можно использовать для такого рода вещей или кто-нибудь может связать меня с каким-нибудь чтением по этому поводу?
Ответ №1:
Я не эксперт, но я думаю, что лучшее, что можно сделать с точки зрения защитного программирования, — это иметь в Team метод, который вызывает реестр… Реестр может быть даже подклассом Team, если у вас есть ДЕЙСТВИТЕЛЬНО защитное программирование.
Класс команды:
public class Team : IAggregateRoot
{
private Roster roster {get; set;} // Now private
public void AddPlayer(Player player){roster.AddPlayer(player)} // call roster.AddPlayer() and do other stuff if you need to
public void RemovePlayer(string playerId){roster.removePlayer(playerId)} // call roster.RemovePlayer() and do other stuff if you need to
public void MakePlayerCaptain(string playerId){roster.MakePlayerCaptain(playerId)} // call roster.MakePlayerCaptain() and do other stuff if you need to
private class Roster // Now a subclass of Team for defensive programming, assuming it will not be used outside of Team class
{
public List<Player> Players {get; set;}
public void AddPlayer(Player player){}
public void RemovePlayer(string playerId){}
public void MakePlayerCaptain(string playerId){}
}
}