2010-04-20 59 views
3

an earlier question of mine部分相关,我有一个系统,我必须将复杂数据存储为一个字符串。我不是将这些字符串解析为各种单独的对象,而是创建了一个包含所有这些对象的类,并且它具有一些解析器逻辑,将所有属性编码为字符串,或者解码字符串以获取这些对象。这很好,很好。这个问题不是关于解析器本身,而是关于解析器逻辑的位置。将它作为一种财产或作为一种方法是更好的选择吗?什么时候使用方法而不是类定义的属性?

在属性的情况下,说public string DataAsString,所述get存取将容纳所述逻辑来编码的所有数据转换为字符串,而set存取将在类实例解码输入的值和设置的所有数据的。看起来很方便,因为输入/输出确实是一个字符串。

在方法的情况下,一种方法将是Encode(),它返回编码的字符串。然后,构造函数本身可以存储解码字符串的逻辑并需要字符串参数,或者我写一个Decode(string str)方法,它被单独调用。无论哪种情况,它都会使用一种方法而不是属性。

那么,有没有这些路径之间的功能差异,在代码的实际运行条件怎么样?或者它们基本上是否相同,然后归结为个人偏好选择还是哪个更好?而在那种问题中,哪一个看起来更清洁呢?

回答

12

没有功能差异;从行为角度来看,属性只是getset方法的对。

然而,性质,一般地,旨在是轻质的。如果你的财产的吸气剂或二级吸收器正在进行实质性计算,那么通常会鼓励将它们移动到一种方法。

有明显的例外(即延迟加载在ORM领域,其中get可能引发数据库调用)。

+1

我完全同意! +1 – 2010-04-20 13:22:05

1

就我个人而言,我的属性是非常愚蠢的,只在极端情况下做某些检查。即检查参数是否为空它将返回,如果是,则将其更新或抛出异常

让我们以Person类为例 Person.Name在此情况下作为属性有意义。 Person.Speak()作为一个属性没有意义。

这一切都取决于它执行的功能。

8

“名词”:该约定是属性不做实际的业务逻辑它们也没有副作用,即改变对象状态(比设定的值等)。

“动词:方法有望做的工作,并有副作用

之类的东西。‘转换’或‘分析’或‘编码’听起来像动词给我,我会用方法

2

。如果您的类将在数据绑定情况下使用,那么您需要的属性。否则,我是指你的答案。

3

从技术上讲,他们可以做同样的事情。一般来说,如果有涉及复杂的处理,我把它放在一个方法而不是一个财产。这背后的主要原因(虽然我不是说人们应该这样做),是有一个共同的看法,即属性应该允许快速访问数据,方法调用期望它可能需要几个周期完成。人们应该这样做吗?绝对不是,但他们确实如此。

我喜欢使用方法来记录与我的代码交互的人,“嘿,这是一种方法,有一些处理正在进行,所以不要以为你会得到一个直接的结果。”您也不能有异步属性访问。您可以启动一个方法,并在结果返回时收到通知。

1

另一点没有提及的是,如果一个对象上的一个或多个读写属性被写入,然后全部读回来而没有任何中介方法调用,则读取的值应与写入的值匹配。如果写属性Foo会导致读写属性Bar的值发生变化,那么在我看来,这是一个很好的信号,表示其中一个或另一个应该是一对明确的getter-setter方法,而不是属性。 .net中有许多类违反了这个原则,但我认为这种行为是sl。不驯的。也许最严重的罪犯是Control的Visible财产。编写该属性会更新其状态无法读取的字段,同时读取该属性将返回某些计算的结果。更好的设计应该是具有读写隐藏属性和只读可见字段。顺便说一句,稍微类似的说明,我会使StringBuilder的“Length”属性为只读,但有方法来截断或填充它;我唯一会拥有的读写属性就是Value。

相关问题