tiktok 中的整洁架构

或许整洁架构对你而言有些陌生,让你在review代码的时候感到困惑,没关系,我会向你举例帮助你理解他。 这里就以GitHub - mutezebra/tiktok中user的Register方法为例。 架构: 我们首先来看一下架构图,在此我们主要关注三个层次,从上到下依次为领域层(domain),用例层(usecase)和接口层(interface). 接下来我将举例向你解释他们分别的职能,但在此之前我先说一下我对这三个层次的个人见解: Domain 着重于提供顶层方法,以便可以被整个架构所引用,同时他负责业务核心代码的实现。 Usecase 侧重梳理业务逻辑,主要通过引用Domain层暴露出来的接口或方法来实现业务逻辑,并将数据转换成接口层可理解形式返回。 Interface 着重于处理更底层传来的数据,并将其转换成Usecase或Domain更容易理解和操纵的形式。 在Tiktok中,他大致长这个样子。 Register 在整洁架构中,层级分离会屏蔽较底层的代码,高层并不知道底层实现了什么,但是高层又需要底层的方法,所以我们通常会在高层中定义好接口,然后由底层去实现它,最后再在一个地方将其注入进去,这样高层就可以在不知道底层的具体实现的情况下实现调用底层的方法。 领域层 Domain 1. 定义数据库接口 领域层作为业务的核心处理部分,自然是要统筹全局,提前定义和准备好他所需要的方法。那注册一个用户需要什么呢?首先想到的肯定是把用户信息存储到数据库中啦,但是作于高层来说,自然不需要去做那些脏活累活,我们只需要定义一下这个接口就好了,等下让接口层去做具体的实现。 app/user/domain/repository/db.go // UserRepository defines the operational // criteria for the user repository type UserRepository interface { CreateUser(ctx context.Context, user *User) error // create a new user } 2. 定义用户信息结构 好啦,现在已经可以把用户的信息存进数据库了,那用户信息的具体内容呢?好像还没有,那作为高贵的领域层,我们来定义一下用户信息吧。 为了方便管理,我们在pkg中创建一个名为types的package来统一放置一些由于业务需求而定义的结构体。(pkg的方法被全局使用,也可以理解为Domain层) pkg/types/model.go // User is the standards for repo operand objects type User struct { ID int64 `db:"id"` UserName string `db:"user_name"` Email string `db:"email"` PasswordDigest string `db:"password_digest"` Gender int8 `db:"gender"` Avatar string `db:"avatar"` Fans int32 `db:"fans"` Follows int32 `db:"follows"` TotpEnable bool `db:"totp_enable"` TotpSecret string `db:"totp_secret"` CreateAt int64 `db:"create_at"` UpdateAt int64 `db:"update_at"` DeleteAt int64 `db:"delete_at"` } 3. 定义Service结构体 好了,现在用户的信息也有了,那我们看一下这个信息,有username,email,password等等,那自然又引申出一个问题,用户的名字合法吗?email格式是标准的吗?password符合我们的要求吗?存入数据库的话需不需要加密? ...

July 7, 2024