框架设计总结
编程历史看面向对象编程的本质和未来
面向过程编程语言本质是面向逻辑的,逻辑是线性的,当开发大型、复杂的系统,线性逻辑就会难免的耦合,随着系统越大,耦合程度越大。面向对象编程就是解决这种耦合问题。
编程语言实质
目的:用计算机解决现实世界问题。
编程过程:在计算机所能理解的“模型”(解空间)和现实世界(问题空间)之间建立一种联系。
编程语言是一种“抽象”机制,问题是对“谁”的抽象。
![](https://static001.geekbang.org/infoq/fe/fe50eddb973a27bbdd289dd67505915c.png)
面向对象编程描述:
l 万物皆对象;
l 程序是对象的集合,它们通过发送消息来告知彼此所要做的;
l 每个对象都有自己的由其他对象所构成的存储;
l 每个对象都拥有其类型;
l 某一特定类型的所有对象都可以接收同样的消息;
面向对象编程与面向对象分析
面向对象编程不是使用面向对象编程语言进行编程,而是利用多态特性进行编程。
面向对象分析是将客观世界,即编程的业务领域进行对象分析。
l 充血模型与贫血模型
l 领域驱动设计DDD
面向对象设计的目的和原则
面向对象设计目的:强内聚、低耦合,从而是系统
易扩展-易于增加新功能
更强壮-不容易被粗心程序员破坏
可移植-能够在多环境运行
更简单-容易理解、容易维护
面向对象设计原则:
未达到上述目标,总结出多种指导原则。
原则是独立于编程语言的,甚至可以用于非面向对象的编程语言。
设计模式
设计模式是解决某一种问题的通用的解决方案。
设计模式也是语言中立的。
设计模式贯彻了设计原则。
3大类23种基本的设计模式
l 创建模式
l 行为模式
l 结构模式
框架
框架是用来实现某一类应用的结构性的程序,是对某一类架构方案可复用的设计与实现。
n 如同框架的大厦结构
n 简化应用开发者的工作。
n 实现多种设计模式,使得开发者不用花太大力气,就能设计出结构良好的程序来。
糟糕代码特点
僵化性:很难对系统进行改造,每个改造都会迫使系统其它部分的改动。
脆弱性:对系统的改动会导致系统跟改动无关的地方出现问题。
牢固性:系统耦合太紧密,无法使部分功能成为可重用的组件。
粘滞性:由于系统原有的设计,为保持尽量小的改动,只能保持原来设计思路,导致组件或系统越来越庞大以及难以维护。如果进行拆分,重新设计,需要付出更大代价。
不必要的复杂性:设计中包含不具有任何好处的基础结构。
不必要的重复性:设计中未对可以重复使用的功能结构进行抽象。
晦涩性:很难进行理解。
OOD原则:开闭原则
电话拨号案例分析:
方式1:对Button简单抽象
![](https://static001.geekbang.org/infoq/a8/a85dedf997c65c2bedff0bfa55a1b776.png)
方式2:策略模式
![](https://static001.geekbang.org/infoq/f6/f63ede0b5123b668ec17112ca6c4fba8.png)
方式3:适配器模式
![](https://static001.geekbang.org/infoq/7e/7e32b66c21e59f0889aec0df6c46c82e.png)
方式4:观察者模式:解决button有新的操作功能时
![](https://static001.geekbang.org/infoq/4e/4eb689e655c734d82417b185d3c87024.png)
OOD原则:依赖倒置原则
DIP:1.高层模块不能依赖低层模块,需要高层定义一个接口提供给低层模块依赖;2.抽象不能依赖实现,而是实现依赖抽象。
依赖倒置,好莱坞规则是框架设计的核心。例如spring框架,它不依赖于业务代码,框架依赖于接口,我们根据业务逻辑实现接口。高层模块不依赖于低层模块,spring不依赖于业务代码,却可以调用代码。
OOD原则:里是替换原则
LSP:是解决继承问题,抽象的威力在于多态和继承
LSP描述:若对每个类型T1的对象O1替换为类型T2的对象O2后,对于O2的程序功能行为不变,则认为T1是T2的子类型。父类可以用子类替换。
Java语法角度看,1.子类一定拥有基类整个接口。2.子类访问控制不能比基类更严格。
如何解决无法进行LSP问题:1.提取共性到基类;2.继承改成组合;
继承的优缺点,以及优先使用组合。
![](https://static001.geekbang.org/infoq/70/7029c2def45e7facc6181f497ba8294c.png)
上图中父类Car完成可以用子类bmwCar和benzCar替换,符合里是替换原则。
OOD原则:单一职责原则
违反SRP后果:1.脆弱性;2.不可移植
OOD原则:接口分离原则
ISP不应该强制程序依赖不需要的方法。
ISP和SRP是相关的。
ISP:指出如何设计接口;从客户角度出发,不要让客户看到他们不需要的方法。
SRP:指出如何设计类;只有一种原因促使类发生改变。
ISP方式:1.适配器;2.多继承;
版权声明: 本文为 InfoQ 作者【Mars】的原创文章。
原文链接:【http://xie.infoq.cn/article/b44d105cfb97eb1fbc7699292】。文章转载请联系作者。
评论