zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善C#程序的157个建议——建议24:迭代器应该是只读的

    建议24:迭代器应该是只读的

    如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性。原因有二:

    一:这违背了设计模式的开闭原则。被设置到集合中的迭代器可能会直接导致集合的行为发生异常或变动。一旦确实需要新的迭代要求,完全可以创建一个新的迭代器来满足需求,而不是为集合设置该迭代器,因为这样做会直接导致使用该集合对象的其他迭代场景发生不可知的行为。

    二:现在,我们有了LINQ。使用LINQ可以不用创建任何新的类型就能满足任何的迭代需求。

    如果迭代器可写,危害示例如下:

    假设存在一个公共集合对象,有两个业务类需要对这个集合进行操作。

    业务类A只负责将元素迭代显示到UI上:

            private IMyEnumerable list = new MyList();
            private IMyEnumerator enumerator = list.GetEnumerator();
            while(enumerator.MoveNext())
            {
                int current = enumerator.Current;
                Console.WriteLine(current.ToString());
            }

    业务类B出于自己的某种需求,要实现一个新的针对集合对象的迭代器:

            private MyEnumerator2 enumerator2 = new MyEnumerator2(list as MyList);
            (list as MyList).SetEnumerator(enumerator2);
            while(enumerator2.MoveNext())
            {
                int current = enumerator2.Current;
                Console.WriteLine(current.ToString());
            }

    现在再回到业务类A执行一次迭代,结果将会是B所设置的迭代器输出。这相当于B在没有通知A的情况下进行了干扰,这是应该避免的。

    事实上,上面的代码即使没有下面这行代码也会运行的很好:

            (list as MyList).SetEnumerator(enumerator2);

    所以,不要为迭代器设置可写属性。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    云计算在未来发展中的重要性体现在哪里?
    四大优势凸显,云计算成大势所趋
    边缘计算的今天、明天和未来
    以太坊年底前这5件大事,能否带来大惊喜?
    量子计算是什么?它到底有什么用?
    加快边缘计算发展的十大趋势
    树结构练习——排序二叉树的中序遍历
    树结构练习——排序二叉树的中序遍历
    数据结构实验之二叉树的建立与遍历
    数据结构实验之二叉树的建立与遍历
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7930024.html
Copyright © 2011-2022 走看看