AE-326这个视屏资源视频站,谁有,100RMB买

本文主要起因是一次在微博上囷朋友关于嵌套好几层的if-else语句的代码重构的讨论(),在微博上大家有各式各样的问题和想法按道理来说这些都是编程的基本功,似乎鈈太值得写一篇文章不过我觉得很多东西可以从一个简单的东西出发,到达本质所以,我觉得有必要在这里写一篇的文章不一定全對,只希望得到更多的讨论因为有了更深入的讨论才能进步。

文章有点长我在文章最后会给出相关的思考和总结陈词,你可以跳到结尾

所谓箭头型代码,基本上来说就是下面这个图片所示的情况

那么,这样“箭头型”的代码有什么问题呢看上去也挺好看的,有对稱美但是……

关于箭头型代码的问题有如下几个:

1)我的显示器不够宽,箭头型代码缩进太狠了需要我来回拉水平滚动条,这让我在讀代码的时候相当的不舒服。

2)除了宽度外还有长度有的代码的if-else里的if-else里的if-else的代码太多,读到中间你都不知道中间的代码是经过了什么樣的层层检查才来到这里的

总而言之,“箭头型代码”如果嵌套太多代码太长的话,会相当容易让维护代码的人(包括自己)迷失在玳码中因为看到最内层的代码时,你已经不知道前面的那一层一层的条件判断是什么样的代码是怎么运行到这里的,所以箭头型代碼是非常难以维护和Debug的

OK我们先来看一下微博上的那个示例,代码量如果再大一点嵌套再多一点,你很容易会在条件中迷失掉(下面這个示例只是那个“大箭头”下的一个小箭头)

上面这段代码可以把条件反过来写,然后就可以把箭头型的代码解掉了重构的代码如丅所示:

  •  上也有一篇文章讲了这种重构的方式 —— 《》
  •  上也有相关的问题说了这种方式 —— 《》

这里的思路其实就是,让出错的代码先返囙前面把所有的错误判断全判断掉,然后就剩下的就是正常的代码了

微博上有些人说,continue 语句破坏了阅读代码的通畅我觉得他们一定沒有好好读这里面的代码,其实我们可以看到,所有的 if 语句都是在判断是否出错的情况所以,在维护代码的时候你可以完全不理会這些 if 语句,因为都是出错处理的而剩下的代码都是正常的功能代码,反而更容易阅读了当然,一定有不是上面代码里的这种情况那麼,不用continue 我们还能不能重构呢?

你发出现抽成函数后,代码比之前变得更容易读和更容易维护了不是吗?

有人说:“如果代码不共享就不要抽取成函数!”,持有这个观点的人太死读书了函数是代码的封装或是抽象,并不一定用来作代码共享使用函数用于屏蔽細节,让其它代码耦合于接口而不是细节实现这会让我们的代码更为简单,简单的东西都能让人易读也易维护这才是函数的作用。

嵌套的 if 外的代码

微博上还有人问原来的代码如果在各个 if 语句后还有要执行的代码,那么应该如何重构比如下面这样的代码。

上面这段代碼中的那些 do_after_condX() 是无论条件成功与否都要执行的所以,我们拉平后的代码如下所示:

但是如果它们之前没有依赖关系的话,根据 DRY 原则我們就可以只保留一份,那么直接掉到 if 条件前就好了如下所示:

此时,你会说我靠,居然改变了执行的顺序,把条件放到 do_after_condX() 后面去了這会不会有问题啊?

相关了如果我把断行变成下面这样,反而代码逻辑更清楚了

于是乎,在未来维护代码的时候维护人一眼看上去僦明白,代码在什么时候会执行到哪里 这个时候,你会发现把这些语句块抽成函数,代码会干净的更多再重构一版:

上面,我给出叻两个版本的for-loop你喜欢哪个?我喜欢第二个这个时候,因为for-loop里的代码非常简单就算你不喜欢 continue ,这样的代码阅读成本已经很低了

接下來,我们再来看另一个示例下面的代码的伪造了一个场景——把两个人拉到一个一对一的聊天室中,因为要检查双方的状态所以,代碼可能会写成了“箭头型”

重构上面的代码,我们可以先分析一下上面的代码说明了,上面的代码就是对 PeerA 和 PeerB 的两个状态 “连上” “未连上” 做组合 “状态” (注:实际中的状态应该比这个还要复杂,可能还会有“断开”、“错误”……等等状态) 于是,我们可以把玳码写成下面这样合并上面的嵌套条件,对于每一种组合都做出判断这样一来,逻辑就会非常的干净和清楚

对于检查错误来说,使鼡 Guard Clauses 会是一种标准解但我们还需要注意下面几件事:

1)当然,出现错误的时候还会出现需要释放资源视频站的情况。你可以使用 goto fail;这样的方式但是最优雅的方式应该是C++面向对象式的 RAII 方式。

2)以错误码返回是一种比较简单的方式这种方式有很一些问题,比如如果错误码呔多,判断出错的代码会非常复杂另外,正常的代码和错误的代码会混在一起影响可读性。所以在更为高组的语言中,使用 try-catch 异常捕捉的方式会让代码更为易读一些。

对于检查状态来说实际中一定有更为复杂的情况,比如下面几种情况:

1)像TCP协议中的两端的状态变囮

2)像shell各个命令的命令选项的各种组合。

3)像游戏中的状态变化(一棵非常复杂的状态树)

4)像语法分析那样的状态变化。

对于这些複杂的状态变化其本上来说,你需要先定义一个状态机或是一个子状态的组合状态的查询表,或是一个状态查询分析树

写代码时,玳码的运行中的控制状态或业务状态是会让你的代码流程变得混乱的一个重要原因重构“箭头型”代码的一个很重要的工作就是重新梳悝和描述这些状态的变迁关系

好了下面总结一下,把“箭头型”代码重构掉的几个手段如下:

1)使用 Guard Clauses  尽可能的让出错的先返回, 这樣后面就会得到干净的代码

2)把条件中的语句块抽取成函数。 有人说:“如果代码不共享就不要抽取成函数!”,持有这个观点的人呔死读书了函数是代码的封装或是抽象,并不一定用来作代码共享使用函数用于屏蔽细节,让其它代码耦合于接口而不是细节实现這会让我们的代码更为简单,简单的东西都能让人易读也易维护写出让人易读易维护的代码才是重构代码的初衷

3)对于出错处理,使鼡try-catch异常处理和返回码的出错处理有很多问题,比如:A) 返回码可以被忽略B) 出错处理的代码和正常处理的代码混在一起,C) 造成函数接口污染比如像atoi()这种错误码和返回值共用的糟糕的函数。

4)对于多个状态的判断和组合如果复杂了,可以使用“组合状态表”或是状态机加Observer的状态订阅的设计模式。这样的代码即解了耦也干净简单,同样有很强的扩展性

5) 重构“箭头型”代码其实是在帮你重新梳理所有嘚代码和逻辑,这个过程非常值得为之付出重新整思路去想尽一切办法简化代码的过程本身就可以让人成长。

作为一个开发者有一个學习的氛围跟一个交流圈子特别重要这是一个我的QQ群架构华山论剑:,不管你是小白还是大牛欢迎入驻 分享BAT,阿里面试题、面试经验,讨論技术 大家一起交流学习成长!

216-2BD23-0XB8        厦门鑫恒自动化设备有限公司座落于美丽的海滨城市--厦门是一家多年专业从事大型备件(集散式控制、可编程控制器、冗余容错控制、机器人控制、大型伺服控制 供料 塑料成型辅助设备与自动化整厂规划 )等进口自动化备件、模块销售及集成的高新技术企业。对各自动化品牌产品有着强大的优势公司配备专业的技术人员,旨为客户提供更优质的服务 wny模具联盟网

我要回帖

更多关于 AE视频特效作品 的文章

 

随机推荐