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

阅读时长:7分钟html

技术预备:熟悉Laravel的使用程序员

关注点分离(Separation of Concerns, SoC)

这个设计模式应该做为咱们开发和架构的原则,在开发某个业务逻辑时,应将不一样的功能点进行划分,下降耦合度。编程

1、首先关注点是什么呢?

举例来讲,咱们打游戏放技能时一般都是要键盘和鼠标一块儿操做的,可是本质上键盘只负责选择技能,而鼠标只负责选择对象,这就是两个不一样的关注点。segmentfault

在软件中,能够举一个最通俗的例子,MVC分层。设计模式

Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。bash

View(视图)是应用程序中处理数据显示的部分。微信

Controller(控制器)是应用程序中处理用户交互的部分。架构

甚至于所谓的面向切面编程AOP,也是一种SoC的实现。spa

在这里,咱们能够用Laravel的Eloquent举例设计

Eloquent里将关注点分为了:Attributes、Event、Relationships等Trait模块,不一样的Trait模块只负责对应的功能,这样就将模型的逻辑成功分离。

2、为何须要关注点分离?

因为关注点,也就是逻辑,混杂在一块儿会使软件难以维护,回想一下本身初学编程时写的那些代码就知道有多可怕了,一个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类中去执行。

3、关注点如何分离?

这里举几个经常使用的例子:

1. 纵向分离

即使是最初级的程序员也都接触过,多是你并无意识到而已。也就是所谓的MVC架构,能够看作是一个请求进来后,须要通过的路径。

2. 横向分离

也就是模块之间的分离,如商品模块、订单模块、用户模块等。

3. 切面分离

就是所谓的面向切面编程AOP。能够将一些跨多层逻辑的功能独立封装起来,例如Log日志功能,能够在C层进行日志记录,也能够在M层进行日志记录。

4、结语

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

资料参考

segmentfault.com/a/119000000…

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

www.cnblogs.com/wenhongyu/a…

更多好文

请扫描下面二维码

欢迎关注~

相关文章
相关标签/搜索