`
pioneer21th
  • 浏览: 25737 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

请问这种判断方法叫什么名字?从哪里出来的?

阅读更多
大家好,我相信不少人都常用这样一种判断方法:
if (status == 1) {
          doSomething();
          return;
      }
     if (status == 2) {
          doSomething();
          return;
      }
      doSomething();


还有另外一种写法是:
if (status == 1) {
          doSomething();
           }
     else if (status == 2) {
          doSomething();
          return;
      }
     else
      doSomething();

     
我常用第一种写法,因为我觉得可读性更好也更简洁,但是现在我们team里有人不知道第一种写法,认为很难懂,我不知道怎么说服他。所以请问大家第一种写法出自哪里?叫什么名字?你们经常用第一种吗?(不讨论if/else可以重构成其他模式)
分享到:
评论
83 楼 pioneer21th 2007-05-18  
这个帖子给了新手发言的机会,因为即便是再新的手都会写这两种看似很简单的语句,类似于一下这位

zhaonjtu 写道
从效率和规范而言第二种好,第一种不客气的说很幼稚,而且会隐藏一些bug,不如你的doSomething()一不小心对status操作了,你就会接着做下面的if。



根本就不懂第一种方式,根本没有看到return语句,根本就是瞎说胡说来显示自己不是无知的
82 楼 抛出异常的爱 2007-05-18  
终于来这里了。。。等了很久了。。。
81 楼 zhaonjtu 2007-05-18  
从效率和规范而言第二种好,第一种不客气的说很幼稚,而且会隐藏一些bug,不如你的doSomething()一不小心对status操作了,你就会接着做下面的if。
80 楼 Sam1860 2007-05-18  
第二种方法使代码更统一。并不是每个if else都可以马上return的,这种情况方法一就用不上了,这样就会造成两种风格并存。
79 楼 lujh99 2007-05-18  

应该是卫述句好扩展。
78 楼 温柔一刀 2007-05-17  
抛出异常的爱 写道
温柔一刀 写道
查阅了一下

确实属David Astels的声音

我们所接受的教导就是一个方法应当只有单一的出口(即return语句)

这样的要求没有正当的理由,肯定不是出于对代码清晰度的考虑

一种更好、更清晰的解决办法就是采用卫述句来返回.

下面是一个简单的例子:
public int fib(int i) {    
        int result;    
        if (i == 0) {    
            result = 0;    
        } else if (i <= 2) {    
            result = 1;    
        } else {    
            result = fib(i - 1) + fib(i - 2);    
        }    
        return result;    
    }  


上面的代码非常之繁琐和难看,我们采用卫述句对其重构如下:
public int fib(int i) {    
        if (i == 0) return 0;    
        if (i <= 2) return 1;    
        return fib(i - 1) + fib(i - 2);    
    }  



简短优美多了吧?


扩展到20个你看看吧。


为什么要扩展到20个?

如果你要从可扩性来看的话,第一种也是比第二种较好的选择
77 楼 pioneer21th 2007-05-17  
昨天晚上看了一下《refactor》一书,第一种方式上面有人提过叫guard clauses, 至于第二种,在Martin眼里则是可以被重构成第一种的代码
76 楼 skydream 2007-05-15  
Qieqie 写道

仅是输入参数验证、条件判断时,我使用-用法1:
if (event == null) {
    return;
    //or throw exception here, just like NullPointerException or IllegalArgumentException!
}
if (event.isExpired()) {
    return;
}
events.add(event);

策略/类别判断时,假如不使用switch,我使用-用法2:
if (event.getSource() == 1) {
    //put some statements, or call another method
    //not return statement here
}
else if (event.getSource == 2) {
    //put some statements, or call another method
    //not return statement here
}

用法3:
使用设计模式(策略配置+模式):
   略


------------------
怎么使用都没问题,你要书写人习惯,并保持良好的缩进对齐。



恩,比较赞成这种做法,我平时的代码也是这么干的。
输入参数验证、条件判断时,本来就是一个接一个验证,如果一个不符合就return,符合验证的逻辑。
策略/类别判断时,是在多个条件中进行判断以确认应该进入哪个流程,这个时候的if elseif 可以更明确的表示n个流程中取一个的逻辑。
75 楼 lighter 2007-05-15  
抛出异常的爱 写道
温柔一刀 写道
查阅了一下

确实属David Astels的声音

我们所接受的教导就是一个方法应当只有单一的出口(即return语句)

这样的要求没有正当的理由,肯定不是出于对代码清晰度的考虑

一种更好、更清晰的解决办法就是采用卫述句来返回.

下面是一个简单的例子:
public int fib(int i) {    
        int result;    
        if (i == 0) {    
            result = 0;    
        } else if (i <= 2) {    
            result = 1;    
        } else {    
            result = fib(i - 1) + fib(i - 2);    
        }    
        return result;    
    }  


上面的代码非常之繁琐和难看,我们采用卫述句对其重构如下:
public int fib(int i) {    
        if (i == 0) return 0;    
        if (i <= 2) return 1;    
        return fib(i - 1) + fib(i - 2);    
    }  



简短优美多了吧?


扩展到20个你看看吧。

到20的话,我相信你的代码有问题.
74 楼 抛出异常的爱 2007-05-15  
温柔一刀 写道
查阅了一下

确实属David Astels的声音

我们所接受的教导就是一个方法应当只有单一的出口(即return语句)

这样的要求没有正当的理由,肯定不是出于对代码清晰度的考虑

一种更好、更清晰的解决办法就是采用卫述句来返回.

下面是一个简单的例子:
public int fib(int i) {    
        int result;    
        if (i == 0) {    
            result = 0;    
        } else if (i <= 2) {    
            result = 1;    
        } else {    
            result = fib(i - 1) + fib(i - 2);    
        }    
        return result;    
    }  


上面的代码非常之繁琐和难看,我们采用卫述句对其重构如下:
public int fib(int i) {    
        if (i == 0) return 0;    
        if (i <= 2) return 1;    
        return fib(i - 1) + fib(i - 2);    
    }  



简短优美多了吧?


扩展到20个你看看吧。
73 楼 lihy70 2007-05-15  
删之,还是不要在这里浪费时间好!



72 楼 pioneer21th 2007-05-15  
lihy70 写道
除了:“这是一个白痴问题”,其它无话可说。
大家居然能提出这样那样的“佐证”,真是不可思议!


“大师”不亏是大师,一发言就定性。我不会再关注你第二次。

顺便说下,第一种编码方式在现在的开源项目里很常见,包括在sun的java实现里,大家留意一下,前面有人举的String的equals()实现,正是用了第一种方式,让人觉得代码很清晰。
事实上,我现在看别人的代码是否清晰是否简洁基本上就判断一个人的编码水平,我个人的意见,我不会认为有着多个if...else...的程序是清晰简洁的。
71 楼 卒子99 2007-05-13  
呵呵,前两天才看了点书,这种应该是重构的一种,第一种方式比较妥,会让你很清楚每一步做什么,而不用最后再来判断退出的条件
70 楼 cherami 2007-05-13  
个人感觉第二种写法比较好一些,不用多加那些return语句,程序中存在过多的中断语句不是什么好事。
69 楼 温柔一刀 2007-05-13  
查阅了一下

确实属David Astels的声音

我们所接受的教导就是一个方法应当只有单一的出口(即return语句)

这样的要求没有正当的理由,肯定不是出于对代码清晰度的考虑

一种更好、更清晰的解决办法就是采用卫述句来返回.

下面是一个简单的例子:
public int fib(int i) {    
        int result;    
        if (i == 0) {    
            result = 0;    
        } else if (i <= 2) {    
            result = 1;    
        } else {    
            result = fib(i - 1) + fib(i - 2);    
        }    
        return result;    
    }  


上面的代码非常之繁琐和难看,我们采用卫述句对其重构如下:
public int fib(int i) {    
        if (i == 0) return 0;    
        if (i <= 2) return 1;    
        return fib(i - 1) + fib(i - 2);    
    }  



简短优美多了吧?
68 楼 温柔一刀 2007-05-12  
<font>
<div class='quote_title'>Godlikeme 写道</div>
<div class='quote_div'>
<div class='quote_title'>温柔一刀 写道</div>
<div class='quote_div'>
<div class='quote_div'>
taowen 写道
第一种叫Guard Statement。把写法从第二种转换成第一种也算一种重构。在Martin的书中有记载。在函数式语言中,Guard使用得也是极多的,比如Haskell。 </div>
<p class='quote_div'><font>我正想着是在哪位大师的书上面看过对此的阐述呢</font></p>
<p class='quote_div'><font>貌似是Martin的refactoring上面的</font></p>
<p class='quote_div'><font>我喜欢把第二种重构成第一种</font></p>
<p class='quote_div'><font>不过这个例子看不出它的好处来
</font></p>
</div>
</div>
<p class='quote_div'><font>查过了,不是martin</font></p>
<p><font>那我记错了</font></p>
<p><font>貌似是David Astels的Test-Driven Development A Practical Guide上面讨论过的</font></p>
<p><font>第二种重构为第一种的重构方法叫:replace nested conditional with guard clauses(使用卫述句来代替嵌套的条件判断)</font></p>
<p><font>使用卫述句能够使代码变得干净、简短和清晰</font></p>
<p><font/> </p>
<font/></font>
67 楼 温柔一刀 2007-05-12  
pioneer21th 写道
忘了几年前怎么受的第一种方式的影响,可以说是根深蒂固,我的代码里面几乎不出现else分句


xx所见略同呀

我看到else就要把它干掉,除非实在干不掉
66 楼 jameswei 2007-05-12  
这些写法我也都用过.
在代码整洁上我觉得都差不多.
这两种结构细节上有点不同。
65 楼 janh 2007-05-12  
Lucas Lee 写道
pioneer21th 写道
Lucas Lee 写道
我认为一般情况下,第一种方式是比较危险的。
如果你想表达的就是if..else if..else这样的意义的话,最好用第二种,这样的无论性能还是可读性都很好,意义表达很精确。
用第一种方式,虽然能少些几个字,但是:
每个if都要独立的判断,为了达到if else的效果,需要保证表达式是互斥的,楼主的例子简单,如果是if(x>0),if(x<0),的情况,就要注意x==0的临界情况,如果是if(x>0) else就简单多了。

我认为简洁而精确的表达含义是最大的理由。



请问危险在何处?

你有没有发现,第一种表达方式很类似于switch语句,只是如果比较的值不是原始类型,所以才不能用switch语句而已。

另外还有人说到比较的性能问题,你们仔细分析分析,第一种方式比第二种方式不多一次比较次数,无论有多少个分支。


关于潜在的危险,我没有说清楚么?对于你的例子来说,还不明显;如果同样的结构,换一种判断的内容,就比较明显了,如上面提到的例子,
if(x>0){
...
}
if(x<=0){
...
}

对比
if(x>0){
...
}else{
...
}

你觉得上面那个不会有逻辑判断的危险么?你必须仔细选择第二个条件才能保证跟下面的例子等效。
当逻辑判断更复杂,(随着代码维护,很可能变得更复杂),这个需要仔细选择的判断就更危险了。




象这种条件之间关联性很强,就这么几种确定的情况,全部罗列出来了,确实是放在一起比较好;但是在条件之间关联性不强,可能会增加其他判断条件时,我一般用第一种方法。
64 楼 LucasLee 2007-05-12  
温柔一刀 写道

你举的这个例子显然跟我们讨论的不一样
你忘记每个if里面都有 return了

Sorry, 我没注意到。

相关推荐

    滤镜名称:抽出滤镜

    这种分层处理的方式使得即使是最复杂的图像也能被精确地分离出来。 二、使用步骤 1. 打开图像:在Photoshop中打开包含你要提取的对象的图片。 2. 应用滤镜:选择"滤镜"菜单,然后找到"抽出"选项并点击。 3. 边缘...

    Chatgpt的本质是什么?人工智能是否会取代人类?

    说简单点,就是你投喂了什么,他就生产什么,都是训练出来的。 你认为使用聊天GPT很神奇,但它并不神秘。这种人工智能的本质是什么?就是用算法模拟人类的思维方式,给出一个问题的答案。据业内专业人士介绍,这个...

    java课后答案[参考].pdf

    * 什么叫方法重载?:方法重载是多态性的一种,是指一个类中可以有多个方法具有相同的名字,但是这些方法的参数必须不同或者参数的个数不同,或者参数的类型不同。 * 构造方法可以重载吗?:可以。 * 为什么类方法不...

    你必须知道的495个C语言问题

    2.4 在C语言中用什么方法实现抽象数据类型最好? *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明...

    中文人名自动识别的一种有效方法

    ### 中文人名自动识别的有效方法 #### 一、引言 中文信息处理技术发展至今已有数十年的历史,但仍存在不少未解决的技术难题。其中,中文姓名自动识别问题尤为突出,因为它不仅涉及到基础的文本处理技术,还直接...

    统计方法来识别中文姓名

    - **姓氏驱动策略**: 利用中文姓名“姓氏+名字”的特点,一些方法采取“姓氏驱动”的策略,即在扫描文本时遇到姓氏用字才触发人名的候选或识别。然而,这种方法无法识别非标准形式的姓名。 - **规则匹配**: 文献中...

    深度学习模型的藏文人名识别方法.pdf

    【藏文人名识别方法】藏文人名识别是自然语言处理中的一个重要任务,它涉及到对藏文中的人名实体进行定位和分类。由于藏文的独特性质,如缺乏像英文大写字母那样的边界特征,也没有汉文姓氏和名字的明显区分,识别...

    电子功用-将电视节目中所取名字改为观众要求的名字的系统和方法

    在电子功用领域,本文将深入探讨一种创新的系统和方法,该系统允许电视节目根据观众的要求实时更改节目中出现的名字。这种技术的引入不仅提升了观众的互动体验,还为电视制作带来了全新的可能性。以下是对这一独特...

    电信设备-手机向“短信名字”发送短信的方法.zip

    这种“短信名字”通常是联系人在手机通讯录中的别名或昵称,使得用户在发送短信时可以快速识别和选择接收方。 首先,我们来理解一下“短信名字”的概念。在手机通讯录中,每个联系人都有一个唯一的手机号码,但为了...

    《你必须知道的495个C语言问题》

    2.4 在C语言中用什么方法实现抽象数据类型最好? 22 *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 22 2.6 为什么声明extern f(struct x *p); 给我报了一个晦涩难懂的警告信息? 23 2.7 我...

    网络游戏-一种能叫出被拍摄者名字的网络摄像机.zip

    这种摄像机通常配备有面部识别功能,能够通过分析捕获的视频图像来识别并呼叫出被拍摄者的名字。在现代科技中,这种技术的应用不仅限于家用监控,也可能在网络游戏、虚拟社交等领域有所应用。 首先,我们来探讨一下...

    电信设备-利用“短信名字”代替数字号码的短信发送方法.zip

    这种方法使得用户可以更直观、更容易地识别发送和接收短信的对象,尤其是在联系人名单庞大或频繁与特定组织、企业交互时,更加便捷。 “短信名字”实际上是一种基于通讯录或服务提供商提供的功能,它允许用户为联系...

    Java 实现文章汉字关键词(违禁词)识别

    但这种方法效率较低,不适用于大量文本的处理。 2. **正则表达式**:Java的Pattern和Matcher类支持正则表达式的匹配,可以用来编写复杂的匹配规则,如匹配多个关键词或词组。但是,正则表达式在处理大量数据时也会...

    WIFI无线网用户名字怎么改成中文?.docx

    在现代家庭和办公室环境中,Wi-Fi 无线网络已经成为不可或缺的一部分。有时,为了便于识别或个性化,用户可能希望将 ...通过这种方法,你可以让家里的 Wi-Fi 更具个性,也能方便家人或客人更容易找到并连接到你的网络。

    java 面试题

    是否可以从一个static方法内部发出对非static方法的调用? 不可以。静态方法只能访问静态成员变量和调用静态方法,因为静态方法是在类加载时就初始化好的,而对象可能还未创建。 #### 14\. Integer与int的区别 -...

    PHP 面向对象技术(全面讲解).txt

    上面就是一个类的声明,从属性和方法上声明出来的一个类,但是成员属性最好在声明的时候 不要给初始的值,因为我们做的人这个类是一个描述信息,将来用它实例化对象,比如实例化出来 10 个人对象,那么这10 个人, ...

    命名实体识别(Standford)

    对于这种任务,需要从新闻文章中提取关键信息,如航空公司名称、票价上调幅度、公告日期等。例如: &gt; “鉴于燃油价格高企,联合航空周五宣布,将对飞往某些城市的航班票价上调6美元往返。美国航空公司,即AMR公司的...

    在电脑在电脑右下角显示你的名字

    通过在电脑右下角显示名字,用户可以轻松地识别自己的设备,尤其是在共享或公共空间中,这种个性化设置显得尤为重要。 #### 2. **操作步骤详解** 要实现在电脑右下角显示名字,我们需要遵循以下步骤: - 首先,...

    微软为什么把windows 7系统叫为windows 7呢?.docx

    Windows 7这个名字简洁明了,容易记忆,有助于品牌识别和消费者的接受度。 总的来说,Windows 7的命名策略反映了微软在技术和市场之间寻找平衡的努力。他们希望新版本能够继承Vista的技术成果,同时通过一个简单...

Global site tag (gtag.js) - Google Analytics