私はスカラープログラミングでは新しいです。私は非同期かつ機能的な方法でbizメソッドを宣言する方法について今や困惑しています。メソッドの実装には多くのログメッセージを含める必要があります。悪い習慣として、私はこのようなコードを書く:機能的な方法でログメッセージを処理するためのベストプラクティスは何ですか?
// trait
trait StoreService {
def create[Config]: Kleisli[Future, Config, Store]
}
// and the interpreter
trait StoreServiceInterpreter extends StoreService {
def create[Config]: Kleisli[Future, Config, Store] = Kleisli {cfg =>
// some implementation ...
log.info("bla bla bla ...")
// some implementation ...
// return a store
Store(...)
}
}
それは悪いですが、実装は副作用である、場所をint何かをログ起こします。だから、私はこのようなメソッドの宣言に変更:ライターを使用して
// trait
trait StoreService {
def create[Config]: Kleisli[Future, Config, Writer[Vector[String], Store]]
}
// and the interpreter
trait StoreServiceInterpreter extends StoreService {
def create[Config]: Kleisli[Future, Config, Writer[Vector[String], Store]] = Kleisli {cfg =>
// some implementation ...
// log.info("bla bla bla ...")
// some implementation ...
// return a store
Writer(Vector("bla bla bla...", Store(...))
}
}
を、副作用が排除されますが、コードは明らかではない。
- はなぜ作家が返さ? には
Store
より多くのノイズがありますが、定型コードを避けるための方法はありません。 - 書き込み
log
はアドホックではありません!ログを追加するには、:+
または++
操作を使用して、メッセージを保持する文字列のベクトルを構築する必要があります。私はどこでもlog.info(...)
と書くのと同じように、アドホックなロギングではないと思います。
私にとって、ログは自分のプログラムの正しさに重要ではないと私は考えます。だから、自分のコードで副作用をモデル化しないことにしました。私は純粋なFPのあなたの抱擁に拍手喝采し、その答えを楽しみにしています。 – Stephen
はい、多分もっと純粋かもしれません –