Object 从属性计算对象状态更好还是从属性计算对象状态更好?

Object 从属性计算对象状态更好还是从属性计算对象状态更好?,object,Object,对于任意业务对象,从属性计算状态更好吗,反之亦然 例如,如果我有一个TrafficLight,其属性为Red、Yellow和Green,是否认为创建一个函数SetState(state)可以根据需要切换灯光,还是单独切换灯光并让GetState()返回计算的状态更好 这仅仅是一个偏好的问题,还是有一些特定的情况对其中一个更有效 更新: 到目前为止的答案/评论让我意识到,我真正想要的是将当前状态存储为单个属性还是组合状态。交通灯状态最好保存为红色=关闭,黄色=关闭,绿色=打开或状态=进入 在读取值

对于任意业务对象,从属性计算状态更好吗,反之亦然

例如,如果我有一个
TrafficLight
,其属性为
Red
Yellow
Green
,是否认为创建一个函数
SetState(state)
可以根据需要切换灯光,还是单独切换灯光并让
GetState()
返回计算的状态更好

这仅仅是一个偏好的问题,还是有一些特定的情况对其中一个更有效

更新:

到目前为止的答案/评论让我意识到,我真正想要的是将当前状态存储为单个属性还是组合状态。交通灯状态最好保存为
红色=关闭
黄色=关闭
绿色=打开
状态=进入


在读取值时,我可以很容易地确定其中一个,而在我的现实问题中(据我目前所知),属性组合与状态的关系=1:1。

我认为这与其说是偏好的问题,不如说是用法的问题

对于交通信号灯示例,您可能有一些内部计时器和类似的运行,它们会改变照明值。红绿灯类的用户更希望对对象的状态感兴趣,因此
GetState
方法比公共可用的
SetState
更适用

但是,在某些情况下,您更希望设置对象的状态,并且通过读取该对象的不同属性对结果非常感兴趣


所以我要说的是使用驱动了这一点。希望这有帮助

据我所知,直接属性访问通常是不受欢迎的,因为它会将这些属性暴露在对象的表面上,并创建一个半脆弱的模型。可以与TrafficLight交互的其他对象可以直接访问以修改对象的状态,如果需要修改TrafficLight内部管理该状态的方式,现在还必须修改依赖TrafficLight的任何对象,以暴露这些属性

将属性隐藏在设置和获取状态的方法后面允许某种程度的抽象。其他对象不必担心/TrafficLight如何在内部工作,它们只需要知道如何使用适当的getter/setter方法。这样可以更容易地维护TrafficLight的内部,而无需对其他对象进行更多更改

通过getter/setter方法处理它的第二个好处是,您还可以通过在set方法调用期间广播更改来创建侦听器-观察者交互。据我所知,从长远来看,它更灵活


当然,如果您的对象更“一次性”,并且需要保持非常简单(例如,为了序列化目的),那么直接公开属性可能是您的最佳选择。

我得出结论,在大多数情况下,保存数据的最佳方式是作为单个属性,但是,如果属性组合与状态的关系不是1:1,则可能需要添加表示组合状态的其他属性

对于交通灯示例,如果
SetState(go)
SetState(goFast)
都产生了
R=0
Y=0
G=1
的组合,那么如果需要存储该信息,则有必要引入类似于
GoState
的属性

我采取这种做法的原因包括:

  • 获取(和设置,如果允许)属性值的代码要简单得多
  • 通常,许多属性组合会导致相同的状态(例如:
    R=1
    Y=1
    G=0
    R=1
    Y=0
    G=1
    和其他几个状态都是
    错误
    状态)
  • 更真实,即对象的物理属性通常决定其状态,而不是相反

我同意其他答案,即访问(设置和获取)信息主要取决于使用要求。

请注意,我的现实问题目前没有任何明显的好处;然而,需求仍在不断变化,这就是我寻找最佳实践的原因。我的建议是:不要使用公共变量。如何公开实际操作(属性、getter/setter、离散操作方法)只是次要的实现细节——老实说,一个好的方法在给定的环境中“感觉正确”。@Jay确切地说:“[我的建议是]不要使用公共变量”: