早期回报与嵌套的积极if语句

时间:2010-12-06 18:46:10

标签: coding-style

以下是一些假设的代码示例:

if (e.KeyCode == Keys.Enter)
{
    if (this.CurrentElement == null) {
        return false;}

    if (this.CurrentElement == this.MasterElement) {
        return false;}

    if (!Validator.Exist (this.CurrentElement)) {
        return false;}

    if (!Identifier.IsPictureElement (this.CurrentElement)) {
        return false;}

    this.FlattenObjects(this.CurrentElement);
}

VS

if (e.KeyCode == Keys.Enter)
{
    if (this.CurrentElement != null) {

        if (this.CurrentElement != this.MasterElement) {

            if (Validator.Exist (this.CurrentElement)) {

                if (Identifier.IsPictureElement (this.CurrentElement)) {

                    this.FlattenObjects(this.CurrentElement);}}}}}}

}

您认为哪一个在可读性,维护等方面更好?

第二个例子也可以通过不同的括号使用来进行不同的格式化。

5 个答案:

答案 0 :(得分:14)

早期回报更具可读性。

每当你在一个方法中获得超过四到五个级别的嵌套时,就该重构该方法了。

具有if子句的单个||有时可以更具可读性:

if (this.CurrentElement == null
 || this.CurrentElement == this.MasterElement
 || !Validator.Exist(this.CurrentElement)
 || !Identifier.IsPictureElement(this.CurrentElement))
    return false;

答案 1 :(得分:4)

第一个例子在各方面都更好。它更简单,更易于阅读。有人说每个功能都应该有一个回归点;这个例子清楚地表明了那些人为什么是错的。

PS我个人会删除所有那些多余的花括号:

if (this.CurrentElement == null) return false;

等。这使它更简单,甚至更容易阅读。

答案 2 :(得分:1)

我想我会这样写:

if (this.CurrentElement == null OR this.CurrentElement == this.MasterElement OR ...) return false;

答案 3 :(得分:1)

我会说第一个更好的可读性和维护性。但是,我可能会写这样的东西。

if (e.KeyCode == Keys.Enter) {
    if(this.CurrentElement == null ||
       this.CurrentElement == this.MasterElement ||
       !validator.exists(this.CurrentElement) ||
       !identifier.isPictureElement(this.CurrentElement))
    {
        return false;
    {
    else
    {
        this.flattenObjects(this.CurrentElement);
    }
}

答案 4 :(得分:1)

鉴于在第二个例子中,“false”是所有路径的返回,但是它是隐式的而不是声明为什么不只是使所有返回隐式为false并且只测试一个唯一的条件?

这可能会违反某人的风格指南,但从逻辑上来说这是最简洁的。

if( e.KeyCode == Keys.Enter 
 && this.CurrentElement != null 
 && this.CurrentElement != this.MasterElement  
 && Validator.Exist (this.CurrentElement)                     
 && Identifier.IsPictureElement (this.CurrentElement)) 
    this.FlattenObjects(this.CurrentElement);