软件的本质与设计原则

发布于: 2020 年 06 月 17 日
软件的本质与设计原则

不少程序员最担忧的问题,写程序是青春饭,没法干一辈子,这种中年危机的焦虑一直在困扰着我们。但同时身边又不缺有很多高薪的大神,那这种差距出现在哪里?我们埋头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

对扩展是开放的,对更改是封闭的,就能实现功能的扩展。关键是抽象,可通过以下几种设计模式进行优化:

  1. 基于接口编程

  2. 策略模式

  3. 适配器模式

  4. 观察者模式

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

定义:不应该强迫客户程序依赖他们不需要的方法

对比:如何设计一个接口,从客户的需求出发,强调不要让客户看到他们不需要的方法。

发布于: 2020 年 06 月 17 日 阅读数: 6
用户头像

dony.zhang

关注

还未添加个人签名 2018.07.06 加入

还未添加个人简介

评论

发布
暂无评论
软件的本质与设计原则