2016-07-19 5 views
4

クエリ関数からレコードを返すのが一般的ですか?そうでない場合、欠点は何ですか?レコードとパブリックAPIのタグ付きタプル

質問サービスがあり、台の車を返すことができ、現在レンタル中であるかどうかは問いません。

のための私のレコードは、このようなものになります。私は、車のクエリを持っていた場合

-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を作りたいと思います。何かアドバイスをいただきました。

答えて

4

私はモジュールにローカルレコードを使用して好きですが、私は、アプリケーション間でそれらを共有することは、いくつかのイボに動作することを見つける:

  • それは彼らが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 
+0

。返信にデータを追加し、リクエストを処理しているときにシステムをアップグレードするときは、まず呼び出しモジュールをロードして、そのモジュールの新しいバージョンで古いもの(タグ付けされたタプル)と新しいバージョンのレコード呼び出されたクエリサービスモジュールのバージョンがわからないことがあります。 –

関連する問題