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确切地说:“[我的建议是]不要使用公共变量”: