从面向对象到函数式编程
编程范式
-
命令式编程范式
-
命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。
-
举例说明:
- List results = new List();
foreach(var num in collection)
{
if (num > 5)
results.Add(num);
} - 1)在中央火车站乘坐1号电车;2)在第三站下车;3)向右走,朝第六大道行进,直到第三个路口
- List results = new List();
-
C, C++ 还是 C#, Java, Javascript, BASIC, Python, Ruby
-
-
声明式编程范式
- 以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该做什么,但不指定具体要怎么做。
- 举例说明:SELECT * FROM collection WHERE num > 5
- SQL、HTML、CSS
-
函数式编程范式
-
即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。
-
举例说明:
- List results = collection.stream()
.filter(n -> n > 5)
.collect(Collectors.toList());
- List results = collection.stream()
-
JavaScript 、C# 中的 LINQ 和 Java 中的 Lambda 和闭包
-
-
面向对象编程范式OOP
-
对象和类
- “汽车”是一个类,则一辆特定的本田思域汽车就是“汽车”类的一个对象
-
面向对象的四个基本原则:
-
封装
- 主要是指属性和行为的绑定,将对象的属性和行为保存到一个地方
-
抽象
- 使得对象可以公开它所做的事,而隐藏它是如何做到这些事的
-
继承
- 指对象或类基于另一个对象或类的能力
-
多态
- 提供了不同类型的实体使用相同接口的选项
- 编译时多态和运行时多态
-
-
统一建模语言UML
-
泛化
- 描述继承的关系称为泛化,Is-A关系
-
实现
- 描述类的接口实现的关系称为实现
-
依赖
- 用于定义一个类以某种方式依赖于另一个类,而另一个类可能依赖于或不依赖于第一个类,Uses-A关系
-
关联
-
聚合
-
Has-A关系
- 主类不存在时,所包含的类的实例又可以独立于第一个类之后生存
-
-
组合
- 主类不存在时,依赖类不再存在
-
面向对象的设计原则
-
SOLID
-
单一职责原则——SRP
-
其定义是应该有且仅有一个类引起类的变更,这话的意思就是一个类只担负一个职责。
举个例子,在创业公司里,由于人力成本控制和流程不够规范的原因,往往一个人需要担任N个职责,一个工程师可能不仅要出需求,还要写代码,甚至要面谈客户,光背的锅就好几种,简单用代码表达大概如此:
public class Engineer {
public void makeDemand(){}
public void writeCode(){}
public void meetClient(){}
} -
优点
- 单一职责原则的优点:
类的复杂性降低,实现什么职责都有明确的定义;
逻辑变得简单,类的可读性提高了,而且,因为逻辑简单,代码的可维护性也提高了;
变更的风险降低,因为只会在单一的类中的修改。
- 单一职责原则的优点:
-
-
开闭原则——OCP
-
其定义是一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
例如前面单一职责原则举的工程师类,我们说的是把方法抽离成单独的类,每个类负责单一的职责,但其实从开闭原则的角度说,更好的方式是把职责设计成接口,例如把写代码的职责方法抽离成接口的形式,同时,我们在设计之初需要考虑到未来所有可能发生变化的因素,比如未来有可能因为业务需要分成后台和前端的功能,这时设计之初就可以设计成两个接口,
public interface BackCode{
void writeCode();
}
public interface FrontCode{
void writeCode();
}
-
-
里式替换原则——LSP
- 定义:所有引用基类的地方必须能够透明地使用其子类的对象。
-
依赖倒置原则——DIP
- 它的定义是:
高层模块不应该依赖底层模块,两者都应该依赖其抽象;
抽象不应该依赖细节;
细节应该依赖抽象;
- 它的定义是:
-
接口隔离原则——ISP
- 其定义是:
客户端不应该依赖它不需要的接口
- 其定义是:
-
迪米特原则——LOD
- 规则是:
一个对象应该对其他对象有最少的了解
- 规则是:
-