嵌套代码表现为在 case/if/receive
语句中又包含着 case/if/receive
语句。这种深度嵌套的编程风格非常糟糕,代码很容易跨越一个屏幕页面,变得难以阅读。应该把大多数代码限定到最多两级缩进的程度。将代码分割为较短的函数可以解决这个需求。
超过 400 行代码的模块实在是太大了。最好用一系列小模块来代替大型模块。
不要让函数代码超过 15 到 20 行。应将大型函数分割为一些小型函数,也不要写把代码行写得过长。
过长的代码行是不可取的。每行代码最多不宜超过 80 个字符(一张 A4 纸就能容纳得下)。
自 Erlang 4.3 起,字符串常量可以自动连接。比如:
io:format("Name: ~s, Age: ~w, Phone: ~w ~n" "Dictionary: ~w.~n", [Name, Age, Phone, Dict])
选择有意义的变量名——尽管这一点很难办到。
如果变量名包含一些单词,使用 _
或某个大写字母来分隔它们。比如:My_variable
或 MyVariable
。
对于不会用到的变量(don't care variable),则不要在变量名中间使用 _
,而应在变量名前加上 _
。比如说 _Name
。如果将来需要该变量值,则只需去掉变量名前面的下划线即可。这样就不会有确定应替换具体哪个下划线的麻烦,而且代码也易于阅读。
函数名必须要和函数的功能相符。函数名应能反映出函数所返回的参数类型,不能让阅读代码的人感到诧异。另外,对于常见的函数,应采用常见的名称(比如 start
、stop
、init
,main_loop
等)。
对于不同模块中的用来解决相同问题的函数,其函数名应相同。比如,Module:module_info()
。
糟糕的函数名是最常见的编程错误之一,从而也反映出取一个合适的名称是多么难!
在编写大量不同的函数时,有些命名规范非常有用。比如,名称前缀 is_
用来标识函数返回原子 true 或 false。
is_...() -> true | false check_...() -> {ok, ...} | {error, ...}7.7 模块的取名
Erlang 具有扁平的模块结构(不会出现模块嵌套的情况)。然而,我们往往希望能够模拟层级式模块结构的效果。通过带有相同模块前缀的相关模块集合可以实现这种结构。
比如,假设有一个 ISDN 处理程序,它是通过 5 个不同且相关的模块实现的,这些模块应该按照如下方式来取名:
isdn_init isdn_partb isdn_...
编程风格应该保持一致,这样有助于你和其他人日后理解这些代码。不同的开发人员都有不同编程风格,比如代码缩进、空格的使用,等等。
比如,在写元组时,你可能会用一个单独的逗号来分隔两个元素:
{12,23,45}
而其他人可能会在逗号后面加上一个空格:
{12, 23, 45}
总之,一旦你认准了一种风格,就要坚持使用它。
在一个较大的项目中,所有代码部分的编程风格应保持统一。