依存関係をパラメータに含めるか
TL;DR
依存関係をパラメータに含めるかは、その型をパブリック API として公開するかで決まる
公開するケース(e.g. ワークフロー): 依存関係をパラメータに含めない 呼び出し側は知る必要がないため
公開しないケース(e.g. ワークフローの各ステップ): 依存関係をパラメータに含める
各ステップが実際に必要とするものを文書化できるため
hr.icon
code:fsharp
type ValidateOrder =
CheckProductCodeExists // 依存関係
-> CheckAddressExists // 依存関係
-> UnvalidatedOrder // 入力
-> AsyncResult<ValidatedOrder, ValidationError> // 出力
type PriceOrder =
GetProductPrice // 依存関係
-> ValidatedOrder // 入力
-> Result<PricedOrder, PricingError> // 出力
プロセスがどう処理されるかを隠蔽すべきという意見もある
この場合、型は以下のようになる
code:fsharp
type ValidateOrder =
UnvalidatedOrder // 入力
-> AsyncResult<ValidatedOrder, ValidationError> // 出力
type PriceOrder =
ValidatedOrder // 入力
-> Result<PricedOrder, PricingError> // 出力
どちらのアプローチでも良いが、以下のガイドラインに沿うと良い
公開されている関数の場合は、依存関係を隠蔽する
e.g. ワークフローを表す型
type PlaceOrderWorkflow = PriceOrder -> AsyncResult<PlaceOrderEvent list, PlaceOrderError>
呼び出し側は知る必要がないため
内部で使用されている関数の場合は、依存関係を明示する
e.g. ステップを表す型(ValidateOrder や PriceOrder )
これにより、各ステップが実際に必要とするものを文書化できる
また、あるステップの依存関係が変化したとき、そのステップの関数定義も変更でき、それに伴い実装を変更することになる