Java 我是否应该使用保护条款,并尽量避免使用其他条款?

Java 我是否应该使用保护条款,并尽量避免使用其他条款?,java,if-statement,coding-style,Java,If Statement,Coding Style,我读过(例如Martin Fowler)的文章,我们应该在OOP的(简短的)方法中使用guard子句,而不是单返回。我还(从我不记得的地方)读到,如果可能的话,应该避免使用else子句 但是我的同事(我在一个只有3个人的小团队中工作)强迫我不要在一个方法中使用多个返回,并且尽可能多地使用else子句,即使else块中只有一个注释行 这使得我很难遵循他们的编码风格,因为例如,我不能在一个屏幕上查看一个方法的所有代码。当我编写代码时,我必须首先编写guard子句,然后尝试将其转换为不带多个返回的形式

我读过(例如Martin Fowler)的文章,我们应该在OOP的(简短的)方法中使用guard子句,而不是单返回。我还(从我不记得的地方)读到,如果可能的话,应该避免使用else子句

但是我的同事(我在一个只有3个人的小团队中工作)强迫我不要在一个方法中使用多个返回,并且尽可能多地使用else子句,即使else块中只有一个注释行

这使得我很难遵循他们的编码风格,因为例如,我不能在一个屏幕上查看一个方法的所有代码。当我编写代码时,我必须首先编写guard子句,然后尝试将其转换为不带多个返回的形式

我错了吗?或者我该怎么办?

让他们阅读,看看这是否会改变他们的想法。(他们的想法有历史渊源,但我站在你一边。)


编辑:以下是文章的要点。控制结构的单一出口原则是原则上采用的,而不是观测数据。但观测数据表明,允许多种方式退出控制结构,使某些问题更容易准确地解决,并且不会损害可读性。不允许它会使代码变得更难,并且更可能出现错误。这适用于各种各样的程序员,从学生到教科书作者。因此,我们应该在适当的情况下允许并使用多个出口。

这是一个有争议的纯美学问题

在C和类似的语言中,早期返回在历史上是被避免的,因为在早期返回的情况下,可能会错过通常放在函数末尾的资源清理

考虑到Java有异常和try、catch,最后,没有必要担心提前返回


就个人而言,我同意你的观点,因为我经常提前返回-这通常意味着更少的代码和更简单的代码流,更少的if/else嵌套。

我属于多次返回/返回提前阵营,我会游说其他工程师相信这一点。你可以有很好的论据,也可以引用很好的资料,但最终,你所能做的就是做你的宣传,提出妥协建议,做出决定,然后作为一个团队工作,不管怎样都会成功。(尽管不时地重温这个话题也不是不可能的。)

这实际上只是风格的问题,从总体来看,这是一个相对次要的问题。总的来说,如果你能适应任何一种风格,你就是一个更有效的开发人员。如果这真的“让遵循他们的编码风格变得很困难”,那么我建议你继续努力,因为最终,你会成为更好的工程师


有一次,我有一位工程师来找我,坚持让他按照自己的编码风格行事(我们有一套非常简单的指导原则)。他说,既定的编码风格伤害了他的眼睛,使他难以集中精力(我想他甚至可能会说“恶心”。)我告诉他,如果他要处理很多人的代码,而不仅仅是他编写的代码,反之亦然。如果他不能适应约定的工作风格,我就不能使用他,也许这种合作项目不适合他。巧合的是,从那以后,它就不再是一个问题了(尽管每次代码审查都是一场战斗)。

Guard子句是一个好主意,因为它清楚地表明当前方法对某些情况不感兴趣。当您在方法的一开始就明确它不处理某些情况(例如,当某个值小于零时),那么该方法的其余部分就是其职责的纯粹实现

guard子句有一种更强的情况,即当某些参数不可接受时(例如null),验证输入并抛出异常的语句。在这种情况下,您不希望继续执行,而是希望在方法的最开始抛出。这就是为什么guard子句是最好的解决方案,因为您不希望将异常抛出逻辑与正在实现的方法的核心混合在一起


在讨论抛出异常的保护子句时,这里有一篇文章介绍如何使用扩展方法在C#中简化它们:。尽管该方法在Java中不可用,但它在C#中很有用。

如果我的记忆正确,避免早期返回(或循环中断)的另一个原因是,从理论上证明代码是正确的更容易。(又称形式验证)+1,用于指出它是有争议的。为了可读性,我也更喜欢提前返回。我也更喜欢提前返回,只要它大致采用保护子句的形式,并且不会导致大量模糊的
return
语句。例如,打破for循环是非常好的<代码>对于(Object o:objects){if(someCondition){return o;}}}我想说它不仅仅是纯粹的美学,我认为它使我们的思维堆栈保持浅层,从而降低认知负荷。这完全是主观的,但喜欢嵌套条件的人是错误的。“我不能在一个屏幕上查看一个方法的所有代码”,你的意思是说他们把代码缩进太多,以至于它超出了屏幕的右边缘?或者如果else占用更多的空间,那么该方法比它需要的更长(更高)?B.t.w.我喜欢guard子句。“即使else块中只有一行注释”-其中一个源代码来自《代码完成》一书。不过,听起来他们似乎太武断了。那篇文章有太多东西值得一读。你能提一下基本想法吗?@HelloWorldNoMore控制结构单出口的原则是原则性的,而不是观测数据。但观测数据表明,允许多种方式退出控制结构,使某些问题更容易准确地解决,并且不会损害可读性。不允许它会使代码更难编写