公共api中的记录与标记元组

时间:2016-07-19 17:37:43

标签: erlang

从查询函数返回记录是否常见?如果没有,有什么缺点?

我们说我有一个查询服务,它可以返回一些汽车以及它们当前是否已租用。

car 的记录如下所示:

-type rent_state:: rented | available.
-record(car, {make::string(), year::integer(), color::string(), state::rent_state()}).

如果我对汽车进行查询,返回此记录是否合理?

-type car::#car{}.
-spec cars() -> [car()].

或者我应该创建一个标记的元组类型吗?

-type car()::{ {make, string()}, {year,integer()}, {color,string()}, {state,rent_state()}}).

我想制作一个适合其他人使用的API。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:3)

我喜欢在本地使用记录到模块,但我发现在应用程序之间共享它们会遇到一些瑕疵:

  • 将它们加载到REPL中有点痛苦
  • 记录定义是全局的,因此您可能希望将记录命名为drozzy_vehicles_car或其他更长的内容然后使用它会很难看
  • 您图书馆的用户必须包含定义记录的头文件,否则无法使用

你描述的标记元组看起来像是一个很大的痛苦 - 没有简单的方法从中间抓取一些东西。

如果你不懒,我会使用地图,如果不是,我会使用访问者。

图:

Car = #{ make => "foo", year => 2016, color => "red", state => rented}.

访问者:

1> Car = rentals:get_car().
{car,"foo",2016,"red",rented}  %% it's actually a record, but we don't expose that!
2> rentals_car:year(Car).
2016
3> rentals_car:state(Car).
rented
4> % etc