Coding style 包含if语句的清理函数

Coding style 包含if语句的清理函数,coding-style,Coding Style,我希望这是一个正确的地方问(如果没有请告诉我)。我目前正在尝试创建一个游戏,同时遵循Robert C.Martins的书《干净的代码》,以提高代码的可读性。然而,我并不完全满意有多少函数可以工作,因为在执行命令之前,我经常需要检查各种变量。例如: private void checkScoreAndIncreaseDifficulty() { if(eater.getScore()%400==0){ world.increaseDifficulty(); } 根

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

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

根据这本书,我下面介绍的函数应该只做一件事,但是当涉及到“if”语句时,函数的用途(对我来说)似乎自然会增加。上述函数的名称是checkscore和increasefestion,这显然是两件事,但我想不出如何减少它。我觉得解决办法很简单,但我就是想不起来。如果您有任何建议,我们将不胜感激。

我看不到任何方法可以让这种方法比现在更干净。它检查分数,然后用另一种方法增加难度。你还能要求什么

我认为,试图使方法尽可能地最小化也有风险。在某种程度上,为了理解单个方法或函数的功能,您需要深入研究贯穿整个代码库的十几个方法和函数。那也不行


就我而言,你的代码达到了最佳状态。繁琐的名称确实是一个问题,但不是一个严重的问题,如果您真的想解决,它很容易解决。

为什么不使用两个单独的函数(您也可以只使用第一个函数)如下所示:

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

    world.increaseDifficulty();
 }
在您的程序中:

 if(isScoreEnough())
    increaseDifficulty();

您正在函数中设置难度级别。根据分数增加/减少难度等级。这很好——只要函数只负责确定和设置难度级别。函数名还有改进的余地:

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

显然,如果没有任何if语句,您将找不到多少代码,程序必须根据状态、输入或其他任何内容做出决策。避免使用if语句也不是“干净代码”的关键信息。例如,如果一个类处理三个逻辑案例,那么应该避免无止境的if-else构造—那么应该有三个类

您的方法已经很短了,但如果您想进一步应用Martin的原则之一(好名声,避免评论等),您可以使用以下方法:

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

然后实现这两种方法。但是,我认为这在您的情况下没有多大意义,除非您需要多次相同的调用,并且希望在分数需要在单个位置进行更困难的游戏时保持更改的灵活性。

函数名称应该描述函数的功能,而不是如何实现某些功能。因此,命名
检查分数和增加难度
在我看来是错误的。它应该类似于
增加难度
。此外,如果您不觉得代码元素的名称不能充分了解函数/类/变量的功能,您可以随时对代码进行注释。:)


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

你想让食客每获得400分增加难度,对吗

因此,您需要eater允许订阅分数更改:

interface Eater {
 void addScoreChangedListener(ScoreChangedListener listener);
}

interface ScoreChangedListener {
 public void onScoreChanged(Score previousScore, Score newScore);
}
Eater
的实现将保存所有分数更改侦听器的列表,并在分数更改时对每个侦听器调用
onCoreChanged
。看看这个模式

然后在引导游戏时:

Eater eater = ....
eater.addScorechangedListener(new DifficultyAdjustScoreChangeListener());
你完了

虽然
困难调整ScoreChangeListener
的实现需要有
if
,但这没关系:

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

这很复杂,没有真正正确的答案,但我对函数名的抱怨是,它告诉我函数做什么,而不是它应该做什么。这就像是一个糟糕的评论。如果没有更多的代码,就很难提供具体的建议。@Speed8ump是的,我的函数名一点也不好。更糟糕的是,这种风格在我的代码中重复出现,您是否会忽略“if”语句,并将其称为increaseDemobility()?如果我这样做,我觉得这有点误导。这是我的主要问题。我会使用像UpdateDifficity或manageDifficultyIncrease这样的名称。问问自己:你会降低难度吗?如果是这样的话,它会在同一个函数中吗?是的,我也想更改我的函数名。但是在上面的代码中,setDifficultyLevel()函数有时实际上并没有设置难度级别。我会认为这有点误导人?但是我看不出有比这更好的书写方式了。谢谢你提到了这封信的正确位置。直到现在我才想到这一点,很可能不得不修改我的代码。我也同意这个名字。