编程是一门创造性的工作,是一门艺术。我们每天与代码打交道,为什么普通码农辛苦一年只拿十万,而高级架构师年薪百万。最主要的就是我们敲出来的代码有差别,差别在意大部分码农敲出来坏的代码,而高级架构师能敲出优雅的好的代码。

我们每天都会敲代码,但当被问道什么是好的优雅的代码时,大家可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。显然,这个问题并没有唯一的标准答案,谁都可以谈论自己的理解。要成为合格的架构师最基本的要求是能写好的优雅的代码,所以必须要知道什么是优雅代码。这篇文章我来分享一下阿里系高级架构师对于好的优雅代码的理解。

一句话概括

衡量代码质量的唯一有效标准:WTF/min —— Robert C. Martin

Martin(Bob大叔)曾在《代码整洁之道》一书中说:当你的代码在做 Code Review 时,审查者要是愤怒地吼道:“What the fuck, is this shit?”、“Dude, What the fuck!”等言辞激烈的词语,那说明你写的代码是 Bad Code,如果审查者只是漫不经心的吐出几个:“What the fuck?”,那说明你写的是 Good Code。

衡量代码质量的唯一标准就是每分钟骂出“WTF”的频率。

我敢打赌每个人都遇到过这样的情况:过几周或者几个月之后,再看到自己写的代码,感觉一团糟,不禁怀疑人生。

我们自己写的代码,一段时间后自己看尚且如此,更别提拿给别人看了。

一、好的优雅的代码

我们如何来形容好的优雅的代码?好的优雅的代码一定具备以下特征:

  • 精简代码,可读性高
  • 逻辑清晰
  • 高内聚,低耦合
  • OOP三大特征(封装、继承、多态)

1、精简代码,可读性高

任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。—— Martin Fowler

assert((!(bucket = findBucket(key))) || !bucket.isOccupied());

上面这行代码虽然比较短,但是难以阅读。为了更好地阅读,我们做如下修改:

1.  bucket = findBucket(key);if(bucket != null){
2.  assert(!bucket.isOccupied());}

减少代码行数是一个好目标,但是让阅读代码的事件最小化是个更好的目标。

但是这些词没有任何指导意义,我准备从最基本的概念入手。

所以,谈到好代码,首先跳入自己脑子里的一个词就是:精简。

好的代码一定是精简的,给阅读的人一种轻松愉快感觉。

2、逻辑清晰

对代码的逻辑层次要有感觉。

比如大体上,一个程序会分三个层次:界面层,逻辑层,数据层。简化后一般也有两个层次:界面和逻辑层。

逻辑层是去掉外表的,内在的,实质的东西。一般来说,就是表现为对数据的一组操作。

而界面层,是关注程序应该如何和用户沟通的。比如可视的视窗,图表,控件等。它是内部逻辑的呈现,也是用户和内部逻辑沟通的桥梁。

区分这两个层次的好处,一个是这两个层次所注重的核心内容有所不同,用到的技巧或者指导方法有所差别。第二点是,可以将问题解构和局部化,减轻开发难度。第三点,有助分开来修改内容,比如界面层挪动一下,改变一下形式,并不需要修改逻辑层的;而逻辑层改进一下算法,也不会影响界面层的代码。

对代码的逻辑层次有感觉,以上的要求只是很基本的,编写代码要时时刻刻对当前代码所代表的逻辑层次要有“感觉”,要能意识到这段代码和上一段代码是否在某种标准下,处在同一个层次。比较经典的范例如:互联网的7层协议,还有操作系统的层次分部等。编写代码要善于归纳这些层次,才能建构一个优美的结构。

3、高内聚低耦合

高内聚低耦合几乎是每个程序员员都会挂在嘴边的,但这个词太过于宽泛,太过于正确,所以聪明的编程人员们提出了若干面向对象设计原则来衡量代码的优劣:

  • 开闭原则 OCP (The Open-Close Principle)
  • 单一职责原则 SRP (Single Responsibility Principle)
  • 依赖倒置原则 DIP (Dependence Inversion Principle)
  • 最少知识原则 LKP (Least Knowledge Principle)) / 迪米特法则 (Law Of Demeter)
  • 里氏替换原则 LSP (Liskov Substitution Principle)
  • 接口隔离原则 ISP (Interface Segregation Principle)
  • 组合/聚合复用原则 CARP (Composite/Aggregate Reuse Principle)

这些原则想必大家都很熟悉了,是我们编写代码时的指导方针,按照这些原则开发的代码具有高内聚低耦合的特性。换句话说,我们可以用这些原则来衡量代码的优劣。

但这些原则并不是死板的教条,我们也经常会因为其他的权衡(例如可读性、复杂度等)违背或者放弃一些原则。比如子类拥有特性的方法时,我们很可能打破里氏替换原则。再比如,单一职责原则跟接口隔离原则有时候是冲突的,我们通常会舍弃接口隔离原则,保持单一职责。只要打破原则的理由足够充分,也并不见得是坏的代码。

4、OOP三大特征

4.1封装

尽可能隐藏一个模块的实现细节(属性名称,属性是否可变,算法,数据结构,数据类型)

访问控制只是为了防止程序员的无意误用,不打算,也无法防止程序员的故意破坏

4.2继承

继承使用不当会破坏封装,造成信息泄露

先考虑组合,在考虑继承

继承是 behaves-like-a, is-substitutable-for 的关系,不是 is-a 或 is-a-kind-of 的关系

4.3多态

  • 相同的实现代码适用不同的场合
  • 不同的实现代码适用相同的场合

二、如何判断不是好的代码

讨论了好代码的必要条件,我们再来看看好代码的否定条件:什么不是好的代码。Kent Beck 使用味道来形容重构的时机,我认为当代码有坏味道的时候,也代表了其并不是好的代码。

代码的坏味道

► 重复

重复可能是软件中一切邪恶的根源。—— Robert C.Martin

Martin Fowler 也认为坏味道中首当其冲的就是重复代码。

很多时候,当我们消除了重复代码之后,发现代码就已经比原来整洁多了。

► 函数过长、类过大、参数过长

过长的函数解释能力、共享能力、选择能力都较差,也不易维护。

过大的类代表了类做了很多事情,也常常有过多的重复代码。

参数过长,不易理解,调用时也容易出错。

► 发散式变化、霰弹式修改、依恋情结

如果一个类不是单一职责的,则不同的变化可能都需要修改这个类,说明存在发散式变化,应考虑将不同的变化分离开。

如果某个变化需要修改多个类的方法,则说明存在霰弹式修改,应考虑将这些需要修改的方法放入同一个类。

如果函数对于某个类的兴趣高于了自己所处的类,说明存在依恋情结,应考虑将函数转移到他应有的类中。

► 数据泥团

有时候会发现三四个相同的字段,在多个类和函数中均出现,这时候说明有必要给这一组字段建立一个类,将其封装起来。

► 过多的 if…else 或者使用 switch

过多的 if…else 或者 switch ,都应该考虑用多态来替换掉。甚至有些人认为除个别情况外,代码中就不应该存在 if…else 。

从事前端6年,一个人学习会有迷茫,动力不足。这里推荐一下我的前端学习交流qun:731771211 ,里面都是学习前端的,如果你想制作酷炫的网页,想学习编程。自己整理了一份最新最全面前端学习资料,从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到移动端HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴,有想学习web前端的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

点击:加入
三、总结

本文首先一句话概括了我认为的好的优雅代码的必要条件:精简,逻辑清晰,高内聚,低耦合,接着具体分析了坏代码的特点,什么样的代码不是好的代码。仅是本人的一些见解,希望对各位以后的编程有些许的帮助。

对于如何保持代码整洁,离不开设计模式和代码重构,多阅读开源社区的代码,比如最近微信开源的MMKV就可以读来学习,像世界同行大佬学习交流如何优雅的写代码,也可以读一些经典的书籍如《代码整洁之道》、《重构改善既有代码的设计》、《重构改善既有代码的设计》等等。

年薪10万与年薪100万的程序员,写出代码的区别相关推荐

  1. 100位中国人存款7.8万亿!100位是程序员?遍身萝绮者不是养蚕人

    在论坛上看到一条帖子,脑袋一晃,手滑点了进去: 对不起,我当初不该点进来的,对我的小心脏造成了沉重的打击. 如果如图所述是真,那还真是太可怕了. 100人存款合计7.8万亿元,平均下来每人有780亿元 ...

  2. 博士招生从1万到10万再到100万

    努力学习的速度要跑赢学历学位贬值的速度: 拼搏工作的能力要跑赢物价房价上涨的趋势! 2021年一篇报道如上: 关于大扩招,有如下趋势,不管是抛物线增长或指数增长: 一年上限10%,以10%计算. 突破 ...

  3. 请问炒股怎么样才能把10万本金翻到100万?

    想要通过炒股从10万本金到100万,具体可以按照以下方面操作: 方法一:做价值投资,放长线钓大鱼,你看好一只成长股,然后用10万元全仓持有,若干年之后也许就会实现了. 比如持有贵州茅台.万科A.跟格力 ...

  4. 注册资本1000万实缴100万违法吗

    一.注册资本1000万实缴100万违法吗 1.注册资本1000万实缴100万一般不违法. 但若为股份有限公司采取募集方式设立的,或法律另有规定,公司成立必须要实缴出资等情况的,必须依法缴纳出资额,否则 ...

  5. 腾讯程序员晒出了自己近五年的年薪,这涨幅简直叫人羡慕

    腾讯程序员晒出了自己近五年的年薪,这涨幅简直叫人羡慕: 15年年薪22万 16年年薪45万 17年年薪65万 18年年薪88万 19年年薪100万 20年年薪128万 推荐阅读 为什么阿里巴巴的程序员 ...

  6. 本科毕业四年时间如何从月薪7k到年薪60w,讲下个人从菜鸟程序员到公司核心开发工程师的历程!

    本科毕业四年时间如何从月薪7k到年薪60w,讲下个人从菜鸟程序员到公司核心开发工程师的历程,本帖主要分享下个人经历,只要努力最终会收获一个相对于自己较好的结果的,工位照镇楼 毕业四年到现在总共换了三份 ...

  7. 10月,你知道有哪些程序员热点新书上榜了吗?

    10月,你知道有哪些程序员热点新书上榜了吗? 金秋十月,冷意敲然来到我们身边,注意防寒,以免感冒.小编给大家汇总一下近期上榜好书,作为你选书的依据. 1.计算广告 互联网商业变现的市场与技术 第2版 ...

  8. ie 访问 java接口_2019年面试总结,100道Java程序员面试题(含答案)分享

    2019年即将结束,一边是大批同学涌入职场,另一边是大群职场人打算跳槽,在这个重要的节点,Java程序员如何才能把握时机,搞定面试官,拿到一份心仪的工作呢? 除了掌握扎实的专业技能之外,你还需要一份& ...

  9. 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 10 日,在 120 年前的今天,瑞典国王和挪威诺贝尔基金会首次颁发了诺贝尔奖.根据诺贝尔 ...

最新文章

  1. web标准的投资回报
  2. spark代码中添加logger_Spark的日志配置
  3. eclipse替换空格和注释
  4. 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares
  5. DataGridView 用户输入时,单元格输入值的设定
  6. html%3ca%3e标签,How do I encode “” in a URL in an HTML attribute value?
  7. 数学在计算机科学上的应用文献,数学计算机论文,关于计算机在数学教学中的应用相关参考文献资料-免费论文范文...
  8. 周末给女友讲了遍加密算法,没想到...
  9. crt安装mysql安装包_Linux安装MySQL步骤
  10. pytorch学习率衰减
  11. Mac新手使用技巧——Mac音量调节
  12. Windows2003 Server下尝试360安全卫士6.0
  13. 计算机基础知识_进制转化
  14. 解决Rocketdock在win7上重启后不能保存设置和图标的问题
  15. mid制作乐谱_【图片】分享一个自己编写的打谱软件,支持生成简谱、乐谱演奏、MID输出_简谱吧_百度贴吧...
  16. 51单片机4位抢答器_倒计时可调仿真设计
  17. 局域网聊天程序 java MySQL_局域网聊天软件设计与实现(Linux,C++,MySQL)
  18. 在Ubuntu 22.04上安装WRF-Chem模型4.4版本和KPP
  19. 2019-成长的一年
  20. 优雅计算算式:后缀表达式

热门文章

  1. true在python是什么意思_Python3中真真假假True、False、None等含义是什么
  2. 【Opencv基础学习】 VideoWriter打开本地摄像头并保存mp4格式视频
  3. plc的日常维护和保养
  4. Brave浏览器安装在deepin linux上,报错
  5. 机械革命蛟龙16Windows重装流程
  6. 地平线检测horizon line detection
  7. 借记/贷记交易处理流程
  8. 《An End-to-End Neural Network for Image Cropping by Learning Composition from Aesthetic Photos》
  9. 【服务器数据恢复】哪些故障会导致服务器数据丢失?多块硬盘离线的数据恢复案例
  10. html scale属性,CSS中的zoom属性和scale属性的用法及区别