我需要得出7个潜在投入的重要价值.鲍勃叔叔敦促我避免使用那么多参数的函数,所以我已经提取了这个类.所有参数现在都是属性,我留下了一个没有参数的计算方法.
我认为"那个"可能是一个财产,但我不确定这是否是惯用的C#.
我应该将最终结果作为属性公开,还是作为没有参数的方法公开?一般的C#程序员会发现令人困惑或令人反感的属性吗?那么Alt.Net的人群呢?
decimal consumption = calculator.GetConsumption(); // obviously derived
decimal consumption = calculator.Consumption; // not so obvious
Run Code Online (Sandbox Code Playgroud)
如果是后者:我应该将中间结果声明为[私有]属性吗?由于重法提取,我有几个中期结果.其中许多不应该是公共API的一部分.但是,其中一些可能很有趣,如果我可以将它们作为属性访问,我的表达式看起来会更清晰:
decimal interim2 = this.ImportantInterimValue * otherval;
Run Code Online (Sandbox Code Playgroud)
快乐实验部:
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
我或许应该解释一下,我已经用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...")
Run Code Online (Sandbox Code Playgroud)
这里的重要问题似乎是:
从长远来看,哪一个为您生成更易读,可维护的代码?
在我个人看来,将单个计算隔离为属性与单个单一哥特式方法调用相比具有几个明显的优势:
你可以看到的计算,因为他们在调试器正在执行,而不管类方法你是的,这是一个福音生产力,而你正在调试的类.
如果计算是离散的,那么属性将很快执行,这意味着(在我看来),他们遵守财产设计的规则.认为设计指南应该被视为一件紧身衣是荒谬的.记住:没有银弹.
如果计算被标记为私有或内部,则它们不会给类的消费者增加不必要的复杂性.
如果所有属性都足够离散,编译器内联可能会解决您的性能问题.
最后,如果返回最终计算的最终方法更容易维护和理解,因为您可以阅读它,这本身就是一个完全令人信服的论点.
你可以做的最好的事情之一就是自己思考,敢于挑战先入为主的同等规模的所有概念.每条规则都有例外.这种情况很可能就是其中之一.
后记: 我认为在绝大多数情况下我们不应该放弃标准的财产设计.但有些情况下需要偏离The Standard(TM),因为这样做是有意义的.