前言
随着近几年互联网兴起,无数人通过自学、培训加入到IT行业中来,因此科班出身的小伙伴也面临学更大的压力。是否四年的计算机专业还不如别人培训三个月来的实在?
其实现在java技术成熟,各种框架层出不穷,如果只是单纯的会用框架,用框架解决业务问题,确实谁都可以,而一名程序员的真正竞争力不应该在此。而是他的编程内功。
编程内功主要有两个算法跟设计模式。前者需要不断地练习强化自己逻辑,需要一定的时间沉淀。后者简单许多,是你代码可读性、可扩展性、可维护性的保证,用途更广,学起来也简单。
软件设计原则
软件设计原则,制定了一套高效优雅的软件开发规约,不一定都要遵守,也不可能全部遵守。可以根据业务场景进行具体取舍。
-
开闭原则
对扩展开发,对修改关闭。这是最核心最重要的设计原则,是软件复用的基石。23种设计模式几乎都是以“开闭原则”为指导思想。
-
单一职责原则
比较好理解,“单一职责原则”顾名思义,一个类只负责一项职责,不要把毫无关联的功能模块组合在同一个类里。具体可根据业务功能划分。
-
依赖倒置原则
高层模块(稳定)不应该依赖低层模块(变化),二者都依赖抽象(稳定)。
抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。
有人问我,在一个service里要用到另一个表数据,是注入对应的dao呢,还是service呢?依赖倒置原则已经给出了答案,应该依赖于service。
-
里氏替换原则
定义:子类可以替换父类的位置.并且程序的功能不受影响。
本质是对开闭原则的补充,里氏替换原则 建议不覆盖父类的非抽象方法。
ps: “面向对象编程”其实还是有缺陷的,里氏替换原则正是为了弥补它的这些缺陷而生。现在有不少人唱衰“面向对象”编程思想,他们试图通过代码举例通过 “继承”、“多态”会给程序带来难以预知的风险。其实他们给的代码示例绝大多数都是违反“里氏替换原则”导致的问题(面向对象的缺陷和具体示例后续章节介绍)。
新生语言go也抛弃了“类”的概念,某些程度上也是怕引入class难免会违反“里氏替换原则”。
-
迪米特法则
又称为最少知道原则。
从被依赖者的角度来说:只暴露应该暴露的方法或者属性,即在编写相关的类的时候确定方法/属性的权限
从依赖者的角度来说,只依赖应该依赖的对象。
-
接口隔离原则
客户端不应该依赖它不需要的接口。
一个类对另一个类的依赖应该建立在最小的接口上。
设计模式
定义:
软件设计原则像是一个设计规范,规范总是要实现的。而设计模式就是对“软件设计原则”的最佳实践,每个设计模式都是以某些设计原则为指导思想而诞生的。
分类:
- 创建型
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 结构型
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
- 行为型
- 策略模式
- 模板方法模式
- 观察者模式
- 迭代子模式
- 责任链模式
- 命令模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
设计模式和编程语言
每个语言对设计原则的原生支持程度不同,设计模式的实现难度也不同。有些后起之秀语言因为吸取了前人的智慧,在语法上摒弃了可能违背设计原则的操作。
比如go语言没有class、继承概念,相比传统面向对象语言就不容易违反里氏替换原则。
优秀的语言,语法上就为你避免了 很多不规范的操作。从这个角度来说语言是有优劣之分的。
曾在知乎看到一句话:“go是最并发的原因,Python是最优雅的语言,java是最有模式的语言,PHP是世界上最好的语言”,虽然这是一次高级黑四种语言。但侧面也揭示了编程语言和设计模式的相关性。