getter 和 setter 的设计是否糟糕?看到矛盾的建议[重复]

2023-12-04

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

快速浏览一下我的代码后,与游戏逻辑真正需要的其余部分相比,其中大部分是 Getters 和 Setters (60%)。

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

所以我该怎么做?应该是哪个?我应该更改私有变量的 Getter 和 Setter,还是应该坚持使用它们?


还有一种观点认为,大多数时候,使用 setter 仍然会破坏封装性,因为它允许您设置无意义的值。举一个非常明显的例子,如果游戏中的得分计数器只会上升,而不是

// Game
private int score;
public void setScore(int score) { this.score = score; }
public int getScore() { return score; }
// Usage
game.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);

它应该是

// Game
private int score;
public int getScore() { return score; }
public void addScore(int delta) { score += delta; }
// Usage
game.addScore(ENEMY_DESTROYED_SCORE);

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

这个想法是创建直接做你想做的事情的方法。一个例子是如何设置敌人的“活着”状态。您可能会想要使用 setAlive(boolean alive) 方法。相反,你应该:

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; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getter 和 setter 的设计是否糟糕?看到矛盾的建议[重复] 的相关文章

随机推荐