私が持ってC# WebAPI
使用するアプリケーションF#
のライブラリを。
F#
ライブラリには、値を持っています:
let mutable CurrentCustomer:Customer option = None
私も持っています:
let Customers:Map<string,Customer> option = None
Customers
とCustomer
は両方とも「グローバル変数」です。起動時に、C#
アプリケーションは顧客のコレクションをこのグローバル変数にロードしますCustomers
。そして、私が持っているcustomersController
持っていることをPost
F#関数呼び出す、setCurrentCustomer
グローバル変数を設定CurrentCustomer
に保存されたコレクションからのCustomers
:
// Post in customersController:
public HttpResponseMessage Post(string identifier)
{
var _customer = FSharpLibrary.setCurrentCustomer(identifier);
// code
}
// setCurrentCustomer function:
let mutable CurrentCustomer:Customer option = None
let setCurrentCustomer() =
CurrentCustomer <- customer |> Some
CurrentCustomer
変更して状態を変更しないようにする方法はありますCurrentCustomer
か?
CurrentCustomer
オブジェクトを受け取り、新しいCurrentCustomer
オブジェクトを返す関数を作成できることはcustomersController
知っていますが、現在の顧客が何に設定されているかをどのようにして知ることができますか?
このグローバルな可変変数を持つことを回避する方法はありますCustomer
か?
CurrentCustomerを変更して状態の変更を回避する方法はありますか?
はい、それを行うには多くの方法がありますが、ほとんどの場合、FSharpLibrary
可変状態に依存しないように設計を変更する必要があります。
完全に一般的な答えとして、State Monadを適用することもできますが、多くの場合、それほど複雑ではないもので十分です。しかし、それが正確に何であるかは、あなたが何を達成しようとしているのかを知らずに答えることは不可能です。
customersController
現在の顧客が何に設定されているかをどのようにして知ることができますか?
現在の顧客をメソッドidentifier
からの引数に設定しているため、すでに認識していますPost
。その値は、メソッド全体の範囲内にあります。
問題は、なぜあなたFSharpLibrary
が可変状態にあるのかということです。代わりに純粋関数で実装することはできませんか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加