week02 小结
先有程序才有了计算机
计算机计算的是数据而不是数值,数据本身是包含计算逻辑,这个数据也就是程序。
编程的目的:用计算机来解决现实世界问题。
编程的过程:在计算机所能理解的“模型”(解空间)和现实世界(问题空间)之间建立一种联系。
编程语言是一种“抽象”的机制,问题是对“谁”来抽象
编程的核心要素:人(劳动者)、计算机(劳动工具)、客观业务领域(劳动对象)
什么是对象?
对象具有状态、行为和标记
状态:表明每个对象都可以有自己的数据
行为:表明每个对象都可以生产行为
标识:每个对象都有区别与其他对象
大多数情况是用面向对象的编程语言做面向结构的编程。真正面向对象编程不是仅仅使用了面向对象的编程语言进行编程,而是利用了多态特性进行编程。
面向对象分析时将客观世界,即编程的业务领域进行对象分析。
充血模型与贫血模型
领域驱动设计DDD
编程语言的最终形态一定是面向对象编程的,但是近几年有出现面向AI、面向数据的编程,机器学习编程模型。
函数式编程是面向对象编程的一个细分领域。
目前存在的三层架构,基本是无状态、无行为的对象。
面向对象设计的目的:
强内聚、低耦合,从而使系统易扩展(易于增加新的功能)、更强壮(不容易被粗心的程序员破坏)、可移植(能够在多样的环境下运行)、更简单(容易理解,容易维护)
框架用来实现某一应用的结构性的程序,是对某一类架构方案可复用的设计与实现。
如同框架结构的大厦的框架
简化应用开发者的工作
实现了多种设计模式,使应用开发者不需要花太大的力气,就能设计出结构良好的程序来
框架 VS 工具
框架调用应用程序代码
应用程序代码调用工具
架构师使用框架保证架构的落地
架构师用工具提高开发效率
log4j是工具,Junit是框架
一个“不好的”软件,会发出如下“臭味”
僵硬 - 不易改变
脆弱 - 只想改A,结果B被意外破坏
不可移植 - 不能适用环境的变化
导致误用的陷进 - 做错误的事比做正确的事更容易,引诱程序员破坏原有的设计
晦涩 - 代码难以理解
过渡设计、copy-paste 代码
1、开/闭原则
不需要修改软件实体(类、模块、函数等),就应该能实现功能的扩展。
如何实现不修改而扩展呢?关键是抽象!
善用:策略模式、适配器模式、监听者模块,改造 if else
组装类是必须要修改的!
2、依赖倒置原则
高层模块不能依赖低层模块,而是大家都依赖于抽象;
抽象不能依赖实现,而是实现依赖抽象
高层决定低层,高层被重用
controller是高层,service是低层
抽象由高层决定
框架的核心:好莱坞思想:Don’t call me,I’ll call you
框架调用应用程序,框架传递参数
3、LS替换
一个正确的继承要符合什么要求呢?答案是:Liskov 替换原则
优先使用组合,慎用继承,如果本身是未继承而设计的,可以用继承
子类型必须能够替换掉它们的基类型
设计和界定一个类,应该以其行为作为区分
LSP要求,凡是使用基类的地方,一定也适用于其子类。子类的“契约” 不能比基类更“严格”
4、单一原则
把类拆小一些,拆的过程就要考虑效率
敏捷开发 -> 设计先是敏捷的 ,开发才能是敏捷的
一个类,只能有一个引起它的变化的原因。一个职责是一个变化的原因。
5、接口分离原则(ISP)
不应该强迫客户程序依赖它们不需要的方法。
与单一原则是相关的,都和“内聚性”有关。
单一原则:指出应该如何设计一个类 — 只能有一种原因才才能促使类发生改变。
接口隔离原则:指出应该如何设计一个接口 — 从客户的需求出发,强调不要让客户看到他们不需要的方法。
最后:
单元测试很重要,优秀的代码是欢迎需求变更,设计好的架构是喜欢需求变更。
依赖倒置 — 策略模式 — 反应式编程框架。
评论