特定のコマンドが呼び出されたときにデータを保存してロードする必要があることを知る下位レベルのライブラリを持つソリューションを作成しようとしていますが、保存およびロード機能の実装は、下位レベルのライブラリを参照する特定のプロジェクトです。これを定義する方法を関数型プログラミングと依存関係の逆転:記憶域を抽象化する方法
do saveUser()
let user = loadUser (UserID 57)
あり:
type User = { UserID: UserID
Situations: SituationID list }
type Situation = { SituationID: SituationID }
そして、何私がやりたいことを定義し、のような関数を呼び出すことができます:
私は、次のようないくつかのモデルを持っています機能的なイディオムをきれいに、できれば変更可能な状態を避けながら(これは必ずしも必要ではない)?
type IStorage = {
saveUser: User->unit;
loadUser: UserID->User }
module Storage =
// initialize save/load functions to "not yet implemented"
let mutable storage = {
saveUser = failwith "nyi";
loadUser = failwith "nyi" }
// ....elsewhere:
do Storage.storage = { a real implementation of IStorage }
do Storage.storage.saveUser()
let user = Storage.storage.loadUser (UserID 57)
そして、この上のバリエーションが、私は初期化されていない状態のいくつかの種類を必要とすると考えることができるすべてのものがあります。それは次のようになります行うには
一つの方法。 (XamarinにはDependencyServiceもありますが、それはそれ自体避けたい依存関係です)。
まだ実装されていない記憶機能を呼び出すコードを書く方法はありますかそれは、可変状態を使用せずに?
(注:この問題は、ストレージ自体に関するものではありません - それは私が使用している例でしかありませんそれは不必要な可変状態を使用せずに機能を注入する方法についてです。。)