属性和方法之间的界限应该在哪里? [复制]

Posted

技术标签:

【中文标题】属性和方法之间的界限应该在哪里? [复制]【英文标题】:Where should the line between property and method be? [duplicate] 【发布时间】:2011-01-27 01:03:11 【问题描述】:

可能重复:Properties vs Methods

在许多情况下,某个东西应该是属性还是方法是显而易见的,但是有些项目可能被认为是模棱两可的。

明显的属性:

“姓名” “长度”

明显的方法:

“发送消息” “打印”

模棱两可:

“有效”/“IsValid”/“验证” “InBounds”/“IsInBounds”/“CheckBounds” “AverageChildValue”/“CalcAverageChildValue” “颜色饱和度”/“设置颜色饱和度”

我想我会倾向于使用模棱两可的方法,但有人知道有助于决定这一点的规则或约定吗?例如。所有属性都应该是 O(1) 吗?属性是否应该不能更改其他数据(ColorSaturation 可能会更改 R、G、B 值)?如果有计算或聚合,不应该是属性吗?

仅从学术角度来看,(而不是因为我认为这是一个好主意)是否有理由不为属性而疯狂,而只是在不争论的情况下对班级进行审讯,以及所有可以使用单个参数更改类并且不能失败,属性?

【问题讨论】:

社区维基?因为这似乎有点值得商榷和主观......或将其重新标记为主观......但你的问题可能最终会被关闭......?! 这是一个重复的问题,可能重复了好几次!例如:***.com/questions/601621/properties-vs-methods 即使像“长度”这样“明显”的东西也并不总是很明显!例如,确定链表的长度涉及遍历整个链表——这是一个潜在的昂贵操作。因此,您可能会选择将其设为 GetLength 方法,因为人们希望获得一个属性是便宜的。 @mjv:我几乎宁愿在看到有重复项后关闭,但在查看后我注意到重复项问题的答案都很弱。我认为这里的问题和答案更深入,因此值得保持开放。 在搜索“属性方法”时,前 100 个匹配项中不少于 12 个重复或接近重复。我在那里找到了一些非常好的和相关的答案。公平地说,在这里,这个问题还没有结束,你可能已经得到了更好的答案(但话又说回来,统计数据不好)。此外,您的问题在几个方面都比几个副本好。请尝试并记住在发布问题之前先搜索 SO,如果只是简短的话;这将提供一个直接的答案,或者让您更好地构建自己的问题。 【参考方案1】:

我个人会根据复杂性以及方法/属性的用途做出选择。如果我所做的只是设置一个值,即_name = something;,那么我将使用一个属性。即使我要做一些非常基本的计算或条件语句,我也会坚持使用属性。但是,如果某些事情需要一些严肃的工作,甚至是适度的工作,我会使用一种方法。没有什么比设置属性更让我恼火的了,突然间执行的代码比我预期的要多。

【讨论】:

【参考方案2】:

如果您可以根据已有的东西计算某些东西,请使用方法,如果您的值必须作为操作或计算其他东西的基础,那么它应该是财产。

例如,如果您想检查某些用户输入是否是最新的,并且您可以使用您独特的专利算法来做到这一点,请使用方法Validate()。如果用户只是向您发送一个表单,提交 nis 当前地址是有效的,使用属性valid。但这只是一种常见的方法,可能会根据您的实际需求而有所不同。

【讨论】:

方法和属性在内存使用或执行速度上没有区别。属性只是一对方法的语法糖(甚至只是只读或只写属性的单个方法)。您可能会考虑字段而不是属性。 你是对的,我的错。已删除。【参考方案3】:

另一个考虑因素是可绑定性。大多数框架只能绑定到属性。例如,如果您希望 IsValid 在绑定中可用(例如,作为 OK 按钮的 IsEnabled 属性的绑定源),那么它必须是属性而不是方法。

【讨论】:

【参考方案4】:

我发现了一些有趣的文字

MSDN | Properties vs Methods

编辑

上面写着:

时使用属性 成员是逻辑数据成员

使用方法

操作是一种转换,比如Object.ToString。 该操作的开销太大,以至于您想与用户沟通,让他们考虑缓存结果。 使用 get 访问器获取属性值会产生可观察到的副作用。 连续两次呼叫成员会产生不同的结果。 执行顺序很重要。请注意,类型的属性应该能够以任何顺序设置和检索。 成员是静态的,但返回一个可以更改的值。 该成员返回一个数组。返回数组的属性可能会产生很大的误导性。 通常需要返回内部数组的副本,以便用户无法更改内部状态。再加上用户可以很容易地认为它是索引属性这一事实,导致代码效率低下。

【讨论】:

【参考方案5】:

如果属性具有以下行为之一,我通常会将其转换为函数

导致副作用(除了设置支持字段) 与字段访问相比,实施成本很高 实现的复杂度高于 Log(N) 可以抛出异常

【讨论】:

@JaredPar:见***.com/questions/448575/method-or-property-in-c/… 我知道你在 SO 上回答了很多问题,但是当这种多年生植物出现时,最好限制这种噪音。我怀疑您是否适合代表,所以为什么不帮助保持整洁。谢谢。 @mjv,已经超过了当天的代表上限,所以没有代表代表:)。有趣的是我以前回答过这个问题。但话说回来,在过去的约 15 个月里,我已经给出了 3000 多个答案,而且很难将它们全部记在脑海中。这个特定的答案是 1 年前给出的。 @mjv (cont) 一般来说,虽然我不会花很多时间搜索重复项。如果我看到一个问题并确定或极有可能是一个骗子,我会费心去搜索它。否则我不会,因为我宁愿花时间帮助人们,也不愿给他们一个虚拟的问问题。同样在这种情况下,虽然该问题可能是这个问题的欺骗,但它所欺骗的问题却不是。仔细阅读原文,它询问何时不应将字段公开为属性。 @JaredPar:很抱歉在这件事上明显把你挑出来了;所有主要的(而不是像我自己那么主要的)贡献者都可能在不同的时间点对重复的答案“有罪”。顺便说一句,我没有注意到您引用的答案中的“2009”,并认为这只是几周前的事。我确实联系了你,因为我已经开始尊重你,因为你所有的准确和充分的答案,以及我的猜测,正确的,代表不是你前进的动力;-) 因此我想知道你为什么不这样做'不要太在意重复。关于这个问题... (cont) of property vs. method,这确实是一个长期存在的问题:在通过“属性方法”搜索找到的前 100 个问题中,您会发现不少于 12 个重复项或接近重复项。即使考虑到 Q 可能实际上是误报的一些情况,并且可能允许一些“近似重复”,以及更微妙的语义扭曲,有充分的证据表明,任何有思想的提问者都可以通过以下方式找到[通常]更好的答案他/她自己研究它几分钟。因此,评论部分中的一种“查看此链接”并不是一个虚拟的打击......【参考方案6】:

在决定是使用属性还是方法时,您还应该考虑方法所涉及的工作量。 IE。如果检索值相对便宜,则将其作为属性,如果成本较高,则将其作为方法。

【讨论】:

以上是关于属性和方法之间的界限应该在哪里? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中发现模型属性?

js 原型和构造方法 内容是 从别处复制来的

类和对象

元宇宙正在模糊 “虚拟” 和 “现实” 之间的界限

面向对象定义一个类

[jvm解析系列][八]方法表集合,Code属性和Exceptions属性,你的字节码存在哪里了?