清理包含if语句的函数

时间:2014-01-06 15:09:51

标签: coding-style

我希望这是一个正确的地方(如果不是请告诉我)。我正在尝试创建一个游戏,同时遵循Robert C. Martins的书“Clean Code”,以提高我的代码的可读性。然而,我对我的多少函数的工作并不完全满意,因为在执行命令之前,我经常需要检查各种变量。例如:

private void checkScoreAndIncreaseDifficulty() {
    if(eater.getScore()%400==0){
        world.increaseDifficulty();
    }

根据这本书我遵循的功能应该只做一件事,但当涉及“if”语句时,功能目的(对我来说)似乎自然会增加。上面这个函数的名称是checkScoreAndIncreaseDifficulty,这显然是两件事,但我想不出如何减少它。我觉得解决方案很简单,但它不是来找我。任何建议将不胜感激。

6 个答案:

答案 0 :(得分:1)

函数的名称应该描述函数的功能,而不是如何实现某些功能。所以命名checkScoreAndIncreaseDifficulty是错误的。它应该类似于IncreaseDifficulty。此外,如果您不认为代码元素的名称不能充分了解函数/类/变量的作用,则可以始终对代码进行注释。 :)

此外,编写条件语句的“正确”位置完全取决于您的应用程序:如果只有当用户满足某些条件时难度才会增加,那么该条件应该包含在增加难度的函数中。如果难度可能通过其他方式增加,那么该函数应该只执行增加难度的动作,并决定是否增加难度给调用者。

答案 1 :(得分:0)

我认为没有办法使这种方法更清洁。它检查得分,然后手中的增加困难到另一种方法。还有什么可以问的?

我认为尝试尽可能减少方法的风险也很大。在某些时候,您需要深入了解整个代码库中的十几种方法和函数,以便了解单个方法或函数的作用。这也不好。

就我而言,你的代码达到了最佳点。这个繁琐的名字确实是一个问题,但不是一个严肃的问题,如果你真的想要,也很容易修复。

答案 2 :(得分:0)

为什么不使用两个单独的功能(你也可以只使用第一个功能),如下所示:

 private bool isScoreEnough() {
  if(eater.getScore()%400==0)
     return true;
 }
 private void increaseDifficulty(){

    world.increaseDifficulty();
 }

并在您的计划中:

 if(isScoreEnough())
    increaseDifficulty();

答案 3 :(得分:0)

您正在设置功能中的难度级别。根据分数,您可以增加/减少难度级别。这完全没问题 - 只要该功能仅执行确定和设置难度级别的工作。函数名称有改进的余地:

private void setDifficultyLevel() {
    if (eater.getScore()%400 == 0) {
        world.increaseDifficulty();
    }
}

答案 4 :(得分:0)

显然你没有任何if语句就找不到很多代码,程序必须根据状态,输入等做出决定。避免if语句也不是" Clean Code"的关键信息。你应该避免的是例如无穷无尽的if-else结构,如果一个类完成三个逻辑情况的工作 - 那么你应该有三个类。

你的方法已经很短了,但是如果你想要应用马丁的一个原则(一个好名字备注评论等),你可以使用类似的东西:

if (scoreRequiresIncreaseInDifficulty()) {
  increaseDifficulaty();
}

然后实现这两个方法。但是,我不认为这在你的情况下是有意义的,除非你需要多次同样的电话,并且想要在分数需要在一个地方进行更难的比赛时保持变化的灵活性。

答案 5 :(得分:0)

你想要每吃掉400个得分点来增加难度,对吗?

所以,你需要食客才能订阅分数变化:

interface Eater {
 void addScoreChangedListener(ScoreChangedListener listener);
}

interface ScoreChangedListener {
 public void onScoreChanged(Score previousScore, Score newScore);
}

Eater的实现将包含所有分数更改侦听器的列表,并在分数更改时调用每个分数更改侦听器上的onScoreChanged。请参阅Observer模式。

然后开始你的游戏:

Eater eater = ....
eater.addScorechangedListener(new DifficultyAdjustScoreChangeListener());

你完成了!

DifficultyAdjustScoreChangeListener的实施需要if,但是没关系:

class DifficultyAdjustScoreChangeListener implements ScoreChangedListener {
 public void onScoreChanged(Score previousScore, Score newScore) {
  if (newScore.value() % 400 == 0) {
   world.increaseDifficulty();
  }
 }
}