代码之家  ›  专栏  ›  技术社区  ›  Natalie Perret

C中的对象健美操一级集合规则示例

  •  2
  • Natalie Perret  · 技术社区  · 6 年前

    我在玩物体健美操规则,在使用C_时,我有一些问题想知道什么时候使用一流的集合。

    我的意思是我几乎看不出什么时候应该使用它,例如,很难把这个规则应用到一个英孚上。 DbContext .

    比如说,我们设计了一个板类。

    public class Board
    {
        public IList<BoardRow> Rows { get; }
        public IList<BoardColumn> Columns { get; }
    
        public Board()
        {
            Rows = new List<BoardRow>();
            Columns = new List<BoardColumn>();
        }
    }
    

    因此,根据这条规则,我们必须将上面的代码转换为:

    // Is it really that better than just using List<BoardRow>?
    public class BoardRowCollection : IEnumerable<BoardRow>
    {
        public void Add(BoardRow row) { /*...*/ }
        public void Remove(BoardRow row) { /*...*/ }
    
        // IEnumerable<BoardRow> Impl goes here...
    }
    
    // Is it really that better than just using List<BoardColumn>?
    public class BoardColumnCollection : IEnumerable<BoardColumn>
    {
        public void Add(BoardColumn column) { /*...*/ }
        public void Remove(BoardColumn column) { /*...*/ }
    
        // IEnumerable<BoardRow> Impl goes here...
    }
    
    public class Board
    {
        public BoardRowCollection Rows { get; }
        public BoardColumnCollection Column { get; }
    
        // Rest of the impl, ctor, etc.
    }
    

    当你已经有了可以用来实现你的目标的基础类时,我真的不确定能不能理解这条规则的要点。

    也许上面的代码不是最好的,但是我想看看一个例子,它可以为这个规则的目的提供帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Roman Nime Cloud    6 年前

    背景

    假设你有课 Foo 不管出于什么原因 Rows Board .

    现在 FOO公司 需要在 . 几天后你需要上课 Buu 第8项应该在 .

    两个 FOO公司 对如何在中查找项有自己的实现 .

    // ...
    Foo foo = new Foo(board.getRows());
    Buu buu = new Buu(foo.getRows());
    
    BoardRow row5 = foo.find5thRow();
    BoardRow row8 = buu.find8thRow();
    

    只有集合本身才应该知道如何对其执行操作

    Objects Calisthenics :

    此规则的应用很简单:任何包含集合的类都不应包含其他 成员变量。每个集合都包装在自己的类中,因此现在的行为与 这个收藏有一个家。您可能会发现过滤器成为这个新类的一部分。也, 您的新类可以处理诸如将两个组连接在一起或对每个组应用规则之类的活动。 组的元素。

    如果我们要为行创建一个第一类集合,我们可以将它的一个实例传递给 Boo 并对其调用方法:

    class Foo {
        RowCollection rowCollection;
    
        // constructor and more ...
    
        public BoardRow find5thRow() {
            rowCollection.findByIndex(5);
        }
    }
    

    总结

    第一类集合应该包括创建、读取、更新、删除、筛选、合并等操作。传递一个一级集合的实例,而不是它本身的集合。其优点是,您只需将方法委托给第一个类集合,而不必编写操作的新副本。