如何将类成员变量与类方法结合使用?
假设我有一个带有成员变量'someData'的类'C'。
我调用C.getData(),它不返回值,而是将数据放入C.someData。实例化'C'的类首先调用C.getData,然后通过访问成员变量C.someData来使用数据。
我在实例化'C'的类中调用C.getData(),这是一个返回数据的函数。
我自己更喜欢第二种方式。但这也取决于具体情况而且差别很小。拥有依赖于类内部状态的类方法是“不好的”吗?什么是最好的约定?
答案 0 :(得分:3)
每个人都对此持有意见,但我从经验上看到的是国家是邪恶的。当理解一个类的行为时,State会强制您考虑更多的信息,因为它的行为现在受到状态的隐式影响。避免它,因为你的表现将允许你。我强烈赞同你提到的第二种方式。第一种方式可能会导致错误和头痛。
通常,我见过的一些最糟糕的方法都有void DoSomething()
这样的签名:它不带参数,也不返回任何值。该方法的全部意义在于其副作用,如果方法名称不当,这可能不明显。
第一种方式对其他人有多明显?有一个名为getData
但实际上没有返回任何数据的东西是否有意义? getData
操纵对象的状态是否有意义?有时,是的,为了缓存而操纵对象是合理的。但是操纵对象来存储实际应该返回的值就是要求麻烦。
如果你真的觉得你必须使用第一个版本,至少称它为更精确的像void calculateValue()
甚至void calculateCachedValue()
这表明它确实不应该返回任何东西,而且它完整的目的是计算别的东西。
答案 1 :(得分:1)
C.someData应该是一个只有public get的属性。当您第一次调用C.someData时,可以将值延迟加载到someData中。
public class C
{
public C() { }
string someData = string.Empty;
public string SomeData
{
get
{
if (string.IsNullOrEmpty(someData))
this.LoadSomeData();
return someData;
}
}
private void LoadSomeData()
{
this.someData = "Hello world";
}
}