首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将派生值公开为属性是很好的形式吗?

将派生值公开为属性是很好的形式吗?
EN

Stack Overflow用户
提问于 2009-07-17 01:06:11
回答 5查看 227关注 0票数 2

我需要得到一个重要的值,给出7个潜在的输入鲍勃叔叔敦促我避免使用这么多参数的函数,所以我使用了提取类。现在所有的参数都是属性,剩下的是一个没有参数的计算方法。

“那”,我想,“可能是一种财产,但我不确定这是不是惯用的C#。”

我应该将最终结果公开为属性,还是不带参数的方法?普通的C#程序员是否会觉得属性混乱或令人反感?那么Alt.Net人群呢?

代码语言:javascript
复制
decimal consumption = calculator.GetConsumption(); // obviously derived
decimal consumption = calculator.Consumption; // not so obvious

如果后者:我是否也应该将临时结果声明为私有属性?多亏了沉重的方法提取,我有了几个临时结果。其中许多不应该是公共API的一部分。不过,其中一些可能很有趣,如果我可以将它们作为属性访问,我的表达式看起来会更干净:

代码语言:javascript
复制
decimal interim2 = this.ImportantInterimValue * otherval;

快乐实验部:

在用VS2008调试代码时,我注意到我一直将鼠标悬停在计算临时结果的方法调用上,期望它们的返回值出现悬停。在将所有方法转换为属性之后,我发现将临时结果公开为属性极大地帮助了调试。对此非常满意,但对可读性有挥之不去的担忧。

临时值声明看起来比较混乱。然而,没有括号的话更容易读懂。我不再觉得必须用动词作为方法名的开头。对比:

代码语言:javascript
复制
// 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”,但是:

代码语言:javascript
复制
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...")
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-17 02:51:20

这里的重要问题似乎是:

从长远来看,哪一种代码更容易读懂,更易于维护?

在我个人看来,将单个计算作为属性进行隔离,与单一的单一方法调用相比,有几个明显的优点:

  • 您可以看到在调试器中执行的计算,而不管您所处的类方法如何。在调试类时,这是提高工作效率的利好。
  • 如果计算是离散的,则属性执行得非常快,这意味着(我认为)它们遵守了属性设计的规则。认为设计准则应该被看作是一件紧身衣是荒谬的。记住:没有银弹。
  • 如果计算标记为私有或内部,它们不会给类的使用者增加不必要的复杂性。
  • 如果所有属性都足够离散,编译器内联可能会为您解决性能问题。
  • 最后,如果返回最终计算的最终方法非常容易维护和理解,因为您可以阅读它,那么这本身就是一个非常有说服力的论点。

你能做的最好的事情之一就是为自己想一想,敢于挑战我们的同辈和前辈的所有概念。每条规则都有例外。这个案子很可能就是其中之一。

Postscript:我不认为在绝大多数情况下我们应该放弃标准的属性设计。但在有些情况下,需要偏离标准(TM),因为这样做是有意义的。

票数 5
EN

Stack Overflow用户

发布于 2009-07-17 01:10:29

就我个人而言,我更希望您将公共API作为一种方法,而不是属性。在C#中,属性应该尽可能快。有关此讨论的更多详细信息:属性与方法

在内部,GetConsumption可以使用任意数量的私有属性来获得结果,选择是您的。

票数 3
EN

Stack Overflow用户

发布于 2009-07-17 01:12:24

我通常按这个方法或属性来做什么。如果要花点时间,我会用一种方法。如果它非常快,或者有非常少量的操作在幕后进行,我将把它变成一个属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1141049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档