2012-03-26 5 views
1

関数型のプログラムを設計するときは、単一​​のオブジェクトで動作する関数の基本層を設計することを考えます。次に、それらのオブジェクトのコレクションを操作する必要がある場合は、マッピング、フィルタリング、リダクションなどの従来の機能的な接着剤を使用してベースレイヤの上に構築を開始します。関数型のDBバックアップアプリケーションの設計

たとえば、私はDBバックアップアプリケーションユーザーとタスクがあり、ユーザーにはタスクが割り当てられています。

私は

def doesUserPerformTask?(taskId, userId) 
    // Go to DB to see if this userId does this taskId 
    // return userid if success or else nil 
end 

のように定義された機能を有していてもよいその後の道を、私は、ユーザーIDのリストを与えられたタスクX.パーフェクトを行い、それらのどれかを知りたいのですが、私はすでに機能doesUserPerformTask?を持って

それはコード内の他の箇所でテストされているので、ユーザーIDリストをマップして、それぞれの関数を呼び出して結果をフィルタリングすることができます。

これは機能的な設計の大きな利点ですが、マップに渡された各要素(つまりユーザーID)にはDBヒットが必要な効率の問題があります。私は今、userIdのリストで動作するまったく新しい関数を作成する必要があります。

DBバックアップされたプログラムを機能スタイルで設計するときに、この問題にぶつかります。ここでは、機能の基本レイヤーを構築せず、両方のために特別に書かれたたくさんの関数単一のアイテムおよびアイテムのコレクションで操作する。

機能型で記述されたDBバックアッププログラムを整理するためのより良い方法はありますか?

+1

他にもありません*? FPの強い訴訟ではないものもあります。それにもかかわらず、熱狂。 – cHao

+0

ソリッドステートドライブが安価/高速/大容量になると、RAM /ディスク間の境界がぼやけ、パフォーマンスの低下がなくなり、提案するプログラミングのスタイルが理にかなっています。その間、キャッシュはどうですか? – Eduardo

答えて

0

なぜ実際のオブジェクトを関数に渡さないのですか?

def doesUserPerformTask?(task, user) 
    // Check the user object directly 
    // return true or (false|nil) 
end 

次に次にあなたがしようとしている場合を除き、その後、再びコレクション

def whichUsersPerformTask?(task) 
    // fetch users from DB 
    // map non-db function over collection 
end 

のラッパーを書くDB

def doesUserPerformTaskFromDB?(taksId, userId) 
    // DB calls here 
    if doesUserPerformTask?(task, user) ? user.id : nil 
end 

からのユーザーとタスクを取得するラッパーを書きますそのユーザーのコレクションを何か他のものに使用すると、DB問合せに依存して(問合せ言語を使用して)必要なユーザーを取得する方が良いとは限りません。これを効率的かつドライにするためのオプションがいくつかあるようです。

関連する問題