代码之家  ›  专栏  ›  技术社区  ›  Extrakun

类方法实现:它应该更改类的成员变量还是接受参数?[关闭]

  •  1
  • Extrakun  · 技术社区  · 14 年前

    我想我会尝试通过两个代码片段来解释我的问题:

    // snippet 1
    class FooBar
    {
       private int value;
    
       public int DetermineSomeResult()
       {
           PerformSomeCalculationOnValue();
           PerformSomeMoreStuffOnValue();
    
           return value;
       }
    
       public int GetCachedValue()
        {
           return value;
        }
    }
    

    第一个实现基本上具有对私有整数成员进行操作的方法。

    这是第二个实现

    // snippet 2
    class FooBar2
    {
        private int value;
    
        public int DetermineSomeResult()
        {
           int tempvalue =GetCachedValue();
           tempvalue =  PerformSomeCalculationOnValue(tempvalue);
           tempvalue = PeformMoreStuffOnValue(tempvalue);
    
           SetValue(tempvalue);
           return tempvalue;
        }
    
        public int GetCachedValue()
        {
           return value;
        }
    }
    

    对于第二个实现,在完成所有计算之前,不会对内部状态进行任何更改。设计方面,哪一个更好?

    我倾向于选择第二个,因为它更清楚,显示了相关性。然而,由于类本身已经存储了一个用于计算值的类成员,所以不使用它似乎很愚蠢。

    有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   ChrisBD    14 年前

    通过使用采用参数的内部方法,而不是将类成员变量视为该类的全局方法,不仅可以更容易地对这些函数进行单元测试,而且还可以减少由于该成员变量被无序更改而引入错误的可能性,特别是当类具有任何事件或工作线程DRIV时。行为。

    所以我选择第二个例子,而不是第一个。

    编辑 另外,如果您的编程语言支持它们,您可以为这些函数使用指向给定变量类型的指针,以便它们成为(在C样式的psuedo代码中):

    DoSomeWorkOn(pointerto int);
    

    而不是

    int newValue = DoSomeWorkOn(int oldValue);
    
        2
  •  1
  •   Arseny    14 年前

    我认为你面临的设计问题 Command and state separation

    简而言之,我建议DetermineSomeResult()只计算字段“value”的新值而不返回它,获得“value”的唯一方法是通过getCachedValue()。

    public void DetermineSomeResult()
    {
       PerformSomeCalculationOnValue();
       PerformSomeMoreStuffOnValue();
       // consider "value" has already been set.
    }
    
    public int GetCachedValue()
    {
       return value;
    }
    
        3
  •  1
  •   Chetan    14 年前

    只要给出上面的代码,两个都可以。

    然而,这里有一个微妙的问题,我想谈谈。在第一种情况下,您的内部状态可能处于不一致状态。如果PerformosMemoryStuffonValue方法在设置值的最终状态之前引发异常,则可能发生这种情况。第二种解决方案不会在不相容状态下离开,不考虑可能发挥作用的其他因素)。