浅谈Laravel中的设计模式(一) SoC 关注点分离

1,944 阅读3分钟

阅读时长: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层进行日志记录。

四、结语

在实际的工作中你会发现,软件开发就是这样,没有什么是不变的,唯一不变的,就是变化。 至此,关注点分离这块内容暂告一段落。

资料参考

segmentfault.com/a/119000000…

www.cnblogs.com/asis/p/arch…

www.cnblogs.com/wenhongyu/a…

更多好文

请扫描下面二维码

欢迎关注~