作家
登录

关于烂代码的那些事——什么是好代码

作者: 来源: 2017-04-11 09:00:06 阅读 我要评论

2.2.2.遵守商定

商定包含代码和文档若何组织,注释若何编写,编码风格的商定等等,这对于代码将来的保护很重要。对于遵守何种商定没有一个强迫的标准,不过我更偏向于遵守更多人的商定。

与开源项目保持风格一致一般来说比较靠谱,其次也可以遵守公司内部的编码风格。然则如不雅公司内部的编码风格和当前开源项目标风格冲突比较严重,往往代表着这个公司的技巧偏向于封闭,或者已经有些跟不上节拍了。

然则无论若何,遵守一个商定总比本身创造出一些规矩要好很多,这降低了懂得、沟通和保护的成本。如不雅一个项目本身创造出了一些奇怪的规矩,可能意味着作者看过的代码不敷多。

一个工程是否遵守了商定往往须要代码浏览者有必定经验,或者须要借助checkstyle如许的静态检查对象。如不雅感到无处下手,那么大年夜部分情况下跟着google做应当不会有什么大年夜问题:可以参考google code style,个一一部分有对应的中文版。

别的,没有须要纠结于遵守了商定到底有什么收益,就似乎走路是靠左好照样靠右好一样,即使得出了却论也没有什么意义,大年夜部分商定只要遵守就可以了。

2.2.3.文档和注释

文档和注释是法度榜样很重要的部分,他们是懂得一个工程或项目标门路之一。两者在某些场景下定位话苄些重合或者交叉(比如javadoc实际可以算是文档)。

对于文档的标准很简单,能找到、能读懂就可以了,一般来说我比较关怀这几类文档:

  1. 对于项目标介绍,包含项目功能、作者、目次构造等,读者应当能3分钟内大年夜致懂得这个工程是做什么的。
  2. 针对新人的QuickStart,读者按照文档解释应当能在1小时内完成代码构建和R单应用。
  3. 针对应用者的具体解释文档,比如接口定义、参数含义、设计等,读者能经由过程文档懂得这些功能(或接口)的应用办法。

有一部分注释实际是文档,比如之前提到的javadoc。如许能把源码和注释放在一路,对于读者更清楚,也能简化不少文档的保护的工作。

还有一类注释并不作为文档的一部分,比如函数内部的注释,这类注释的职责是解释一些代码本身无法表达的作者在编码时的思虑,比如“为什么这琅绫腔有做XXX”,或者“这里要留意XXX问题”。

一般来说我起首会关怀注释的数量:函数内部注释的数量应当不话苄很多,也不会完全没有,小我的经验值是滚动几屏幕看到一两处阁下比较正常。过多的话可能意味着代码本身的可读性有问题,而如不雅一点都没有可能意味着有些隐蔽的逻辑没有解释,须要推敲恰当的增长一点注释了。

其次也须要推敲注释的质量:在代码可读性合格的基本上,注释应当供给比代码更多的信息。文档和注释并不是越多越好,它们可能会导致保护成本增长。关于这部分的评论辩论可以参考简洁部分的内容。

《代码整洁之道》

2.3.可宣布的代码

新人的代码有一个比较典范的特点,因为缺乏保护项目标经验,写的代码总话苄很多推敲不到的处所。比如说测试的时刻似乎没什么异常,项目宣布之后才发明有很多料想之外的状况;而出了问题之后不知道大年夜哪下手排查,或者仅能让体系处于一个并不稳定的状况,依附一些偶号绫倾强运行。

2.3.1.处理异常

新手段度榜样员广泛没有处理异常的意识,但代码的实际运行情况中充斥了异常:办事器会逝世机,收集会超时,用户会胡乱操作,不怀好意的人会恶意进击你的体系。

我对一段代码异常处理才能的第一印象来自于单位测试的覆盖率。大年夜部分异常难以在开辟或者测试情况里复现,即使有专业的测试团队也很难在集成测试情况中模仿所有的异常情况。

而单位测试可以比较简单的模仿各类异常情况,如不雅一个模块的单位测试覆盖率连50%都不到,很难想象这些代码推敲了异常情况下的处理,即使推敲了,这些异常处理的分支都没有被验证过,怎么指望实际运行情况中出现问题时表示优胜呢?

2.3.2.处理并发

我收到的很多简历里都写着:精晓并发编程/熟悉多线程机制,诸如斯类,跟他们聊的时刻也说的头头是道,什么锁啊互斥啊线程池啊同步啊旌旗灯号量啊一堆一堆的名词滚滚一向。而给应聘者一个实际场景,让应聘者写一段很简单的并发编程的小法度榜样,能写好的却不多。

实际上并发编程也确切很难,如不雅说写好同步代码的难度为5,那么并发编程的难度可以达到100。这并不是危言耸听,很多看似稳定的法度榜样,在面对并发场景的时刻仍然可能出现问题:比如比来我们就碰着了一个linux kernel在调用某个体系函数时因为同步问题而出现crash的情况。

而是否高质量的实现并发编程的关键并不是是否应用了某种同步策略,而是看代码中是否保护了共享资本:

  • 局部变量之外的内存拜访都有并发风险(比如拜访对象的属性,拜访静态变量等)
  • 拜访共享资本也会有并发风险(比如缓存、数据库等)。
  • 被调用方如不雅不是声明为线程安然的,那么很有可能存在并发问题(比如java的hashmap)。
  • 所有依附时序的操作,即使每一步操作都是线程安然的,照样存在并发问题(比如先删除一笔记录,然后把记录数减一)。

前三种情况可以或许比较简单的经由过程代码本身分辨出来,只要简单培养一下本身对于共享资本调用的敏感度就可以了。

2.2.4.推荐浏览

然则对于最后一种情况,往往很难简单的经由过程看代码的方法看出来,甚至出现并发问题的两处调用处不是在同一个法度榜样里(比如两个体系同时读写一个数据库,或者并发的调用了一个法度榜样的不合模块等)。然则,只如果代率攀里出现了不加锁的,拜访共享资本的“先做A,再做B”之类的逻辑,可能就须要进步当心了。

写代码的第一步是懂得什么是好代码。在预备bootcamp的课程的时刻,我就为这个问题犯了难,我测验测验着用一些精确的定义区搀扶“优等品”、“良品”、“补苷史”;然则在总结的过程中,关于“什么是好代码”的描述却大年夜多没有可操作性


  推荐阅读

  机器学习研究趋势分析:TensorFlow已超越Caffe成研究最常用框架

还有,在 InceptionNet 之前谁在评论辩论「inception」?对此也很好奇。开打趣地说,如今提交论文的主题是不是应当环绕把全卷积编码器解码器BatchNorm ResNet GAN应用于风格迁徙,用 Adam >>>详细阅读


本文标题:关于烂代码的那些事——什么是好代码

地址:http://www.17bianji.com/lsqh/34700.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)