一次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个参数才是人类记忆的极限,好吧,不过我认为之前的重构是没有问题的~~~因为好处很明显
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述