? ? 设计模式之美 ? ? 历经两个月的时间,终于看完了王争的《设计模式之美》。 这本书还是很值得一读的,作者对设计理念、设计模式思考的比较深,而且将这些思想运用到实际的工作中,使设计模式显得不那么空;另外这本书花了很大的篇幅来讲设计的理念,讲的比较通透,这是很难得,因为无论哪种设计模式,最终都会映射回理念,设计理念才是根本性的东西。 通过阅读设计模式相关的书籍,现在已经完成了5篇文章: Go设计模式(5)-类图符号表示法 Go设计模式(4)-代码编写优化 Go设计模式(4)-代码编写 Go设计模式(3)-设计原则 Go设计模式(2)-面向对象分析与设计 Go设计模式(1)-语法 后面也会进入设计模式文章的书写,这么做虽然导致学习进度慢了,但是能够将这些知识掌握的更加扎实,那就是值得的。 下面是做的读书笔记,大家有兴趣可以看一下,如果觉得合适,可以去极客时间购买全本。 读书笔记 开篇词 只会写能用的代码,我们永远成长不成大牛,成长不成最优秀的那批人 写好的代码是为未来节省时间 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识 应对面试中的设计模式相关问题; 告别写被人吐槽的烂代码; 提高复杂代码的设计和开发能力; 让读源码、学框架事半功倍; 为你的职场发展做铺垫 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力? 可维护性:所谓“代码易维护”就是指,在不破坏原有代码设计、不引入新的bug的情况下,能够快速地修改或者添加代码。 可读性:需要看代码是否符合编码规范、命名是否达意、注释是否详尽、函数是否长短合适、模块划分是否清晰、是否符合高内聚低耦合等等 可扩展性:代码的可扩展性表示,我们在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。 灵活性:如果一段代码易扩展、易复用或者易用,我们都可以称这段代码写得比较灵活。所以,灵活这个词的含义非常宽泛,很多场景下都可以使用 简洁性:代码简单、逻辑清晰,也就意味着易读、易维护 可复用性:尽量减少重复代码的编写,复用已有的代码 可测试性:代码的可测试性差,比较难写单元测试,那基本上就能说明代码设计得有问题 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系? 理论一:当谈论面向对象的时候,我们到底在谈论什么? 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题? 封装:也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。 抽象:人类处理复杂性的有效手段 继承:继承最大的一个好处就是代码复用,用来表示类之间的is-a关系 多态:提高代码的扩展性和复用性 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗? 面向对象编程比起面向过程编程,更能应对这种复杂类型的程序开发;面向对象编程相比面向过程编程,具有更加丰富的特性(封装、抽象、继承、多态),利用这些特性编写出来的代码,更加易扩展、易复用、易维护; 理论四:哪些代码设计看似是面向对象,实际是面向过程的? 面向过程编程风格符合人的流程化思维方式;而面向对象编程风格正好相反,是一种自底向上的思考方式。 滥用getter、setter方法 Constants类、Utils类的设计问题 基于贫血模型的开发模式 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口? 抽象类实际上就是类,只不过是一种特殊的类,这种类不能被实例化为对象,只能被子类继承。我们知道,继承关系是一种is-a的关系,那抽象类既然属于类,也表示一种is-a的关系。相对于抽象类的is-a关系来说,接口表示一种has-a关系,表示具有某些功能。对于接口,有一个更加形象的叫法,那就是协议(contract)。 抽象类更多的是为了代码复用,抽象类能够优雅的保证多态特性 接口就更侧重于解耦 如果我们要表示一种is-a的关系,并且是为了解决代码复用的问题,我们就用抽象类;如果我们要表示一种has-a关系,并且是为了解决抽象而非代码复用的问题,那我们就可以使用接口。 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗? 基于接口而非实现编程”这条原则的另一个表述方式,是“基于抽象而非实现编程”。 越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性,越能应对未来的需求变化。好的代码设计,不仅能应对当下的需求,而且在将来需求发生变化的时候,仍然能够在不破坏原有代码设