2010-07-21 20 views
1

我想我会尝试通过2个代码片段来解释我的问题:类方法的实现:它应该改变一个类的成员变量还是接受参数?

// 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; 
    } 
} 

对于第二个执行,没有变化的内部状态,除非所有的计算已经完成。设计明智哪一个更好?

我倾向于更喜欢第二个,因为它更清晰,显示依赖关系。然而,由于这个类本身已经存储了一个用于计算值的类成员,所以使用它似乎很愚蠢。

对此有何看法?

+0

您关心的是线程安全吗? – 2010-07-21 07:30:25

+0

不,至今。我的项目目前不涉及线程。 – Extrakun 2010-07-21 08:26:14

回答

1

通过使用有参数的内部的方法,而不是一种治疗类的成员变量如全球该类你不仅更容易进行单元测试那些功能,但也降低了引入由于该成员变量引起的错误的可能性如果这个类有任何事件或工作者线程驱动的行为,那么它们会被错误地改变。

所以我会去第二个例子而不是第一个例子。

编辑 此外,如果你的编程语言支持他们,你可以使用指针给定的变量类型为这些功能使他们成为(在C风格的伪代码):

DoSomeWorkOn(pointerto int); 

,而不是

int newValue = DoSomeWorkOn(int oldValue); 
1

我想你所面临的短描述为 Command and state separation

一个设计问题,我建议DetermineSomeResult()只应不还而只有这样,才能得到“计算领域的“价值”的新值值”是通过GetCachedValue()

public void DetermineSomeResult() 
{ 
    PerformSomeCalculationOnValue(); 
    PerformSomeMoreStuffOnValue(); 
    // consider "value" has already been set. 
} 

public int GetCachedValue() 
{ 
    return value; 
} 
1

只要给出上面的代码,两者都可以工作。

但是,这里有一个微妙的问题,我想谈谈。在第一种情况下,您的内部状态可能会处于不一致的状态。如果PerformSomeMoreStuffOnValue方法在可以设置最终状态值之前抛出异常,就会发生这种情况。第二种解决方案不考虑其他可能发挥作用的情况下不会处于静止状态)。

相关问题