代码优化

我们开发软件系统的时候,需要不断的反思我们代码里面是否有可以优化的地方。

优化的重点之一,就是把冗余的代码优化为可以复用的库。


大家有没有发现我们前面有很明显的冗余代码?

对了,就是那个 分发请求给不同函数处理的 dispatcher函数,

如下的3个文件中,

mgr\customer.py
mgr\medicine.py
mgr\order.py

我们可以用代码比对工具( 比如 BeyondCompare ) 比对一下,如下所示

image

该函数的大体代码基本类似,不同之处,只是分配给哪些函数处理。

冗余代码有什么坏处?

当你需要修改这些代码的时候,比如你需要把里面的 status=302 统一改为301,你需要每个地方都修改,非常的麻烦。

所以我们应该合并到一个库文件里面。


我们可以在项目根目录中新增lib目录,里面新建一个文件 名为 handler.py。

接下来我们要在 这个 handler.py 里面定义一个 dispatcherBase 函数,实现通用部分的代码。

我们发现 请求消息给哪个函数处理, 完全是由 请求消息里面的action参数决定的, 所以,我们可以修改下面这3个代码文件

mgr\customer.py
mgr\medicine.py
mgr\order.py

以 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


您需要高效学习,找工作? 点击咨询 报名实战班

点击查看学员就业情况