近期,对项目进行了重构,关于重构和架构设计,有了进一步的认识。特此记录。
MVC模式是web应用最常用的架构模式。V和C都很好理解,那最重要的M呢?很多人会认为专指Model。但我认为,除了V和C,M应该指的整个后端的业务逻辑架构,其中最重要的一层就是Model了。
Martin Flower 在《企业应用架构模式》中总结了三种组织方式
1.事务脚本
2.领域模型
3. 表模块
其中,最常用的是前两种方式。
事务脚本
可以理解为针对每个请求,有一个或多个函数提供服务。每个请求都是独立的,多个请求的共同复用代码也是通过函数实现。以php语言来说明下。
针对每个请求,通过路由会由特定的一个php脚本,接受请求,调用一系列函数处理数据,最后调用View显示。这是最简单的使用事务脚本方式。
再复杂的方式是通过分层架构来处理请求。一般分为两层(Service和DAO)或者三层(Service, Entity,DAO)。具体的逻辑实现都是放在Service中某个具体函数中实现。
Entity层中并不是真正意义上的Model,因为,在此实现中,Entity是只具备属性的,并没有行为。
领域模型
这是最麻烦的实现业务逻辑的方式,也更强大。核心的思想就是抽象,把业务领域抽象出稳定的模型关系。
实现Model层的核心是行为,以及多个Model之间的关系。在这一实现中,也可以进行分层(Service,Model, DAO等)。但这里的Service实现的是类似接口的行为,组装各个Model的逻辑实现,提供给上层数据使用。
实践
架构设计很难通过简洁的方式去说明。通过一个简单的逻辑点,来分别说明下。比如对于登录操作来看下两种方式的具体实现。
事务脚本
1 2 3 4 5 6 7 8 9 10 11 |
public function login($uid, $password) { $user = UserDAO::getByUid($uid); if ($user->password == $password) { // 做登录处理,加入cookie, 记录session 等。 } else { // 密码不正确, 提示错误 } } |
领域模型
1 2 3 4 5 6 7 8 9 10 |
public funciton login($uid, $password) { $user = new UserModel(); if ($user->login($uid, $password)) { // 做登录处理,加入cookie, 记录session 等。 // 这里可能会调用其它Model等。 } else { // 密码不正确, 提示错误 } } |