【问题标题】:Clean smaller Objects清理较小的物体
【发布时间】:2023-04-02 10:40:02
【问题描述】:

试图分解一个大的聚合根,只是想要一些帮助,看看我做得是否正确

考虑以下聚合根“团队”,如下所示


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.Roster.MakePlayerCaptain()

或者我只是将方法添加回团队,然后他们调用名册对象?但后来我又回到了我的 Team 对象中有很多方法(但我猜是更小的)。

处理这种事情最干净的方法是什么,或者任何人都可以将我链接到一些关于此的阅读吗?

【问题讨论】:

    标签: oop refactoring


    【解决方案1】:

    我不是专家,但我认为就防御性编程而言,最好的办法是在 Team 中拥有一个调用 Roster 的方法……如果你有一些 Roster 甚至可以是 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){}
        }
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2012-08-15
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多