作者:延晨、杨珺、营帅、雪冉、旭光我们收到的简历中几乎所有人都声称“熟悉面向对象”,但很少人能够概括面向对象方法和原则,面向对象设计和过程式设计的关键区别在哪,以及怎么定义和衡量可读性、究竟什么是可复用性、怎样的代码称为脆弱和僵化的。本文从 SOLID 原则出发,通过更贴近业务的解释性文字和具体的代码示例来回答这些问题。<br>什么是 SOLID?<br>在程序设计领域,SOLID 是由 Robert C. Martin(敏捷宣言作者之一,曾任敏捷联盟主席)在21世纪早期提出的便于记忆的首字母缩写,指代面向对象编程和面向对象设计的五个基本原则:单一功能、开闭原则、里氏替换、接口隔离以及依赖反转。在这一章我们只关注这些原则各自的定位和它们之间的关系。见下图:<br>概括地讲(下文会具体展开):单一职责是所有设计原则的基础,开闭原则是设计的终极目标。里氏替换原则强调的是子类替换父类后程序运行时的正确性,它用来帮助实现开闭原则。而接口隔离原则用来帮助实现里氏替换原则,同时它也体现了单一职责。依赖倒置原则是过程式设计与面向对象设计的分水岭,同时它也被用来指导接口隔离原则。<br>什么时候应该应用原则?<br>设计原则和设计模式都是经验的总结,方便分析和解决问题,但并不能用来判断是否存在问题。例如下面这段代码:<br>它违反了单一职责:这个 main 方法即获取了当前日期,又做了日期的处理,数据的写入。这个违反让它更难理解和维护了吗?它违反了开闭原则:很显然这个逻辑并不是可扩展的,只能通过修改的方式去增加功能。这个违反让它更难修改了吗?它违反了依赖倒置原则:main函数直接依赖底层模块fs的writeFile方法,调用main时必须和fs模块绑定。这个绑定让它无法在其他 fs 实现里复用,但是会有这个需求吗?<br>对于一个负责日常工作的、功能不太会扩展的小脚本而言,这段代码是比较完美的。当我们不认为它维护困难时,就不应该对它套用各种原则和模式来把问题复杂化(或过度设计)。当这段代码变得更复杂,我们发现它难以维护时,再去应用原则来诊断和分析问题。有这样的概念后,我们再来看具体的每项原则。<br>单一职责原则<br>内容:一个类只负责一件事,只有一个引起它变化的原因。<br>单一职责希望避免的问题很简单:避免修改一个地方反而引发另一个地方的问题。如果你的项目经常发生这样的问题,
4个字母的英文单词: tree 树、edit 编辑、girl 女孩、wake 唤醒、envy 羡慕。<br>一、tree <br>英[tri:] 美[tri] <br>n. 树; 木料; 树状图; 宗谱; <br>vt. 把…赶上树; 使处于困境; 把鞋型插入(鞋内); <br>[例句]I planted those apple trees.<br>我栽了那些苹果树。<br>[其他] 第三人称单数:trees 复数:trees 现在分词:treeing 过去式:treed过去分词:treed <br>二、edit <br>英[ˈedɪt] 美[ˈɛdɪt] <br>vt. 编辑; 剪辑(影片,录音); 校订; 主编; <br>n. 编辑; <br>[例句]The majority of contracts give the publisher the right to edit a book after it's done.<br>大多数合同都赋予出版商在书稿完成后进行校订的权利。<br>[其他] 第三人称单数:edits 现在分词:editing 过去式:edited 过去分词:edited <br>三、girl <br>英[gɜ:l] 美[gɜ:rl] <br>n. 女孩; 姑娘,未婚女子; 女职员,女演员; (男人的) 女朋友; <br>[例句]I must have been a horrid little girl.<br>我一定是个人见人烦的小女孩。<br>[其他] 复数:girls <br>四、wake <br>英[weɪk] 美[wek] <br>vi. 醒,醒来; 苏醒,复活; 警觉; 弄醒,叫醒; <br>vt. 激发,唤醒; 使意识到,使警觉; 为…守夜; <br>n. 守灵,守夜; (船航过时的) 尾波; 年度假期; <br>[例句]It was cold and dark when I woke at 6.30<br>我6点半醒来时,天又冷又黑。<br>[其他] 第三人称单数:wakes 现在分词:waking 过去式:woke过去分词:woken <br>五、envy <br>英[ˈenvi] 美[ˈɛnvi] <br>n. 羡慕; 嫉妒,妒忌; <br>vi. 感到妒忌; 显示出妒忌; <br>[例句]Gradually he began to acknowledge his feelings of envy towards his mother<br>渐渐地,他开始承认自己羡慕母亲。<br>[其他] 第三人称单数:envies 复数:envies 现在分词:envying 过去式:envied过去分词:envied