什么是好代码

1. 好代码必须是看起来很舒服,很干净

象一篇好文章,不罗嗦,容易懂,有头有尾

各个层次,模块及函数分工明确,各司其职, 望文知义

接口即契约,要足够简单,易懂易用, 窄接口好过宽接口

其实只要符合代码规范,命名简单易懂,代码就没那么丑

参见 Google 的代码风格指南

看看重构那本书中的臭味介绍, 可以提高品味

2. 好代码要符合基本的编码原则

首先我们先谈谈几个软件开发的普适原则

KISS

KISS: Keep It Simple and Straight 保持简单和直接, 适当隐藏复杂性

或者

KISS: Keep It Simple and Stupid 保持简单, 象傻瓜一样, 不要让别人多加思考

软件接口或 API 的设计要让人一看就明白, 一看就知道作者的意图和想法, 如何使用它, 有什么结果和可能的异常及副作用. 看过很多代码, 踩过许多坑, 大多是作者或者我自己使用了出乎意料的实现, 不做好必要的抽象和封装, 复杂的判断和算法到处都是

DRY – Don't Repeat Yourself

别重复你自己, 如有重复代码, 请抽象或重用

SRP - Single Responsibility Principle

单一职责原则: 就一类而言, 应该仅有一个引起它变化的原因

也有一个别称 DOTADIW - Do One Thing and Do It Well 就做一件事并做好它

OCP - Open Close Principle

开放封闭原则: 软件实体(类,模块,函数等)应该是可以扩展的, 但是不可修改

LSP

LSP替换基类原则: 子类型应该可以替换掉它们的基类型

DIP

DIP依赖倒置原则: 抽象不应该依赖于细节, 细节应该依赖于抽象

ISP

ISP接口隔离原则: 不应该强迫客户依赖于它们不用的方法, 接口属于客户, 不属于它所在的类层次结构

REP

REP重用发布等价原则: 重用的粒度就是发布的粒度

CCP

CCP共同封闭原则: 包中的所有类对于同一类性质的变化应该是共同封闭的. 一个变化若对一个包产生影响, 则将对包中所有的类产生影响, 而对于其他的包不造成任何影响

CRP

CRP共同重用原则: 一个包中的所有类应该是共同重用的. 如果重用了包中的一个类, 那么就要重用包中的所有类

ADP

ADP无环依赖原则: 在包的依赖关系图不允许存在环

SDP

SDP稳定依赖原则: 朝着稳定的方向进行依赖.

SAP

SAP稳定抽象原则: 包的抽象程度应该和其稳定程度一致

设计模式和面向对象设计中讲了很多,不再赘述

3. 好代码要易于理解,测试和修改

封装好复杂性,区分开经常变化与基本不变的代码, 适当抽取易变参数作为配置

还是书里那句话,高内聚,低耦合,依赖倒置

例如最常用的 MVC 模式,为什么我们要分成模型,视图和控制器三块,原因之一就在于分开易变的与不易变的,分开不会在一起变化的部分,减小每次修改的范围。

如果某个方面的功能需要修改,最好是改个配置, 其次是加几行代码或传个不同参数,最差的就是改多个地方,加多个判断, 作霰弹式修改

4. 好代码要考虑周到

各种逻辑流程和意外情况的处理要面面俱到, 单元和模块测试要覆盖异常逻辑和边界

对于服务质量 SLA 要考虑周全, 简单说起来就是满足用户的以下基本需求

  1. 功能性
  2. 稳定性
  3. 可靠性
  4. 性能
  5. 可维护性
  6. 可移植性
  7. 灵活性

5. 好代码要与时俱进,自我蜕变

人会变老,代码也会,新业务,新技术,新架构,新框架层出不穷,要大胆试验,小心引入,逐步演进,不必抱残守缺,也不要盲目冲动

一般来说,要封装好业务逻辑,核心业务不会大变,即使推到重写也要理解和参照老系统的业务流程

最后,引述一下,Python 之禅

Python 之禅

虽然说的是Python, 其实适用于多数编程语言

英文 中文
Beautiful is better than ugly. 美比丑好
Explicit is better than implicit. 明显比隐晦好
Simple is better than complex. 简单比复杂好
Complex is better than complicated. 复杂比难懂好
Flat is better than nested. 扁平比嵌套好
Sparse is better than dense. 稀疏比稠密好
Readability counts. 可读性很重要
Special cases aren't special enough to break the rules. 特例也不要打破这个原则
Although practicality beats purity. 尽管实践会破坏纯洁性
Errors should never pass silently. 错误还是不能让其悄然滑过
Unless explicitly silenced. 除非你明确声明不用理会它
In the face of ambiguity, refuse the temptation to guess. 别让人来猜测不确定的可能性
There should be one-- and preferably only one --obvious way to do it. 应该有一个且只有一个比较好的明显的方法来做事
Although that way may not be obvious at first unless you're Dutch. 尽管那个方法可能并非一开始就显而易见
Now is better than never. 现在就做比永远不做好
Although never is often better than right now. 尽管永远不做经常比马上就动手做好
If the implementation is hard to explain, it's a bad idea. 如果实现很难解释清楚, 那它不是一个好主意
If the implementation is easy to explain, it may be a good idea. 如果实现很容易说清楚, 那它是个好主意
Namespaces are one honking great idea – let's do more of those! 命名空间是个绝妙点子, 让我们那样做得更多

简单总结一下

  • 文学化编程,想清楚,整明白,胸有成竹,下手千行
  • 测试驱动,不做额外的无用功,不追求覆盖率,为的是增强自信心
  • 度量驱动,代码上线怎么办,如何易于度量和调优
  • 为未来设计有限的灵活性,高聚低耦,无需多改容易扩展
  • 考虑周全,足够的健壮,不易出错,不怕出错

参考

  • Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin
  • Clean code by Robert C. Martin
  • Refactoring: Improving the Design of Existing Code Martin Fowler
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 前言 最近在团队推行Code Review,遇到一个头痛的问题。当向伙伴的代码提一个comment时,他们不解为什...
    CatchZeng阅读 5,172评论 1 19
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,631评论 18 399
  • ① 我分手了,我记得第一次见到他的时候,就一个字,帅。那张清秀的脸蛋,炯炯有神的眼睛,鼻如悬胆,白嫩的皮肤,完美的...
    只懂女人心阅读 640评论 3 7
  • 文JIE胭脂雪 【一念天堂地狱】目录 欢迎点击 【上一章】一念天堂地狱28——自卑虚荣是种病,得治! 既然有了新欢...
    JIE胭脂雪阅读 415评论 0 1