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个小时,我在想为什么不一起说了,前面我还在想,为什么不一起说了,影响我提测进度,现在看来,正好是与这些流程点契合,首先对我的代码原则进行了修正,后面又对我的代码规范做了修正。

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

相关推荐
bing_1584 分钟前
Java 中求两个 List集合的交集元素
java·list
工业互联网专业23 分钟前
基于springboot+vue的高校社团管理系统的设计与实现
java·vue.js·spring boot·毕业设计·源码·课程设计
九圣残炎25 分钟前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
m0_748251521 小时前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
Bro_cat2 小时前
深入浅出JSON:数据交换的轻量级解决方案
java·ajax·java-ee·json
等一场春雨2 小时前
Java设计模式 五 建造者模式 (Builder Pattern)
java·设计模式·建造者模式
hunzi_12 小时前
Java和PHP开发的商城系统区别
java·php
V+zmm101342 小时前
教育培训微信小程序ssm+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
十二同学啊2 小时前
Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
java·spring boot·后端
我劝告了风*2 小时前
NIO | 什么是Java中的NIO —— 结合业务场景理解 NIO (二)
java·nio