`
pioneer21th
  • 浏览: 25739 次
  • 性别: 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可以重构成其他模式)
分享到:
评论
63 楼 温柔一刀 2007-05-12  
Lucas Lee 写道

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

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

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




你举的这个例子显然跟我们讨论的不一样
你忘记每个if里面都有 return了
62 楼 umbrella 2007-05-12  
第一个是所有IF都要走一遍,第二个相对于SWITCH中的某一项处理完以后break;
61 楼 kdekid 2007-05-11  
Guard statement 有一定使用条件的,通常用于在函数开头判断一系列的异常情况。在guard statement之后的语句,都被认为是无错的。
60 楼 LucasLee 2007-05-11  
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{
...
}

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


59 楼 Godlikeme 2007-05-11  
jkit 写道
Godlikeme 写道

......


告诉你一个潜规则:大师写程序不受编码规范的约束。
至于大师写程序为什么可以不受编码规范的约束,还是你自己去弄明白吧。
等你明白了这个潜规则很多问题就可以迎刃而解了。


弄了半天也没说出点所以然来,少拿大师说事。
58 楼 Godlikeme 2007-05-11  
温柔一刀 写道
taowen 写道
第一种叫Guard Statement。把写法从第二种转换成第一种也算一种重构。在Martin的书中有记载。在函数式语言中,Guard使用得也是极多的,比如Haskell。


我正想着是在哪位大师的书上面看过对此的阐述呢

貌似是Martin的refactoring上面的

我喜欢把第二种重构成第一种

不过这个例子看不出它的好处来


查过了,不是martin
57 楼 温柔一刀 2007-05-11  
taowen 写道
第一种叫Guard Statement。把写法从第二种转换成第一种也算一种重构。在Martin的书中有记载。在函数式语言中,Guard使用得也是极多的,比如Haskell。


我正想着是在哪位大师的书上面看过对此的阐述呢

貌似是Martin的refactoring上面的

我喜欢把第二种重构成第一种

不过这个例子看不出它的好处来
56 楼 jkit 2007-05-11  
Godlikeme 写道

......


偶只是说下偶的观点,没有试图去说服您的意思,所以不要期望偶说出个所以然出来。
55 楼 Godlikeme 2007-05-11  
从一开始就觉得没什么可讨论的,
后来看到了 恶例和单入单出原则,想探个究竟。
才发此问。

抛出异常的爱 写道
茴字有NNNN种写法。。。

引用

这是String equals方法

我只能说大家都太教条了。


教条从何而来啊?,

我引用这段代码只是很奇怪,原则和恶例从何而来,不然岂不成了无稽之谈。

54 楼 dovecat 2007-05-11  
恩.这样继续讨论确实有点过了.
53 楼 抛出异常的爱 2007-05-11  
茴字有NNNN种写法。。。

引用

这是String equals方法

我只能说大家都太教条了。
52 楼 lihy70 2007-05-11  
除了:“这是一个白痴问题”,其它无话可说。
大家居然能提出这样那样的“佐证”,真是不可思议!
51 楼 NetBus 2007-05-11  
当然用第二种方法,虽然这两种方法没有性能上的差别(在IF里面return了),但是第二种方法把同类的if聚合成一个组了。

不过,如果比较是int或者byte或者char的话,我会使用switch()
50 楼 fsword 2007-05-11  
jkit 写道
Godlikeme 写道
jkit 写道
pioneer21th 写道
所以请问大家第一种写法出自哪里?叫什么名字?你们经常用第一种吗?


出自Java编码规范,名字叫“恶例”,从来不用。


查过编码规范,不知 “恶例” 从何而来。



单入口单出口原则


看了一圈,只有jkit回答的靠谱。
这不是OO的原则,好像还是结构化程序设计中的原则吧,函数的出口多于一个会给阅读和调试带来困难,当然,那时的函数有很多代码行数巨多。
49 楼 Godlikeme 2007-05-11  
jkit 写道
Godlikeme 写道
jkit 写道
pioneer21th 写道
所以请问大家第一种写法出自哪里?叫什么名字?你们经常用第一种吗?


出自Java编码规范,名字叫“恶例”,从来不用。


查过编码规范,不知 “恶例” 从何而来。



单入口单出口原则


说的详细些,这个原则和恶例都没有看到,
http://java.sun.com/docs/codeconv/

或者,看的编程规范是什么版本,在哪里可以查到。


这是String equals方法
  
 public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
48 楼 yfmine 2007-05-11  
do
{
    if (status == 1)
    {
        doSomething();
        break;
    }
    if (status == 2)
    {
        doSomething();
        break;
    }
    doSomething()

}while(false)

添加条件时
第二种copy & paste容易出错,比如把else搞丢了,编译照样通过
第一种只要copy过去,肯定就return了.
47 楼 taowen 2007-05-11  
第一种叫Guard Statement。把写法从第二种转换成第一种也算一种重构。在Martin的书中有记载。在函数式语言中,Guard使用得也是极多的,比如Haskell。
46 楼 dovecat 2007-05-11  
LZ的第一种写法也没比第二种多开销什么.
不过,对于代码的清晰来说,还是觉得第二种好.
45 楼 温柔一刀 2007-05-11  
Lucas Lee 写道
我认为一般情况下,第一种方式是比较危险的。
如果你想表达的就是if..else if..else这样的意义的话,最好用第二种,这样的无论性能还是可读性都很好,意义表达很精确。
用第一种方式,虽然能少些几个字,但是:
每个if都要独立的判断,为了达到if else的效果,需要保证表达式是互斥的,楼主的例子简单,如果是if(x>0),if(x<0),的情况,就要注意x==0的临界情况,如果是if(x>0) else就简单多了。

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


为什么说第一种方式危险?

在lz这个例子里面也许看不出第一种方式的好处来,但是至少危险我看不出来
44 楼 抛出异常的爱 2007-05-11  
jimmy.shine 写道
为何不使用switch,一了百了!

不支持string

相关推荐

    滤镜名称:抽出滤镜

    这种分层处理的方式使得即使是最复杂的图像也能被精确地分离出来。 二、使用步骤 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