在项目代码里如何优雅的实现业务和数据分离?

date
Jul 20, 2023
slug
How-do-you-elegantly-separate-business-and-data-in-your-project-code
status
Published
tags
Go
Dao
summary
DAO(Data Access Object)
type
Post
Created Time
Oct 28, 2023 01:45 PM
Updated Time
Oct 28, 2023 01:45 PM
AI summary
该文章介绍了如何使用DAO模式将数据访问逻辑与业务逻辑分离,以提高代码的可维护性、可测试性、可复用性、性能和安全性。文章提供了一个使用DAO模式的示例,包括预定义User表、封装DAO和使用DAO。使用DAO模式可以使代码更加清晰、易于维护和扩展。
Status
在 Go 语言中,我们可以使用第三方库来连接 MySQL 数据库,如 database/sql 和 github.com/go-sql-driver/mysql。假设我们有一个 Web 应用程序,它需要从数据库中检索用户的信息并将其显示在页面上。代码实现如下:
在上面的代码中,我们首先从 URL 参数中获取用户的 ID。然后,我们使用 sql.Open 函数打开一个 MySQL 数据库连接,并使用 db.QueryRow 函数执行一个查询语句。最后,我们将查询结果扫描到变量中,并将其输出到响应体中。
虽然上面的代码可以工作,但它存在以下问题:
  1. 数据访问逻辑和业务逻辑混杂在一起,使得代码难以维护和扩展。
  1. 数据访问逻辑重复出现在多个控制器或模型中,导致代码冗余。
  1. 对于复杂的查询和数据访问操作,代码可能会变得非常冗长和难以维护。
因此,为了解决这些问题,我们可以使用 DAO 模式将数据访问逻辑封装在一个单独的对象中,从而使业务逻辑和数据访问逻辑分离。这样可以使代码更加清晰、易于维护和扩展。

DAO 是什么?

DAO 是 Data Access Object 的缩写,是一种设计模式,用于将数据访问逻辑与业务逻辑分离。DAO 模式的核心思想是将数据访问操作封装在一个单独的对象中,使得业务逻辑和数据访问逻辑可以独立变化。
在软件开发中,我们通常需要访问数据库或其他数据存储系统来获取或保存数据。如果将数据访问逻辑散布在业务逻辑的各个部分,那么不仅会使代码难以维护,还会使重复代码的出现频率增加。此时,我们可以使用 DAO 模式将数据访问逻辑封装在一个单独的对象中。
DAO 模式通常包含以下组件:
  1. DAO 接口:定义了访问数据存储系统的操作。
  1. DAO 实现类:实现了 DAO 接口中定义的操作,通常使用 ORM(对象关系映射)框架来与数据存储系统进行交互。
  1. 实体类:表示数据存储系统中的实体对象,通常与数据库中的表对应。

DAO 有什么好处?

  1. 提高代码的可维护性:DAO 可以将数据访问的代码封装在一个单独的对象中,从而使其易于维护。当需要修改数据访问逻辑时,只需要修改 DAO 中的代码,而不需要修改业务逻辑代码。
  1. 提高代码的可测试性:DAO 可以将数据访问的代码封装在一个单独的对象中,这样可以使其易于单元测试,从而提高了代码的可测试性。
  1. 降低代码的耦合度:通过将数据访问逻辑封装在 DAO 中,业务逻辑和数据访问逻辑可以独立变化,从而降低了代码的耦合度。这使得代码更加灵活,易于扩展和维护。
  1. 提高代码的复用性:将数据访问逻辑封装在 DAO 中,可以使其在多个业务逻辑中复用,从而提高代码的复用性。
  1. 提高代码的性能:DAO 可以对数据访问进行优化,例如使用缓存、批量操作等方式提高访问性能。
  1. 提高数据安全性:通过 DAO 可以对数据进行访问控制,限制某些用户对数据的访问权限,从而提高数据的安全性。

举个例子

预定义 User 表

封装 DAO

在上面的代码中,我们首先定义了一个 userDao 结构体,该结构体包含四个类型字段:
  • *sql.DB 用于与 MySQL 数据库进行交互。
  • context.Context 用于传输 trace ID、进行并发控制等。
  • *log.Logger 用于日志记录。
  • tableName 是表名
然后,我们编写了一些方法来操作 users 表。

使用 DAO

为了使用这个 DAO 层,我们可以在我们的应用程序中导入 dao 包,并使用 NewUserDao 函数创建一个 userDao 对象。然后,我们可以使用该对象调用其它方法来执行与 user 表的操作。例如:

© 孙东辉 2022 - 2024