我需要得到一个重要的值,给出7个潜在的输入。鲍勃叔叔敦促我避免使用这么多参数的函数,所以我使用了提取类。现在所有的参数都是属性,剩下的是一个没有参数的计算方法。
“那”,我想,“可能是一种财产,但我不确定这是不是惯用的C#。”
我应该将最终结果公开为属性,还是不带参数的方法?普通的C#程序员是否会觉得属性混乱或令人反感?那么Alt.Net人群呢?
decimal consumption = calculator.GetConsumption(); // obviously derived
decimal consumption = calculator.Consumption; // not so obvious如果后者:我是否也应该将临时结果声明为私有属性?多亏了沉重的方法提取,我有了几个临时结果。其中许多不应该是公共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...")发布于 2009-07-17 02:51:20
这里的重要问题似乎是:
从长远来看,哪一种代码更容易读懂,更易于维护?
在我个人看来,将单个计算作为属性进行隔离,与单一的单一方法调用相比,有几个明显的优点:
你能做的最好的事情之一就是为自己想一想,敢于挑战我们的同辈和前辈的所有概念。每条规则都有例外。这个案子很可能就是其中之一。
Postscript:我不认为在绝大多数情况下我们应该放弃标准的属性设计。但在有些情况下,需要偏离标准(TM),因为这样做是有意义的。
发布于 2009-07-17 01:10:29
就我个人而言,我更希望您将公共API作为一种方法,而不是属性。在C#中,属性应该尽可能快。有关此讨论的更多详细信息:属性与方法
在内部,GetConsumption可以使用任意数量的私有属性来获得结果,选择是您的。
发布于 2009-07-17 01:12:24
我通常按这个方法或属性来做什么。如果要花点时间,我会用一种方法。如果它非常快,或者有非常少量的操作在幕后进行,我将把它变成一个属性。
https://stackoverflow.com/questions/1141049
复制相似问题