zoukankan      html  css  js  c++  java
  • 一次awk脚本的重构

    # 脚本功能说明: 
    # 1. 检查URL中的域名是否是指定版本的域名
    # 2. 对访问bid,authorid的游客身份排重,并累加其pv
    # 全局变量说明
    # DOMIAN_LIST 是数组,key是要统计的域名value是域名所属的业务
    
    # 函数参数说明:
    # domain 从URL里提取出来的域名
    # ver    域名属于哪个业务(wap or touch)
    # statid 从URL里提取的出来的bookid或者authorid
    # array  用于排重的并累加PV的数组
    function compute(domain, ver, statid, userid, array __ARGVEND__)
    {
        # 提取失败或该域名不在本次处理的业务范围内
        if(domain == "" || DOMAIN_LIST[domain] != ver)
        {
            next # 跳过当前记录的处理,处理下一条记录
        }
    
        # 提取statid失败
        if(statid == 0)
        {
            next
        }
    
        array[statid " " userid]++
        next
    }
    
    {# 记录处理器
    
        url     = $6
        userid  = $4
        session = $9
    
        # URL里包含该标志则该URL记录的是用户对wap版书籍的访问记录
        if(match(url,/ct=bk&ac=cver&total=wap_book/) > 1)
        {
            domain = getMatchDomin(url, DOMAIN_LIST) # 从URL里提取域名,提取失败则为""
            userid = choice(userid, session)         # 从日志里选择用户身份,userid < 0 则取session
            bid    = getBid(url)                     # 从URL里提取书籍ID
    
            compute(domain, "wap", bid, userid, WAP_BOOKS)
        }
    
        # URL里包含该标志则该URL记录的是用户对wap版作者的访问记录
        if(match(url,/ct=bk&ac=zz&total=wap_author/) > 1)
        {
            domain = getMatchDomin(url, DOMAIN_LIST) # 从URL里提取域名,提取失败则为""
            userid = choice(userid, session)         # 从日志里选择用户身份,userid < 0 则取session
            authorid    = getAuthorid(url)                     # 从URL里提取书籍ID
    
            compute(domain, "wap", authorid, userid, WAP_AUTHORS)
        }
    
            # other code ...
    }

    看起来还不错,但是函数的参数真心的多,一般的编码规范说多于5个和5个以上函数就不容易被使用了(这么说起来win32 api其实也蛮逆天的...)但是这里似乎还好吧,忍了吧,错!这里除了参数多,还有一个问题,就是一旦提取域名失败或者域名不是我们这次要处理的域名,则userid,bid等数据不需要提取,严重的浪费了CPU时间(要知道这些动作得多执行一亿多次)仔细想想,这个函数其实完成了2个事情:检查域名是否有效,累加pv,分成2个函数是不是更好呢?

    #检查URL中的域名是否是指定版本的域名
    function checkVer(domain, ver, __ARGVEND__)
    {
            if(domain == "" || DOMAIN_LIST[domain] != ver)
            {
                    next
            }
    }
    
    #对访问bid,authorid的作者排重,并累加pv
    function compute(statid, userid, array, __ARGVEND__)
    {
            if(statid == 0)
            {
                    next
            }
    
            array[statid " " userid]++
            next
    }
    
    
    {# 记录处理器
    
        url     = $6
        userid  = $4
        session = $9
    
            # URL里包含该标志则该URL记录的是用户对wap版书籍的访问记录
            if(match(url,/ct=bk&ac=cver&total=wap_book/) > 1)
            {
                    checkVer(getMatchDomin(url, DOMAIN_LIST), "wap") # 检查域名
    
                    userid = choice(userid, session)
                    bid    = getBid(url)
                    compute(bid, userid, WAP_BOOKS)
            }
    
            # URL里包含该标志则该URL记录的是用户对wap版作者的访问记录
            if(match(url,/ct=bk&ac=zz&total=wap_author/) > 1)
            {
                    checkVer(getMatchDomin(url, DOMAIN_LIST), "wap")
    
                    userid   = choice(userid, session)
                    authorid = getAuthorid(url)
                    compute(authorid, userid, WAP_AUTHORS)
            }
    }

    试验了一下,不仅函数参数个数减少了,而且逻辑更通顺,性能也更好,代价就是函数个数增加了,不过看起来这个代价仍然是合算的

    更正:

    我查了代码大全,代码大全说7个参数才是人类记忆的极限,好吧,不过我认为之前的重构是没有问题的~~~因为好处很明显

  • 相关阅读:
    栈:逆波兰表达式(后缀表达式)
    栈:实现综合计算器(中缀表达式)
    栈:数组模拟栈
    链表(Linked List):单向环形链表
    单链表常见面试题
    链表(Linked List):双向链表
    链表(Linked List): 单链表
    队列和环形队列
    稀疏数组
    Linux命令--pushd和popd
  • 原文地址:https://www.cnblogs.com/code-style/p/3456149.html
Copyright © 2011-2022 走看看