公共变量是否比使用getter和setter更快?

正在下雨的计算机

我正在为自己制作的游戏编写自定义物理引擎,我的物理对象类具有大量变量(距离,速度,加速度,质量,重力,力,脉冲持续时间等。)。为每个变量创建setter和getter函数会影响性能吗?(在给定的时间至少有100个此类的实例)

还应该创建setter和getter吗?我听说公共变量确实是不好的做法,但是有很多变量,这是一个例外吗?

乌地那汀

为每个变量创建setter和getter函数会影响性能吗?(在给定的时间至少有100个此类的实例)

可能没有。从理论上讲是可以的,但是实际上,调用额外函数以获得特定值的成本可以忽略不计。影响性能的唯一方法是,如果您始终不停地调用这些方法(例如,每秒5万次)。

还应该创建setter和getter吗?

可能没有。好的OO设计遵循名为“告诉,不要问”的准则。通常,您应该查看需要这些变量的操作,然后在类中实现这些操作,或者在具有访问权限的类中实现它们,或者使用其他模型(想到的是访客模式)。

我听说公共变量确实是不好的做法,但是有很多变量,这是一个例外吗?

拥有公共变量并不是一个坏习惯。当您对变量具有不变性时,使用公共变量是一种不好的做法。

例如,如果您有一个变量来测量物体的重量,则将要确保不能将其设置为无效值(例如负值或大得可笑的值)。如果将变量设为公共变量,则要么必须检查在客户端代码中对其进行修改的任何地方设置的值,要么放弃验证该值。

两者都是不好的,因为如果您有一个合适的设置者并带有验证,那么它们是不可能存在的错误。

简而言之,只有在您没有固定变量的情况下,才可以使用公共变量。

注意事项:

  • 使用公共变量,如果可以随时设置变量类型允许的任何值(您没有固定变量)

  • 如果您有不变式,请使用私有变量。

  • 使用公共方法定义操作,而不是“访问内部变量”。

  • 根据从客户端代码看时要执行操作而不是内部实现中存在变量设计公共API

在这种情况下,getter和setter有时(很少)有意义,但这不是因为您在类中具有变量。

  • getter和setter方法是尝试在错误的地方解决问题的症状:如果类A中有一个操作X使用了类B中的变量,那么您可能应该在类B中定义操作X,然后从类A中进行调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用调用自定义getter / setter的公共变量/成员

当谈到 Kotlin 中的封装时,大多数变量是否可以像 Java 那样是公共的,因为它具有 getter 和 setter 属性?

具有一个公共变量的getter和setter的问题

在HTML(角度组件)上使用setter和getter变量

使用Lombok @Getter和@Setter维护变量的命名标准

使用__call()而不是getter和setter方法是否正确?

下课是否需要使用getter和setter方法?

我是否理解未正确使用getter和setter

MS Excel VBA:在子之间使用公共变量或传递变量是否更快?

C#-在引用类型上使用私有setter和公共getter

使用@property与getter和setter

Java:Getter和Setter比直接访问更快?

对象变量vs setter和getter

Getter-Setter和私有变量

具有公共getter和private setter的Python属性

JavaScript中是否需要`getter`和`setter`?

在循环中使用 getter setter 变量

是否可以使用Mockito和Powermock对具有setter和getter方法的单元进行测试

在公共实例上使用 getter 和 setter 来设置该类的私有实例时,会设置哪个类实例的属性?

您只能同时使用setter和getter的计算变量来覆盖超类的存储属性

使用getter和setter而不是私有变量将Typescript类转换为字符串

如何在Android中使用setter和getter存储全局变量?

在 Dart 中使用 setter 和 getter 记录变量的约定是什么?

使用Eclipse的布尔型Getter和Setter

使用getter / setter进行memset和struct

快速正确使用getter和setter方法

在C#中使用getter和setter

在 main 方法中使用 getter 和 setter

是否所有课程都需要具有getter和setter方法?是否有某些类可能不一定需要使用getter或setter?