软件的本质与设计原则
不少程序员最担忧的问题,写程序是青春饭,没法干一辈子,这种中年危机的焦虑一直在困扰着我们。但同时身边又不缺有很多高薪的大神,那这种差距出现在哪里?我们埋头coding,写出优秀的代码就一定会成为大神吗?其实最重要的是有一种破局的能力,每个人所在的公司、项目、职位不同,但切入点都可以从以下几个方面来:
积极主动承担或参与架构设计与讨论,或核心框架、组件、系统的开发;
用通俗易懂的文字或图来描述复杂的系统设计、业务设计,使用文档或PPT主动与老板进行沟通;
设计和编码高质量的代码或框架,让其他同事的开发依赖于你的代码或框架,按照你制定标准进行编码;
做好这三个方面,都需要我们去思考一些编程与设计的本质问题,下面我们一起来讨论下这个话题
回顾软件开发简史,思考编程的本质与未来
1. 计算机出现之前,人类就开始探索软件编程了
1700年代,莱布尼茨用一种可执行演算规则的机器进行计算,可计算出事物的各种结果,为实现这个想法,获得了丰硕的成果,包含微积分和二进制;
过了100年,法国人雅卡尔发明一台可编程的织布机,可织出不同的图案;
19世纪中叶,英国人Ada用打孔纸带写出人类第一个软件出现,程序包含循环和子程序
2. 计算机出现
计算器有非常悠久的历史,专门进行数值计算的;
从莱布尼茨、Ada、图灵、冯诺伊曼试图创造一种通用计算机,是读取数据进行计算,数据本身包含计算的逻辑,就是程序;
冯诺伊曼在ENIAC计算机上输入一个程序,标准现代计算机的诞生。刚开始需要将电线编来编去,以控制计算机的执行。这就是编程的来由;
3. 编程语言发展
编程的目的是用计算机来解决现实世界的问题,是在计算机理解的模型和现实世界之间建立一种联系。编程语言是一种“抽象”的机制,是对“谁”来抽象:
面向机器编程:汇编语言,通过对机器的抽象,使用指令与机器进行交互;
面向人的逻辑编程:Basic语言、C语言,面向过程编程,对计算逻辑进行抽象;
面向问题领域的对象编程:Java语言、C++语言,直接表达问题空间内的元素;
面向数据的编程:比如:响应式编程、函数式编程;
编程的核心要素:开发者(劳动着)、开发工具(劳动工具)、客观的业务领域(劳动对象)
4. 面向对象编程
什么是对象:状态、行为、标识
面向对象语言三大特性:封装、继承、多态
面向对象的编程与分析:充血模型、DDD
面向对象设计的基本原则
1. 面向对象设计
目的:强内聚、低耦合,使系统易扩展、更强壮、可移植、更简单;
原则:达到上面设计目的,需多种指导原则,是独立于编程语言的;
设计模式:用于解决一种问题的通用解决方案,遵循于设计原则,也是语言中立的;
框架:用来实现某一类应用的结构性的程序,比如:MFC、AWT、Tomcat
框架调用应用程序,架构师使用框架落地架构实践
工具:应用程序代码调用工具,架构师用工具提高开发效率
2. OOD设计原则
软件设计的“臭味”,比如:僵硬、脆弱、不可移植、误用的陷阱、晦涩、过度设计,可以通过OOD设计原则进行优化
i) 开/闭原则(OCP), Open/Close Principle
对扩展是开放的,对更改是封闭的,就能实现功能的扩展。关键是抽象,可通过以下几种设计模式进行优化:
基于接口编程
策略模式
适配器模式
观察者模式
ii) 依赖倒置原则(DIP), Dependency Inversion Principle
定义:高层模块不能依赖低层模块,都依赖于抽象。抽象不能依赖实现,而实现依赖抽象
理解:倒置了模块的依赖关系,高层决定低层,高层被重用。
与好莱坞规则 Don't call me, I'll call you思想一致
iii) 里氏替换原则(LSP), Liskov Substitution Principle
定义:凡是使用基类的地方,一定也适用于其子类。也就是子类可以替换父类。
理解:不能只看逻辑是否可替换,而需看行为是否可替换?也就是场景下是不是可替换
一个正确的继承需符合LSP原则
注意点:子类需比基类有更宽松的访问控制,子类抛出异常需是父类抛出异常的子类
解决LSP问题,可通过下面方法进行优化:
提取共性到基类
继承改成组合
iv) 单一职责原则(SRP), Single Responsibility Princople
定义:一个类,应该只有一个引起它变化的原因。也就是一个类只负责一件事。
理解:一个职责是一个变化的原因,称为“内聚性原则”,一个模块的组成元素之间的功能相关性。
对比:如何设计一个类,只能有一种原因才能促使类发生改变
v) 接口隔离原则(ISP), Interface Segregation Principle
定义:不应该强迫客户程序依赖他们不需要的方法
对比:如何设计一个接口,从客户的需求出发,强调不要让客户看到他们不需要的方法。
版权声明: 本文为 InfoQ 作者【dony.zhang】的原创文章。
原文链接:【http://xie.infoq.cn/article/fdaaadafa6af353b7a65d0cfc】。文章转载请联系作者。
评论