方法描述性名称直接进行简单的比较或比较?

时间:2016-08-24 09:07:43

标签: java coding-style

有时比较非常简单,equals,compareTo,......作为下一个:

//Status is a String, and 
if(status.equals(StatusEnum.ACTIVE.value()) && dateRegister.isAfter(LocalDate.now)){
    //do something
} else {
   //do something
}

但我更喜欢创建一个具有更具描述性名称的方法,尽管我只使用过一次:

private boolean isActive(String status){
   return status.equals(StatusEnum.ACTIVE.value()) && dateRegister.isAfter(LocalDate.now);
}

然后:

if(isActive(status)){
    //do something
} else {
   //do something
}

为这种简单的比较创建方法是一个好主意还是实践?

有时我觉得我创造了很多提高可读性的方法,而且有些人不喜欢太多......

3 个答案:

答案 0 :(得分:1)

当然,你在这里提出的是更好的风格。您正在练习的是清洁代码的一个重要方面。这实际上是一种很棒的做法。

背后的推理:你的大脑会自动花时间在"创造背景"。这意味着:当您查看源代码时,您会立即开始寻找帮助您了解正在发生的事情的边界。

从这个意义上说,这种检查的一个小辅助方法(有一个好名字!)可以让你的大脑几乎立即掌握正在发生的事情。

不习惯这种风格的人最初经常拒绝它。但问题是:当你要求他们阅读这些代码时,他们通常会发现容易来阅读;虽然他们练习的风格不同。他们不喜欢他们看到的东西,但是阅读它们没有问题!

将其与反向实验进行比较:当您开始阅读时,他们的"代码,在他们的风格...你很快发现他们的代码更难阅读。其他人也是如此。因为你的大脑必须处理“减少”#34;输入。情况变得更糟:当人们习惯于读/写其他不太可读的风格时...经常发生的事情是他们训练他们的大脑忽略这样的结构。换句话说:他们接受“糟糕的风格”#34; ...因为他们受过训练而看起来不太紧密。说真的,还有什么比这更糟糕的?

是的,最后你甚至可能会有一些"更多"代码阅读;但它结构如此精美的事实仍然意味着:最终的努力减少了。

当然,这里的副作用是:如果你不将这些代码放入实用程序方法中,那么人们就会开始使用copy& paste。因为您可能需要在多个地方进行此项检查。这就是真正的痛苦开始的地方。代码重复永远不是一个好主意;如果可以通过创建更易于阅读的代码来避免......那么这就是完全可行的方法。

答案 1 :(得分:1)

是的,这是非常好的做法!

您正在做的事情称为抽象。你转向低级别的东西

status.equals(StatusEnum.ACTIVE.value() && 
    dateRegister.isAfter(LocalDate.now)

更高级别的东西:

isActive(status)

如果我不太了解您的代码,如果我阅读您的第一段代码,我可能会感到困惑。我会像

  

呃......这段代码在做什么?为什么要检查所有这些东西?

如果我读了你的第二段代码,我就知道你正在检查状态是否有效,更重要的是,我不想知道的低级别是否被隐藏我

另一个优点是您输入的代码更少。当你提取某个方法作为一种方法时,下次你想要这样做"某些东西",只需调用该方法而不是复制那段代码!

但是,这样做时要小心。一定要抽象地命名方法,但不要过于抽象,或过于具体。所以这些名字并没有那么好用:

  

parameterIsEqualToActiveAndDateRegisterIsAfterToday

     

checkStuff

答案 2 :(得分:0)

它不是简单或复杂。如果有人查看您的代码,那么他将无法理解if语句正在检查什么,但是当您将其放入函数并给出适当的名称时,任何人都可以轻松识别if语句是否正在检查状态是否处于活动状态。创建函数使代码简单,清晰和易懂。