我在重构代码时遇到困难,因为 lint 检测到模式重复但功能不同。代码是这样的,它是为带有 protobuf 定义的 grpc 实现的func (svc *UserService) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) { err := svc.validateCreateUser(req) if err != nil { return nil, err } user, err := svc.repo.CreateUser(ctx, req) if err != nil { return nil, err } return user, nil}func (svc *UserService) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserResponse, error) { err := svc.validateUpdateUser(req) if err != nil { return nil, err } user, err := svc.repo.UpdateUser(ctx, req) if err != nil { return nil, err } return user, nil}提前致谢。我不知道如何避免重复,因为函数也有不同的参数类型。
1 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
并非所有 lint 问题都必须修复
如果您认为它会牺牲可读性,请添加 // nolint
但是……您可以使用泛型重构它们的代码
func [T, V any] someNameToBeDefined(
ctx context.Context,
target T,
validator func(T) error,
executor func(context.Context, T) (V, error),
) (V, error){
if err := validator(target); err!= nil { … }
return executor(ctx, target)
}
func (svc *UserService) CreateUser(
ctx context.Context,
req *pb.CreateUserRequest,
) (*pb.CreateUserResponse, error) {
return someNameToBeDefined(ctx,
req,
svc.validateCreateUser,
svc.repo.CreateUser,
)
}
如果您认为这是可读的,请继续。
但也许这可能不是正确的方法。
例如,您的存储库可以在创建/更新之前验证请求。
这是一种比使用泛型和函数指针恕我直言更具可读性的方法
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消