设计之美

yong 17天前 19


01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
提高复杂代码的设计和开发能力
让读源码、学框架事半功倍

02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能 力?
灵活性(flexibility)、可扩展性(extensibility)、可维护性(maintainability)、可 读性(readability)、可理解性(understandability)、易修改性(changeability)、 可复用(reusability)、可测试性(testability)、模块化(modularity)、高内聚低耦 合(high cohesion loose coupling)、高效(high effciency)、高性能(high performance)、安全性(security)、兼容性(compatibility)、易用性 (usability)、整洁(clean)、清晰(clarity)、简单(simple)、直接 (straightforward)、少即是多(less code is more)、文档详尽(welldocumented)、分层清晰(well-layered)、正确性(correctness、bug free)、健 壮性(robustness)、鲁棒性(robustness)、可用性(reliability)、可伸缩性 (scalability)、稳定性(stability)、优雅(elegant)、好(good)、坏(bad)
1. 可维护性(maintainability)
2. 可读性(readability)
3. 可扩展性(extensibility)
4. 灵活性(flexibility)
5. 简洁性(simplicity)
思从深而行从简,真正的 高手能云淡风轻地用最简单的方法解决最复杂的问题。
6. 可复用性(reusability)
7. 可测试性(testability)
需要掌握一些更加细化、更加能落地的编程方 法论,包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。

03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何 关系?
编程风格有三种,它们分别是面向过程、面向对象和函数式编 程。
7 个大的知识点
面向对象的四大特性:封装、抽象、继承、多态 面向对象编程与面向过程编程的区别和联系 面向对象分析、面向对象设计、面向对象编程 接口和抽象类的区别以及各自的应用场景 基于接口而非实现编程的设计思想 多用组合少用继承的设计思想 面向过程的贫血模型和面向对象的充血模型

设计原则是指导我们代码设计的一些经验总结。设计原则这块儿的知识有一个非常大的特 点,那就是这些原则听起来都比较抽象,定义描述都比较模糊,不同的人会有不同的解读。
SOLID 原则 -SRP 单一职责原则 SOLID 原则 -OCP 开闭原则 SOLID 原则 -LSP 里式替换原则 SOLID 原则 -ISP 接口隔离原则
SOLID 原则 -DIP 依赖倒置原则 DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
1. 创建型 常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。 不常用的有:原型模式。 2. 结构型 常用的有:代理模式、桥接模式、装饰者模式、适配器模式。 不常用的有:门面模式、组合模式、享元模式。 3. 行为型 SOLID 原则 -DIP 依赖倒置原则 DRY 原则、KISS 原则、YAGNI 原则、LOD 法则 常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。 不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

重构的目的(why)、对象(what)、时机(when)、方法(how); 保证重构不出错的技术手段:单元测试和代码的可测试性; 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。

04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
面向对象编程的英文缩写是 OOP,全称是 Object Oriented Programming。
面向对象编程中有两个非常重要、非常基础的概念,那就是类(class)和对象 (object)。
讲到面向对象分析、设计、编程,我们就不得不提到另外一个概念,那就是 UML(Unified Model Language),统一建模语言。很多讲解面向对象或设计模式的书籍,常用它来画 图表达面向对象或设计模式的设计思路。

1. 什么是面向对象编程? 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封 装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。 2. 什么是面向对象编程语言? 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对 象编程四大特性(封装、抽象、继承、多态)的编程语言。 3. 如何判定一个编程语言是否是面向对象编程语言? 如果按照严格的的定义,需要有现成的语法支持类、对象、四大特性才能叫作面向对象编程 语言。如果放宽要求的话,只要某种编程语言支持类、对象语法机制,那基本上就可以说这 种编程语言是面向对象编程语言了,不一定非得要求具有所有的四大特性。 4. 面向对象编程和面向对象编程语言之间有何关系?
面向对象编程一般使用面向对象编程语言来进行,但是,不用面向对象编程语言,我们照样 可以进行面向对象编程。反过来讲,即便我们使用面向对象编程语言,写出来的代码也不一 定是面向对象编程风格的,也有可能是面向过程编程风格的。 5. 什么是面向对象分析和面向对象设计? 简单点讲,面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么做。两个阶 段最终的产出是类的设计,包括程序被拆解为哪些类,每个类有哪些属性方法、类与类之间 © 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。 如何交互等等。

05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
封装(Encapsulation)
封装特性。封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问 接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。

抽象(Abstraction)
而抽象作为一种只关注功能点不关注实现的设计思路

继承(Inheritance)
继承最大的一个好处就是代码复用。

多态(Polymorphism)
多态是 指,子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
“继承加方法重写”   多态特性能提高代码的可扩展性和复用性。

重点回顾
1. 关于封装特性 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类 提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。封装特性存在的意义,一方面是保护数据 不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用 性。 2. 关于抽象特性 封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让使用者只 需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。抽象可以通过接口类或 者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代 码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也 是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。 3. 关于继承特性
继承是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。单继承表示一个子 类只继承一个父类,多继承表示一个子类可以继承多个父类。为了实现继承这个特性,编程 语言需要提供特殊的语法机制来支持。继承主要是用来解决代码复用的问题。 4. 关于多态特性 多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态这种特 性也需要编程语言提供特殊的语法机制来实现,比如继承、接口类、duck-typing。多态可 以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。

06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时 了吗?
什么是面向过程编程与面向过程编程语言?
面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并 将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。

1.OOP 更加能够应对大规模复杂程序的开发
面向对象编程还提供了一种更加清晰的、更加模块化的代码组织方式。

2.OOP 风格的代码更易复用、易扩展、易维护
封装特性是面向对象编程相比于面向过程编程的一个最基本 的区别,因为它基于的是面向对象编程中最基本的类的概念。
在设计实现类的时候,除非真的需要,否则尽量不要给属性定义 setter 方法。除此之外, 尽管 getter 方法相对 setter 方法要安全些,但是如果返回的是集合容器,那也要防范集合 内部数据被修改的风险。
3.OOP 语言更加人性化、更加高级、更加智能

面向对象编程相比起面向过程编程的优势主要有三个。
对于大规模复杂程序的开发,程序的处理流程并非单一的一条主线,而是错综复杂的网 状结构。面向对象编程比起面向过程编程,更能应对这种复杂类型的程序开发。 面向对象编程相比面向过程编程,具有更加丰富的特性(封装、抽象、继承、多态)。 利用这些特性编写出来的代码,更加易扩展、易复用、易维护。 从编程语言跟机器打交道的方式的演进规律中,我们可以总结出:面向对象编程语言比 起面向过程编程语言,更加人性化、更加高级、更加智能。

07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
1. 滥用 getter、setter 方法
而面向对象封装的定义是:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限 的接口访问、修改内部数据。

2. 滥用全局变量和全局方法

3. 定义数据和方法分离的类

08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接 口?

最新回复 (0)
返回
发新帖