2011-10-25 15 views
2

私は現在アーランをコーディングすることを学んでいます。シカゴ・ボスの上にWebアプリケーションがあります。 私はTodoというモデルを持っていますが、CRUD操作をREST APIとして提供したいと思います。私のPUTメソッドでこれをどのように最適化できますか?

私はこのコードを持っている:

index('PUT', [Id]) -> 
    Todo = boss_db:find(Id), 
    Body = element(2, mochijson:decode(Req:request_body())), 
    %% Set the new values 
    NewTodo = Todo:attributes([ 
      {subject, proplists:get_value("subject", Body)}, 
      {done, proplists:get_value("done", Body)} 
     ]) 
, 
    {json, [{todo, element(2, NewTodo:save())}]}. 

は、どのように私はこのコードフラグメントを最適化することができますか?または、これはすでに最高の可能性がありますか?

プロプリストのキーをアトム・キーに変更するには、「よりスマートな」方法がありますか?このように:

[{"subject", "Foo"}] -> [{subject, "Foo"}]. 

私はTodo変数を割り当ててからNewTodoを持つのも面倒です。悲しいことに、私がチェックアウトできるgithubでErlang Chicago Bossのアプリを見つけられません。それはあなたのケースでは大幅な速度改善となり、

t([{"subject", V}|T]) -> [{subject, V}|t(T)]; 
t([{"done" , V}|T]) -> [{done, V}|t(T)]; 
t([_    |T]) ->    t(T) ; % optional garbage ignoring clause 
t([])     -> []. 

しかし、私は疑問:

+0

何故element()関数は何をしますか?私はこれに新しいです。 :) –

答えて

1

あなたは、常にこのような何かを行うことができます。

は、あなたが最後のビット本からできスクイズになりますである場合があります。唯一のベンチマークコード競技;-)(最後の節でlists:reverse/1コールがないノートの価値がある

-compile({inline, [t/1]}). 
t(L) -> t(L, []). 

t([{"subject", V}|T], A) -> t(T, [{subject, V}|A]); 
t([{"done" , V}|T], A) -> t(T, [{done, V}|A]); 
t([_    |T], A) -> t(T, A); % optional garbage ignoring clause 
t([], A)     -> A. 

それは改善を台無しになります以前のバージョンを形成する)

PSを:あなたが思うなら、私はあなたが正しい、マイクロ最適化フリークので、私はいくつかのより多くの時間を直接BIFを使用するlists:reverse/2lists:reverse/1コールを交換し、保存します;-)

+1

リストを1回だけ渡すので、これは 'proplist'を使うよりも優れています。 – rvirding

0

残念ながら、私はハイネックの答えにコメントすることはできませんが、Erlangの初心者として、私の最初の推測では、の線に沿って何かのために行くされているだろう:あなたは本当にNewTodo割り当てを避けることができない

lists:map(fun({A, B}) -> {list_to_atom(A), B} end, [X || {Y, Z}=X <- List, is_list(Y)]).

0

方法約

index('PUT', [Id]) -> 
    Body = element(2, mochijson:decode(Req:request_body())), 
    OldTodo = boss_db:find(Id), 
    NewTodo = OldTodo:attributes([ {list_to_atom(A),B} || {A,B}<-Body ]), 
    {json, [{todo, element(2, NewTodo:save())}]}. 
関連する問題