0. 简介
Tidies是一款重构Erlang代码的软件,不过现在官网已经打不开,而且软件本身没有开源,所以并不能用了。在网上找到一篇介绍tidies工作方式的论文,从中能整理出一些重构Erlang代码的方法,在此记录如下。
原文链接:https://users.ece.cmu.edu/~aavgerin/papers/PPDP09.pdf
相关的PPT:https://www.erlang-factory.com/upload/presentations/121/KostisSagonas-ErlangFactoryLondon2009-CleaningupErlangcodeisadirtyjobbutsomebodysgottadoit.pdf
简单来说,就是重构时留意几个原则:
- 将过时的函数替换掉。
- 避免使用过于复杂、难以理解的匿名函数。
- 善用列表解析,特别是出现lists:map/2和lists:filter/2的场合。
- 在返回布尔值的判断时,善用模式匹配。
现将论文中一些使用tidier重构的例子摘录如下,以作参考。当然直接阅读原文是最好的。
1. 简单的重构
1.1. Modernizing guards and calls to old-fashioned functions(将过时函数替换为新函数)
The modernizing function name refactoring modernizes the guard names and takes care of such function renaming
issues.
替换bif函数:
atom/1 → is_aotm/1
binary/1 → is_binary
integer/1 → is_integer/1
替换常用的库函数:
dict:list_to_dict/1 → dict:from_list/1
unix:cmd/1 → os:cmd/1
Tidiers可以自动而高效的帮助开发人员完成代码的替换。
1.2 Turning apply calls to remote calls
消去apply,能显著提升代码的可阅读性和可理解性。
apply(M,F,[A1,A2]) → M:F(A1,A2)
1.3 Turning funs into functions(将匿名funs抽出做单独的函数functions)
This transformation is known as lambda lifting in functional languages and is a special case to what is known as the extract method refactoring in the object-oriented refactoring lingo.
简单来说,在逻辑复杂的时候不要使用匿名函数,会让代码变得难以阅读(特别是结合lists模块的方法的时候)。
使用以上三种重构方式的实践如下,不是很难,看下就行:
2.Record transformations(记录转换)
在卫语句中,像是is_record/2
或者is_record/3
这种写法是多余的,除了确实要分辨传入变量的类型的情况,应在参数中直接匹配相应的record结构。
例如对Erlang/OTP R13B lib/ssl/src/ssl prim.erl:121
代码执行重构:
process(St, Pid) when is_record(St, st),St#st.status =:= open