问题的产生
虽然每个接口都不一样,但部分功能是重叠的
比如,有些接口是需要登录、并且是管理员才可以调用的
假设我们获取、上传用户数据都需要“管理员身份”
那么获取用户数据时:
- 检查是否登录
- 检查是否是管理员
- 从请求里取出“用户 id”
- 从数据库获取用户数据
- 响应
上传用户数据时:
- 检查是否登录
- 检查是否是管理员
- 从请求取出“用户数据”
- 存到数据库
- 响应
当我们写这俩 handler 时,检查登录和检查是否为管理员是重复的
也许,项目较小时,我们可以不做特殊处理:
- 把这两个检查写在“取出用户 id”前面
- 然后,复制、粘贴到“上传用户数据”接口
但项目大时:
- 复制、粘贴,一听就,,,,,,好 low 啊
- 重复复制的代码,使项目的代码总量极具增长
- 当“检查是否为管理员”的逻辑变化时,不得不重新复制粘贴
- ……
总之,我们不应该重复造轮子
用“三明治”解决
三明治编程就是要解决这种问题
如果你没吃过三明治,至少应该也吃过肉夹馍吧
一般情况下,不同的三明治,只是中间的“夹心”不一样
可以是牛肉、可以是煎鸡蛋、可以是土豆丝、鱼香肉丝……(听说还有毛血旺?)
可以说是变化无穷,但两边的面包一直是面包,几乎不怎么变
但也有一些花样:荞麦的?小麦的?烤的?软糯的?
这种形式,用到编程里,就可以这样类比:
- 通用的操作(如检查登录、检查用户身份、检查参数、捕获可能的异常)就像两边的面包
- 具体的操作(比如查询用户、新增用户、删除用户、更新用户……)就像里面的夹心
写代码时,通用的操作只写一次!