给定 7 个潜在输入,我需要得出一个重要值。Bob 叔叔敦促我避免使用具有这么多参数的函数,所以我提取了 class。现在所有参数都是属性,我只剩下一个没有参数的计算方法。
“那个”,我认为,“可能是一个属性,但我不确定这是否是惯用的 C#。”
我应该将最终结果作为属性公开,还是作为没有参数的方法公开?一般的 C# 程序员会发现属性令人困惑或令人反感吗?Alt.Net 人群呢?
decimal consumption = calculator.GetConsumption(); // obviously derived
decimal consumption = calculator.Consumption; // not so obvious
如果是后者:我也应该将中间结果声明为 [private] properties吗?由于大量的方法提取,我有几个中期结果。其中许多不应该是公共 API 的一部分。不过,其中一些可能很有趣,如果我可以将它们作为属性访问,我的表达式会看起来更清晰:
decimal interim2 = this.ImportantInterimValue * otherval;
快乐实验部:
在 VS2008 中调试我的代码时,我注意到我一直将鼠标悬停在计算中间结果的方法调用上,期望鼠标悬停在它们的返回值上。将所有方法转换为属性后,我发现将中间结果公开为属性极大地有助于调试。我对此很满意,但对可读性仍有挥之不去的担忧。
中间值声明看起来更混乱。然而,没有括号的表达式更容易阅读。我不再觉得必须以动词开头的方法名称。对比:
// Clean method declaration; compulsive verby name; callers need
// parenthesis despite lack of any arguments.
decimal DetermineImportantInterimValue() {
return this.DetermineOtherInterimValue() * this.SomeProperty;
}
// Messier property declaration; clean name; clean access syntax
decimal ImportantInterimValue {
get {
return this.OtherInterimValue * this.SomeProperty;
}
}
我或许应该解释一下,我用 Python 编码已经有十年了。我一直倾向于花费额外的时间让我的代码更容易调用而不是编写。我不确定 Python 社区是否会将这种面向属性的风格视为可接受的“Pythonic”,但是:
def determineImportantInterimValue(self):
"The usual way of doing it."
return self.determineOtherInterimValue() * self.someAttribute
importantInterimValue = property(
lambda self => self.otherInterimValue * self.someAttribute,
doc = "I'm not sure if this is Pythonic...")