吸烟者和设计者的设计差?看到对立的建议

问题:

我目前正在Java中使用几种不同的模式进行简单的游戏。我扩展了一个主要的Game类,把主要的逻辑放在其他类中。尽管如此,主要的游戏类还是相当大的。
在快速浏览我的代码之后,大部分是Getters和Setters(60%),与游戏逻辑真正需要的其余部分相比。
Google搜索几项声称Getters和Setter是邪恶的,而另外一些人声称他们是良好的OO实践和伟大的计划所必需的。
所以我该怎么做?应该是哪一个?我应该改变我的Getters和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 / setters与公共领域通常掩盖更大的问题,对象以亲密的方式操纵彼此的内部状态,因此太紧密耦合。
这个想法是使方法直接做你想做的事情。一个例子是如何设置敌人的“活着”状态。您可能会试图拥有一个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; }

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Are getters and setters poor design? Contradictory advice seen

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

77 + = 80