阅读时长:7分钟
技术预备:熟悉Laravel的使用
关注点分离(Separation of Concerns, SoC)
这个设计模式应该作为我们开发和架构的原则,在开发某个业务逻辑时,应将不同的功能点进行划分,降低耦合度。
一、首先关注点是什么呢?
举例来说,我们打游戏放技能时通常都是要键盘和鼠标一起操作的,但是本质上键盘只负责选择技能,而鼠标只负责选择对象,这就是两个不同的关注点。
在软件中,可以举一个最通俗的例子,MVC分层。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
View(视图)是应用程序中处理数据显示的部分。
Controller(控制器)是应用程序中处理用户交互的部分。
甚至于所谓的面向切面编程AOP,也是一种SoC的实现。
在这里,我们可以用Laravel的Eloquent举例
Eloquent里将关注点分为了:Attributes、Event、Relationships等Trait模块,不同的Trait模块只负责对应的功能,这样就将模型的逻辑成功分离。
二、为什么需要关注点分离?
由于关注点,也就是逻辑,混杂在一起会使软件难以维护,回想一下自己初学编程时写的那些代码就知道有多可怕了,一个function里上百行代码,非常不利于调试和修改。
面对需求的变更,将关注点分离之后就不需要大幅度的修改代码
例如一个需求:
用户投票后进行发邮件提醒
如果我们用“直男型”的代码,大概逻辑就是:
if(投票成功){
$mail = new Mail();
$mail->sendTo = "123@qq.com";
$mail->title = "你中大奖了";
$mail->content = "才怪呢";
//此处省略100行代码
$mail->send();
}
复制代码
这时需求变更了,用户投票后进行微信通知,估计程序员会当场崩溃。
而且这样写也有个问题,如果邮件服务当时不可用,将会导致投票也会失败。
如果我们将发送邮件封装在Mail类里面,微信通知封装在WeChat类里面,每次调用时只需要静态调用
if(投票成功){
$data = [
xxx
];
Mail::sendMail($data);
}
复制代码
这样即使需求变更了,也只是屏蔽一行代码,加一行代码,完全不需要重写整个逻辑。
if(投票成功){
$data = [
xxx
];
//Mail::sendMail($data);
WeChat::sendMsg($data);
}
复制代码
业务逻辑的代码中不再含有针对特定领域问题代码的调用,也就是达到了代码复用的功能,而服务是否可用的检测也可以放到对应的Mail或WeChat类中去执行。
三、关注点如何分离?
这里举几个常用的例子:
1. 纵向分离
即便是最初级的程序员也都接触过,可能是你并没有意识到而已。也就是所谓的MVC架构,可以看做是一个请求进来后,需要经过的路径。
2. 横向分离
也就是模块之间的分离,如商品模块、订单模块、用户模块等。
3. 切面分离
就是所谓的面向切面编程AOP。可以将一些跨多层逻辑的功能独立封装起来,例如Log日志功能,可以在C层进行日志记录,也可以在M层进行日志记录。
四、结语
在实际的工作中你会发现,软件开发就是这样,没有什么是不变的,唯一不变的,就是变化。 至此,关注点分离这块内容暂告一段落。
资料参考
更多好文
请扫描下面二维码
欢迎关注~