为了账号安全,请及时绑定邮箱和手机立即绑定

getter和setters的设计很差吗?自相矛盾的意见

getter和setters的设计很差吗?自相矛盾的意见

慕工程0101907 2019-06-19 17:19:23
getter和setters的设计很差吗?自相矛盾的意见目前,我正在用几种不同的模式在Java中开发一个简单的游戏。我扩展了一个主游戏类,将主逻辑放在其他类中。尽管如此,主要的游戏类仍然相当庞大。在快速查看我的代码之后,大部分代码是getter和Setters(60%),而其他代码则是游戏逻辑真正需要的。一些Google搜索声称getter和Setters是邪恶的,而其他的则声称它们对于良好的OO实践和伟大的程序是必要的。那我该怎么办?应该是哪一个?我是应该为我的私有变量更改getter和Setter,还是应该继续使用它们?
查看完整描述

4 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

还有一种观点认为,大多数情况下,使用setters仍然可以通过设置毫无意义的值来破坏封装。作为一个很明显的例子,如果你在游戏中有一个得分计数器,它只会上升,而不是

// Gameprivate int score;public void setScore(int score) { this.score = score; }public int getScore() { return score; }
// Usagegame.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);

应该是

// Gameprivate int score;public int getScore() { return score; }public void addScore(int delta) { score += delta; }
// Usagegame.addScore(ENEMY_DESTROYED_SCORE);

这也许是一个简单的例子。我想说的是,讨论getter/setters与公共字段通常会掩盖更大的问题,对象以一种亲密的方式操纵彼此的内部状态,因此过于紧密地耦合在一起。

这样做的目的是让那些直接做你想做的事情的方法。一个例子就是如何设置敌人的“活着”地位。您可能会有一个setAlive(布尔活动)方法。相反,你应该:

private boolean alive = true;public boolean isAlive() { return alive; }public void kill() { alive = false; }

这样做的原因是,如果您更改的实现不再具有“活动”布尔值,而是具有“命中点”值,则可以在不破坏前面编写的两种方法的约定的情况下对其进行更改:

private int hp; // Set in constructor.public boolean isAlive() { return hp > 0; } // Same method signature.public void kill() { hp = 0; }
 // Same method signature.public void damage(int damage) { hp -= damage; }


查看完整回答
反对 回复 2019-06-19
?
12345678_0001

TA贡献1802条经验 获得超5个赞

  • 非常邪恶:公共领域。
  • 有点邪恶:getter和setter在不需要的地方。
  • 很好:getter和setter只有在它们真正需要的地方才会出现-使类型暴露“更大”的行为,而这种行为发生在

    使用

    它的状态,而不仅仅是将类型视为要被其他类型操作的状态存储库。

这真的取决于情况-有时候你真的只是想要一个愚蠢的数据对象。


查看完整回答
反对 回复 2019-06-19
  • 4 回答
  • 0 关注
  • 591 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信