我正在清理一个具有可设置属性的类中的一些代码,其中一个局部变量保存该值。
代码的某些部分当前在外部调用以获取值,而不是使用自己的属性,其他部分有时使用属性本身,而在其他部分使用局部变量。
在这种情况下,属性只是由创建此类对象的工厂方法设置,因此属性始终与变量相同。但是我不确定我是否应该假设我正在编写的代码中就是这种情况,因为这使得将来在 getter 方法后面添加逻辑变得更加困难。
这可能是正确的,还是我忘记了我的 OO 原则中的一些基本内容?
降低复杂性并提高可维护性。
您应该做的第一件事是减少项目存在的位置数量(您似乎正在这样做)。
接下来,您应该使用任何语言技巧来减少代码的大小。例如,在某些版本的 c# 中,您不需要声明字段来保存属性值。
完成此操作后,您可以选择任何一种方法 - 没有来自另一种的性能优化。但要保持一致。那将增加可维护性。
就我个人而言,我更喜欢尽可能使用属性。
我使用属性,但我将它们标记为的字段除外,readonly
这意味着它们仅通过对象初始化/构造函数获取其常量值。
如果将来您的应用程序的任何要求发生变化,属性对我来说更容易维护。您只需在一处添加代码。
从面向对象的角度来看,我认为有两种类型的属性。(注意:这仅适用于班级内部。班级用户不应意识到这种差异。)
有些属性实际上是包含在主类中的独立类。(“主”类是正在考虑的类,不一定是启动程序的类。)它们只能通过属性引用,即使在主类的代码中也是如此。查看它的 get 和 set 方法应该会告诉您该属性的整个故事。它们不是主要对象的组成部分,而是相关信息,如公共字段,但更安全。
另一类是主要对象的组成部分。在极端情况下,它们甚至可能没有关联的字段;调用时,getter 可能会通过涉及许多字段的计算来组装一个值。当存在单个字段时,对其进行读写的内部代码很容易发现 getter 和 setter 对其进行了太多更改。(对象可能会跟踪一个以 5 开头的值。随着时间的推移,可能会减去 10 并添加 12。此时,该值应该是 7。但是 getter 可能永远不想向外界承认其值小于比零,所以当值为 -5 时,它将返回 0。)
我会决定每一个是哪种类型的财产,然后采取一种或另一种方式。不要分裂差异。要么所有引用都应该指向属性本身,要么所有引用都应该指向它后面的一个或多个字段。(除了直接引用属性而不是在 getter 和 setter 中复制代码可能更好。不过,我对此并不满意。)
通过“外部调用”,我收集到有一个返回字段值的普通方法。这可能是有道理的。为了直观起见,属性的行为必须尽可能像公共字段,常规方法可以在其中进行更改。(考虑一个属性 DistanceInFeet 和一个方法 GetDistanceInMeters())。调用 Get 方法而不是复制其代码是有意义的。这确实意味着整体属性是第二种类型,是对象的一个组成部分。
因此,您正在清理的代码可能是正确的,面向对象 - 但我怀疑不是。