设计来源
一个绝对面向对象编程的中台项目,拒绝面条代码
问题描述
对于数据库的增删改操作,为了维护数据模型的完整性,我们定义了接口,然后统一操作数据。实现类可以选择不同的数据库,比如选择MySQL或者MongoDB等等,同时,不同实现类还可以选择不同的ORM框架,比如如果选择了MySQL存储数据,则可以选择jooq,mybatis等等ORM框架。对于不同的实现类,有很多操作是相同的,比如参数校验,缓存的设置,更新等等,这些操作不会因为选择了不同的数据库或者选择了不同的ORM框架而不一样,因此,为每个接口设计一个抽象类,在这个抽象类中完成这些相同的操作,然后把保存数据的工作交给具体的实现类。
举例
首先我们定义添加用户的接口
public interface UserManager {
void addUser(String username,String password);
}
然后定义抽象类,完成参数校验等工作,并且定义一个相应的**addUserDbOp**方法,供真正的实现类实现
public abstract class AbstractUserManager implements UserManager {
void addUser(String username,String password){
// 参数校验
// username唯一性校验
// 保存到具体数据库中,可能是MySQL,使用的jooq ORM框架;也可能是MongoDB
addUserDbOp(username, password);
// 新添加的用户设置到缓存中
}
// 这个才是实现类真正需要实现的方法
protected abstract void addUserDbOp(String username,String password);
}
命名规范
如上面的代码,==addUserDbOp==作为==addUser==方法保存数据的一部分,因此,在==addUser==方法名后面加上==DbOp后缀==,
这样既有规律可循,又减少命名所带来的额外工作(有时候命名是很痛苦的一件事情)。