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个参数才是人类记忆的极限,好吧,不过我认为之前的重构是没有问题的~~~因为好处很明显

  • 相关阅读:
    P1144 最短路计数 题解 最短路应用题
    C++高精度加减乘除模板
    HDU3746 Teacher YYF 题解 KMP算法
    POJ3080 Blue Jeans 题解 KMP算法
    POJ2185 Milking Grid 题解 KMP算法
    POJ2752 Seek the Name, Seek the Fame 题解 KMP算法
    POJ2406 Power Strings 题解 KMP算法
    HDU2087 剪花布条 题解 KMP算法
    eclipse创建maven项目(详细)
    maven的作用及优势
  • 原文地址:https://www.cnblogs.com/code-style/p/3456149.html
Copyright © 2011-2022 走看看