01 面向对象、设计模式有何关系?

在搞清楚如何写好代码之前,要搞清楚下面的几个概念,这能够帮我们更好的从不同的方向来写好代码。这一切都是建立在面向对象的基础上。

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 类,该类有 brandmodelspeed 属性,以及 acceleratebrake 方法。每个汽车对象都是 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 来存储汽车的属性。然后,我们定义了两个函数 acceleratebrake,这些函数接受一个汽车对象和一个数值,并相应地改变汽车的速度。

1.2 面向对象的特点

面向对象的四大特性:封装抽象继承多态

2. 设计原则

设计原则是指导我们代码设计的一些经验总结。

  1. 单一职责原则(Single Responsibility Principle - SRP)

    • 意思是一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一件事。这使得类更加可理解,易于修改,也更容易进行测试。
  2. 开放/封闭原则(Open/Closed Principle - OCP)

    • 这个原则说的是一个软件实体(比如类、模块、函数等等)应该对扩展是开放的,但对修改是封闭的。这意味着你可以通过添加新的功能来扩展一个模块,而不需要修改已有的代码。
  3. 里氏替换原则(Liskov Substitution Principle - LSP)

    • 表明子类型必须能够替换掉它们的父类型,而程序仍然保持正确运行。这意味着使用一个基类的对象,应该能够被其任何子类所替代,而程序不会出错。
  4. 接口隔离原则(Interface Segregation Principle - ISP)

    • 这个原则强调一个类对于其他类的依赖,应该建立在最小的接口上。简而言之,不应该强迫类去实现它们用不到的接口。
  5. 依赖反转原则(Dependency Inversion Principle - DIP)

    • 这个原则表达了高层模块不应该依赖于底层模块,两者都应该依赖于抽象;抽象不应该依赖于具体实现,具体实现应该依赖于抽象。这个原则主张使用接口或抽象类来实现松耦合。
3. 设计模式

设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。 参照Design Patterns里面的分类

  1. 创建型

常用的有:单例模式工厂模式(工厂方法和抽象工厂)、建造者模式。 不常用的有:原型模式。 2. 结构型

常用的有:代理模式桥接模式装饰者模式适配器模式

不常用的有:门面模式、组合模式、享元模式。 3. 行为型

常用的有:观察者模式模板模式策略模式职责链模式迭代器模式状态模式

不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

设计原则和设计模式感觉都是在说一件事,他们的具体维度是什么?

设计原则提供了通用的设计方向和准则,而设计模式则是这些原则的具体应用。

  1. 设计原则(Design Principles)

    • 定义: 设计原则是一些通用的指导性原则,旨在指导良好的软件设计实践。
    • 特点: 这些原则是比较抽象的,强调在整个系统设计中遵循的基本原则
    • 目的: 设计原则提供了一些通用的规则和准则,帮助开发人员构建易于理解、可维护、可扩展和灵活的系统。
  2. 设计模式(Design Patterns)

    • 定义: 设计模式是在特定上下文中解决一类常见问题的可重用解决方案。它们是在设计原则的基础上诞生的,是设计原则的实际应用。
    • 特点: 设计模式更具体,是关于在特定情境下如何组织和结构化代码的经验教训。它们提供了一些被证明有效的设计方案
    • 目的: 设计模式解决了一些常见的设计问题,提供了一种可重复使用的方法,使开发人员更容易应对特定情境下的挑战。
4. 编程规范、

编程规范主要解决的是代码的可读性问题。
相对于设计原则、设计模式,更加具体、更加偏重代码细节。即便你可能对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过 长、参数不能过多等等。

5. 重构

大多数的重构,是为了满足新的需求,以及维护成本的问题。对于重构,应该了解以下问题:

重构的目的(why)、对象(what)、时机(when)、方法(how);

保证重构不出错的技术手段:单元测试和代码的可测试性;

两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。

总结

面向对象是武器,设计模式是招式,设计原则是心法 以心法为基础,以武器运用招式应对复杂的编程问题

可以看出来这些点都是相互关联的,是针对项目开发层级以及阶段的不同规则,这也就是低级程序员和高级程序员的区别维度,像小白应该是只在代码实现的代码规范做起,而高级程序员是从项目的架构,代码原则来思考问题。

这也与我前几天代码被review得到了充分体现,第一次被review了2个小时,在改好了之后,第二天又review2个小时,我在想为什么不一起说了,前面我还在想,为什么不一起说了,影响我提测进度,现在看来,正好是与这些流程点契合,首先对我的代码原则进行了修正,后面又对我的代码规范做了修正。

好,在总结完这篇文档,结合我前面工作中遇到的事情,我理解了为什么,一个代码设计要有这么多概念,以及这些概念是针对那个流程的指导方针。前一段时间我学习完了代码整洁之道,对基本的编程规范有了一定的认知,现在,要进入第二阶段,要正式开始设计原则的学习了。

相关推荐
Q_19284999069 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏12 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
zfoo-framework1 小时前
【jenkins插件】
java
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch