这个else为什么不行?

初二上英语SOME BODY ELSE为什么 else somebody 不行呢
somebody 是不定代词,同类的还有 somewhere something sometime ,else都接这些词的后面,固定搭配,记住就行了~
为您推荐:
其他类似问题
扫描下载二维码struts标签【&s:if test=&&&&/s:if&&s:elseif test=&&&&/s:elseif&&s:else&&/s:else&不管用】
[问题点数:40分,结帖人xwt799023]
struts标签【&s:if test=&&&&/s:if&&s:elseif test=&&&&/s:elseif&&s:else&&/s:else&不管用】
[问题点数:40分,结帖人xwt799023]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。这个例子中的if else也要重构掉吗?
今天在群里面看到有人说用if else不好,他贴了下面的图。我觉得这个例子很烂,一个很简单的方法,被重构的一眼看不懂在干吗。&br&&img src=&/aaebf120e8322ffe0fa5be09_b.jpg& data-rawwidth=&960& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/aaebf120e8322ffe0fa5be09_r.jpg&&&br&然后他又举了个例子。贴了下面的代码&br&&img src=&/943beaba027c2a06a948e4_b.jpg& data-rawwidth=&570& data-rawheight=&746& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&/943beaba027c2a06a948e4_r.jpg&&&br&然后我觉得例子里面最多说if条件重复了。逻辑也挺简单的,也清晰。这样也挺好,最主要是我想不到还有什么更好的写法。然后让他说说更好的写法。&br&他就贴出了这个:&br&&img src=&/fc93c0e6e07a412a1971ffcef4a0cb41_b.jpg& data-rawwidth=&767& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&767& data-original=&/fc93c0e6e07a412a1971ffcef4a0cb41_r.jpg&&&br&我觉得这样把问题搞复杂了。然后他觉得我应该看看函数式编程的思想。说函数是变成都用Pattern Matching,函数式编程我只是看过Haskell和Scala。我觉得Pattern Matching不是就是有点类似于switch吗,只是更强大。&br&&br&问题来了,上面到底哪种方式更好呢?或者还有更好的方式重构这个代码?真不能用这这么多if else吗?我个人觉得这个方法不复杂,代码逻辑清晰,让人一眼看懂。也还好。而且我也不喜欢很多if else,但是我想不到更好的写法了。第二种方式我觉得完全是为了玩花活而玩的。&br&&br&真心请教!&br&&br&&br&====================================================================&br&&br&更新一下,书上的重构应该写成&br&&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&function&/span& &span class=&nx&&doSomething&/span&&span class=&p&&(&/span&&span class=&nx&&a&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&lookup&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&nx&&x&/span&&span class=&o&&:&/span& &span class=&nx&&doX&/span&&span class=&p&&,&/span& &span class=&nx&&y&/span&&span class=&o&&:&/span& &span class=&nx&&doY&/span&&span class=&p&&},&/span& &span class=&nx&&def&/span& &span class=&o&&=&/span& &span class=&nx&&doZ&/span&&span class=&p&&;&/span&
&span class=&p&&(&/span&&span class=&nx&&lookup&/span&&span class=&p&&[&/span&&span class=&nx&&a&/span&&span class=&p&&]&/span& &span class=&o&&||&/span& &span class=&nx&&def&/span&&span class=&p&&)();&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&&br&stackoverflow上有人用Haskell给出了他的解法。写成js就是这样。我个人觉得确实是很好的重构方案,可以少打很多代码(我提问时抄原始代码大于小于号写错了好几次),减少出错几率,逻辑也很清楚,修改起来很方便, 加点注释说明下可能更好。&br&&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&function&/span& &span class=&nx&&rank&/span&&span class=&p&&(&/span&&span class=&nx&&score&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span& &span class=&o&&+&/span& &span class=&nx&&_&/span&&span class=&p&&.&/span&&span class=&nx&&findLastIndex&/span&&span class=&p&&(&/span&
&span class=&p&&[&/span&&span class=&o&&-&/span&&span class=&kc&&Infinity&/span&&span class=&p&&,&/span& &span class=&mi&&7&/span&&span class=&p&&,&/span& &span class=&mi&&9&/span&&span class=&p&&,&/span& &span class=&mi&&11&/span&&span class=&p&&,&/span& &span class=&mi&&30&/span&&span class=&p&&,&/span& &span class=&mi&&45&/span&&span class=&p&&,&/span& &span class=&mi&&60&/span&&span class=&p&&,&/span& &span class=&mi&&75&/span&&span class=&p&&,&/span& &span class=&mi&&90&/span&&span class=&p&&],&/span&
&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&val&/span&&span class=&p&&){&/span&
&span class=&k&&return&/span& &span class=&nx&&score&/span& &span class=&o&&&=&/span& &span class=&nx&&val&/span&&span class=&p&&;&/span&
&span class=&p&&})&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&
今天在群里面看到有人说用if else不好,他贴了下面的图。我觉得这个例子很烂,一个很简单的方法,被重构的一眼看不懂在干吗。…
按投票排序
首先回答问题:这样做是有意义的。但是提问者和举例子的人理解都有偏差。首先是提问者说的改写后逻辑反而不清晰了,这里有两个原因,一是对函数式和声明式编程的不熟悉,下意识的希望控制所有的代码逻辑和细节,缺乏高层思维。其次就是这些例子脱离实际,重写的也不够彻底。那么简单来说说这样的重构为何有意义?首先某高票答案的说法基本完全无法认同,无论何种分支代码代码最终必然是条件跳转,分支只能从一种形式转换为另一种形式这种说法毫无意义,因为这里的重构完全与分支无关。这里重构的意义在于把数据剥离出来!虽然我觉得理解这个对于初学者而言有一定的难度,但是要理解这样的重构,还是必须从这个层面来讨论。function doSomething( a )
if ( a === 'x' )
else if ( a === 'y' )
重构之后:function doSomething(a) {
var lookup = {x: doX, y: doY}, def = doZ; //数据
(lookup[a] || def)();
这个重构的目的其实是在于,把数据从实现中剥离出来。为什么要这么做?原因一:相较于实现逻辑,数据变更的可能性更大,例如我需要增加一个a==='h'的时候也执行doX,那么直接修改数据就比修改if ... else要方便。在强类型设计语言中,强数据类型可以确保数据的完整性,修改数据比修改代码要安全得多。这也是为什么我们做一个程序有一堆配置的原因,因为相较于修改代码,配置的修改,要安全得多。原因二:分析和阅读一段代码的时候,很多时候是有侧重面的,有时候侧重于数据,有时候侧重于逻辑。假设我们有这样一个需求,当某某值小于100时,就如何如何。那这个里面的100就是数据,当需求变更为某某值小于200时,才如何如何,那么我们关注的点在于这个数据的修改。而不是整个逻辑的修改,数据的剥离,有助于我们更快的发现修改点和修改代码。事实上通常用于消除魔幻数字的named data,本质上也是从实现中剥离数据的一种方式。命名数据的例子:var maxAge = 100;
if ( age & maxAge )
error( "invalid age." );
消除魔幻数字的例子:var actiontoken_insert = 0;
if ( action === actiontoken_insert )
insert( data );
但是消除魔幻数字更彻底的方式是基于约定,将token与具体的实现逻辑基于约定进行自动的匹配,去除无意义的match代码,更彻底的消除魔幻数字:dataActions[action]( data );
原因三:数据和实现分别可以重用,而数据和实现的重用方式和逻辑却不尽相同。数据从实现逻辑中剥离,能够为接下来的消除重复代码做好准备工作。以上是这样做为什么是有意义的。然后说这个例子中的不妥之处。首先第一个例子很明显这个a==='x',a==='y'中的x和y也是一种魔幻数字,只不过变成了字符串这种更高级的形式了。所以我们需要去解决的是消灭掉这段逻辑,从数据源头把x和y这种魔幻数字给干掉,变成更有意义的表达形式,然后再通过约定来直接消灭掉中间的match的过程,省略掉mapping数据。第二个例子中将数据提取出来后,可以明显的看出来这是一个连续的区间,既然是连续区间,那么写成很多个数组显然是错误的,应当进一步将数据合并成为一个数组,再将实现逻辑剥离为通用函数,改为函数调用:var ranges = [7, 9, 11, 30, 45, 60, 75, 90]
var currentRange = getRange( score, ranges );
当然,任何事情都有一个度,数据的剥离自然是正确的,但也有其成本和收益,若收益低于成本,例如逻辑实在过于简单,或者说数据和逻辑混杂太深难以剥离,那么此时剥离数据并不总是对的。
基本赞同 ,并且要补充,score的条件判断并非是magic number,因为我们很容易看出其意义。而且score与starNumber的对应可能变化吗?如果不太可能变化,就没有必要提取出来。因为现有的代码并没有复杂到看不清楚其对应关系。通过lookup表来分派代码的方式适用于需要动态性、可扩展性的场合,但不是没有代价的。代码多了一层间接,其实理解成本是略微上升的。更重要的是使得代码的静态分析变困难——比如圈复杂度的分析,也使得无法应用某些性能优化(像分支顺序调整)。他的这些例子都过于简单以至于很难想象需要动态性和可扩展性。举这样失败的例子也说明作者并没有真正明白代码的可维护性。
如果只是为了学习如何重构,那就玩一下咯。。一般的if else是没有办法删除的,无论你将其转为switch语句,还是多态——你只能将其从一种形式转换为另外一种形式。在复杂的情况下应该抽象成那样子会更容易理解。但是在这个case里,这里的if else都只是单层,没有必要为了重构而去重构。相反地,在这个例子里,最需要重构的不是if语句,而是Magic Number。为7,9,11,30,45,60,75,90赋予一个变量值,会比重构if-else更有意义。像这里的分数,不会有极端的需求出现,每个level都会在一定的范围里面。所以,我觉得这里的if-else反而是容易理解。在这里,我更想去反对这样的做法。一般的团队都不会有Code Diff、Code Review,这样做会导致浪费更多的时间——不仅是你写的时间,还有别人阅读代码的时间。
如果是c,可以加宏,把if else改写成宏。
如果把if else写死了, 等到要添加更多的条件分支的时候,就得改写方法了,更不要说,如果条件范围是用户输入之后作为参数传进来的情况。但重构以后就不同了,条件范围是数组,需求变了只要改改数组就可以了。另外程序的可复用性也更强了。看上去写了额外的代码,然而事实上会减少很多的工作量。
如果分支很多的时候,重构后的实现可能反而更清晰一些。另一方面,重构后的实现每一个键对应的是一个函数,者为将来更进一步的重构打下了基础。例如下面的例子:function client(int actionName) {
// 前置处理
switch (actionName) {
// do somethings
switch (actionName) {
重构为下面的代码,就会更清晰,可维护性更高:var actionMap = {
a: {pre: preA, post: postA},
b: {pre: preB, post: postB},
c: {pre: preC, post: postC}
function client(actionName) {
var actionInfo = actionMap[actionName];
actionInfo.pre();
// Do somethings.
actionInfo.post();
这东西的正确重构方式不是用继承么……当然例子里说的是javascript,所以需要略作修改var object1 = {name: 'Object 1', action: doA};
var object2 = {name: 'Object 2', action: doB};
function executeAction(targetObject) {
targetObject.action();
不过当然了,Javascript做这种重构意义不大就是
简单明了并且分支少的就用if/else就行了,如果分支过多,可以使用switch另外if/else把命中概率偏大的逻辑往前放真觉得代码丑,或者逻辑不清楚得再进行代码重构,别为了重构而重构,这样会增加代码的复杂程度,会无形中增大bug的出现率,你不爽,测试人员也不爽的
还好他用的是 js,要是用 c++ 这么搞,累死他。
switch case才最需要lookup表,总有人忘记写break;栗子中的if else就还好,没看出有什么必要。
已有帐号?
无法登录?
社交帐号登录&&&您需要以后才能回答,未注册用户请先。用if。。。else和elseif有什么区别和联系?可以相互替换吗?_百度知道
用if。。。else和elseif有什么区别和联系?可以相互替换吗?
提问者采纳
else明显是对于if列出的条件..这样是可以列出12个分支的,如果符合走if的分支.,走else的分支..,不符合if ... else .,就只能在else里面再一直的套if else,最后都不符合.这个.,是多个条件.,每个月都不一样,才走到else的分支,使用if .?比如. elseif.,多个分支... else 。你每次肯定不会总是值判断一个条件成立或不成立吧.了可是使用if ..。那么一共就12个分支了. elseif ...。而if ..,判断一个人的出生月份. elseif... elseif
提问者评价
来自团队:
其他类似问题
为您推荐:
其他2条回答
则执行elseif后面的执行句,然后条件句2成立,如果条件句1不成立,则执行if后面的执行句;if
(条件句1)+执行句elseif
(条件句2)+执行句else
+执行句end如果条件句1成立,则执行esle后面的句子。esle 与elseif 不是一个概念,则执行if 后面的执行句if
(条件句)+执行句else
+执行句end如果条件句成立,如果条件句1和条件句2都不成立,则执行else后面的执行句。所以if 。。。如果不成立
他们的区别是if……else 后面不能再跟其他判断
而elseif后面还可以跟多个判断条件例如 if(a&b){……}else{}if(a&b){……}elseif(a&b){……}else{……}后者可以代替前者
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 if else 的文章

 

随机推荐