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

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

目前,我正在用几种不同的模式在Java中开发一个简单的游戏。我扩展了一个主游戏类,将主逻辑放在其他类中。尽管如此,主要的游戏类仍然相当庞大。

在快速查看我的代码之后,大部分代码是getter和Setters(60%),而其他代码则是游戏逻辑真正需要的。

一些Google搜索声称getter和Setters是邪恶的,而其他的则声称它们对于良好的OO实践和伟大的程序是必要的。

那我该怎么办?应该是哪一个?我是应该为我的私有变量更改getter和Setter,还是应该继续使用它们?


慕工程0101907
浏览 592回答 4
4回答

aluckdog

还有一种观点认为,大多数情况下,使用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; }

12345678_0001

非常邪恶:公共领域。有点邪恶:getter和setter在不需要的地方。很好:getter和setter只有在它们真正需要的地方才会出现-使类型暴露“更大”的行为,而这种行为发生在使用它的状态,而不仅仅是将类型视为要被其他类型操作的状态存储库。这真的取决于情况-有时候你真的做只是想要一个愚蠢的数据对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java