代码优化
我们开发软件系统的时候,需要不断的反思我们代码里面是否有可以优化的地方。
优化的重点之一,就是把冗余的代码优化为可以复用的库。
大家有没有发现我们前面有很明显的冗余代码?
对了,就是那个 分发请求给不同函数处理的 dispatcher函数,
如下的3个文件中,
我们可以用代码比对工具( 比如 BeyondCompare ) 比对一下,如下所示
该函数的大体代码基本类似,不同之处,只是分配给哪些函数处理。
冗余代码有什么坏处?
当你需要修改这些代码的时候,比如你需要把里面的 status=302 统一改为301,你需要每个地方都修改,非常的麻烦。
所以我们应该合并到一个库文件里面。
我们可以在项目根目录中新增lib目录,里面新建一个文件 名为 handler.py。
接下来我们要在 这个 handler.py 里面定义一个 dispatcherBase 函数,实现通用部分的代码。
我们发现 请求消息给哪个函数处理, 完全是由 请求消息里面的action参数决定的, 所以,我们可以修改下面这3个代码文件
以 customer.py 为例, 我们删除原来的dispatcher函数, 在代码的最下面添加 如下的代码
from lib.handler import dispatcherBase
Action2Handler = {
'list_customer': listcustomers,
'add_customer': addcustomer,
'modify_customer': modifycustomer,
'del_customer': deletecustomer,
}
def dispatcher(request):
return dispatcherBase(request, Action2Handler)
我们定义一个 什么样的action 用什么函数 处理的一张表 Action2Handler 。
然后,dispatcher 函数可以简单到 直接调用 dispatcherBase, 并且把Action2Handler 作为参数传递给给它。
剩下的就交由 dispatcherBase 去处理了。
dispatcherBase 函数在 handler.py 里面 ,其代码如下:
def dispatcherBase(request,action2HandlerTable):
# 根据session判断用户是否是登录的管理员用户
if 'usertype' not in request.session:
return JsonResponse({
'ret': 302,
'msg': '未登录',
'redirect': '/mgr/sign.html'},
status=302)
if request.session['usertype'] != 'mgr':
return JsonResponse({
'ret': 302,
'msg': '用户非mgr类型',
'redirect': '/mgr/sign.html'},
status=302)
# 将请求参数统一放入request 的 params 属性中,方便后续处理
# GET请求 参数 在 request 对象的 GET属性中
if request.method == 'GET':
request.params = request.GET
# POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取
elif request.method in ['POST','PUT','DELETE']:
# 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式
request.params = json.loads(request.body)
# 根据不同的action分派给不同的函数进行处理
action = request.params['action']
if action in action2HandlerTable:
handlerFunc = action2HandlerTable[action]
return handlerFunc(request)
else:
return JsonResponse({'ret': 1, 'msg': 'action参数错误'})
可以发现,大部分代码和以前相同,关键在最后
# 根据不同的action分派给不同的函数进行处理
action = request.params['action']
if action in action2HandlerTable:
handlerFunc = action2HandlerTable[action]
return handlerFunc(request)
这段代码就是根据action参数的值,到 action2HandlerTable 查找出对应的 函数处理。
同样的,我们需要修改一下 medicine.py 和 order.py, 定义各自的 action2HandlerTable 表, 把原来的dispatch改为调用 dispatcherBase。
目前为止,我们项目代码,在如下百度网盘中的 bysms_10.zip
百度网盘链接:https://pan.baidu.com/s/1nUyxvq6IYykBNtPUf4Ho6w
提取码:9w2u