在搞清楚如何写好代码之前,要搞清楚下面的几个概念,这能够帮我们更好的从不同的方向来写好代码。这一切都是建立在面向对象的基础上。
1. 面向对象
1.1面向对象与 面向过程的区别
- 面向对象编程(OO) 更注重对象的抽象和封装,通过定义类来组织数据和行为,以便更容易理解和维护代码。
- 面向过程编程(OP) 更注重过程和函数,通过将数据和操作分离,强调顺序执行的步骤。
举个例子,分别使用2种方式构建一个汽车类:
js
// 面向对象编程
class Car(var brand: String, var model: String) {
var speed: Int = 0
fun accelerate(amount: Int) {
speed += amount
}
fun brake(amount: Int) {
speed -= amount
}
}
// 使用
val myCar = Car("Toyota", "Camry")
myCar.accelerate(20)
println("Current speed: ${myCar.speed}")
在这个例子中,我们创建了一个 Car
类,该类有 brand
、model
和 speed
属性,以及 accelerate
和 brake
方法。每个汽车对象都是 Car
类的一个实例。
js
// 面向过程编程
data class Car(val brand: String, val model: String, var speed: Int)
fun accelerate(car: Car, amount: Int) {
car.speed += amount
}
fun brake(car: Car, amount: Int) {
car.speed -= amount
}
// 使用
val myCar = Car("Toyota", "Camry", 0)
accelerate(myCar, 20)
println("Current speed: ${myCar.speed}")
在这个例子中,我们使用了一个简单的数据类 Car
来存储汽车的属性。然后,我们定义了两个函数 accelerate
和 brake
,这些函数接受一个汽车对象和一个数值,并相应地改变汽车的速度。
1.2 面向对象的特点
面向对象的四大特性:封装
、抽象
、继承
、多态
2. 设计原则
设计原则是指导我们代码设计的一些经验总结。
-
单一职责原则(Single Responsibility Principle - SRP) :
- 意思是一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一件事。这使得类更加可理解,易于修改,也更容易进行测试。
-
开放/封闭原则(Open/Closed Principle - OCP) :
- 这个原则说的是一个软件实体(比如类、模块、函数等等)应该对扩展是开放的,但对修改是封闭的。这意味着你可以通过添加新的功能来扩展一个模块,而不需要修改已有的代码。
-
里氏替换原则(Liskov Substitution Principle - LSP) :
- 表明子类型必须能够替换掉它们的父类型,而程序仍然保持正确运行。这意味着使用一个基类的对象,应该能够被其任何子类所替代,而程序不会出错。
-
接口隔离原则(Interface Segregation Principle - ISP) :
- 这个原则强调一个类对于其他类的依赖,应该建立在最小的接口上。简而言之,不应该强迫类去实现它们用不到的接口。
-
依赖反转原则(Dependency Inversion Principle - DIP) :
- 这个原则表达了高层模块不应该依赖于底层模块,两者都应该依赖于抽象;抽象不应该依赖于具体实现,具体实现应该依赖于抽象。这个原则主张使用接口或抽象类来实现松耦合。
3. 设计模式
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。 参照Design Patterns里面的分类
- 创建型
常用的有:单例模式
、工厂模式
(工厂方法和抽象工厂)、建造者模式
。 不常用的有:原型模式。 2. 结构型
常用的有:代理模式
、桥接模式
、装饰者模式
、适配器模式
。
不常用的有:门面模式、组合模式、享元模式。 3. 行为型
常用的有:观察者模式
、模板模式
、策略模式
、职责链模式
、迭代器模式
、状态模式
。
不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
设计原则和设计模式感觉都是在说一件事,他们的具体维度是什么?
设计原则提供了通用的设计方向和准则,而设计模式则是这些原则的具体应用。
-
设计原则(Design Principles) :
- 定义: 设计原则是一些通用的指导性原则,旨在指导良好的软件设计实践。
- 特点: 这些原则是比较抽象的,强调在整个系统设计中遵循的基本原则
- 目的: 设计原则提供了一些通用的规则和准则,帮助开发人员构建易于理解、可维护、可扩展和灵活的系统。
-
设计模式(Design Patterns) :
- 定义: 设计模式是在特定上下文中解决一类常见问题的可重用解决方案。它们是在设计原则的基础上诞生的,是设计原则的实际应用。
- 特点: 设计模式更具体,是关于在特定情境下如何组织和结构化代码的经验教训。它们提供了一些被证明有效的设计方案
- 目的: 设计模式解决了一些常见的设计问题,提供了一种可重复使用的方法,使开发人员更容易应对特定情境下的挑战。
4. 编程规范、
编程规范主要解决的是代码的可读性问题。
相对于设计原则、设计模式,更加具体、更加偏重代码细节。即便你可能对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过 长、参数不能过多等等。
5. 重构
大多数的重构,是为了满足新的需求,以及维护成本的问题。对于重构,应该了解以下问题:
重构的目的(why)、对象(what)、时机(when)、方法(how);
保证重构不出错的技术手段:单元测试和代码的可测试性;
两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。
总结
面向对象是武器,设计模式是招式,设计原则是心法 以心法为基础,以武器运用招式应对复杂的编程问题
可以看出来这些点都是相互关联的,是针对项目开发层级以及阶段的不同规则,这也就是低级程序员和高级程序员的区别维度,像小白应该是只在代码实现的代码规范做起,而高级程序员是从项目的架构,代码原则来思考问题。
这也与我前几天代码被review得到了充分体现,第一次被review了2个小时,在改好了之后,第二天又review2个小时,我在想为什么不一起说了,前面我还在想,为什么不一起说了,影响我提测进度,现在看来,正好是与这些流程点契合,首先对我的代码原则进行了修正,后面又对我的代码规范做了修正。
好,在总结完这篇文档,结合我前面工作中遇到的事情,我理解了为什么,一个代码设计要有这么多概念,以及这些概念是针对那个流程的指导方针。前一段时间我学习完了代码整洁之道,对基本的编程规范有了一定的认知,现在,要进入第二阶段,要正式开始设计原则的学习了。