我有一个函数接受坐标(元组)作为其参数之一:
func({X, Y}, Something) when is_integer(X), is_integer(Y) -> ...
Run Code Online (Sandbox Code Playgroud)
我想确保坐标:
我可以使用上面的防护,它可以正常工作.但是,我有许多使用坐标的函数,我想知道我是否可以以某种方式清理这个构造(一些宏?)所以会有类似的东西:
func(XY, Something) when ?is_coord(XY) -> ... % how to define ?is_coord
Run Code Online (Sandbox Code Playgroud)
有没有一种干净,惯用的方式呢?是erlang-ish吗?
编辑
Erlang文档明确阻止防御性编程:
3.13不要"防守"编程
防御性程序是程序员不"信任"输入数据到他们正在编程的系统部分的程序.通常,不应该将输入数据测试到函数的正确性.系统中的大多数代码都应该在假设所讨论的函数的输入数据是正确的情况下编写.只有一小部分代码应该实际执行任何数据检查.这通常是在数据第一次"进入"系统时完成的,一旦数据被检查,因为它进入系统后应该被认为是正确的.
有一个干净的,我认为相当的Erlang-ish方式来定义is_coord宏:
-define(is_coord(C), tuple_size(C) =:= 2
andalso is_integer(element(1, C))
andalso is_integer(element(2, C))).
func(Coord, Something) when ?is_coord(Coord) ->
...
Run Code Online (Sandbox Code Playgroud)
请注意,tuple_size/1也意味着is_tuple/1检查.