Очистка объектов меньшего размера

#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){}
    }
}