2017-06-12 5 views
2

私はスカラープログラミングでは新しいです。私は非同期かつ機能的な方法で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(...)と書くのと同じように、アドホックなロギングではないと思います。
+0

私にとって、ログは自分のプログラムの正しさに重要ではないと私は考えます。だから、自分のコードで副作用をモデル化しないことにしました。私は純粋なFPのあなたの抱擁に拍手喝采し、その答えを楽しみにしています。 – Stephen

+0

はい、多分もっと純粋かもしれません –

答えて

1

私が知っているScalaの開発者のほとんどは、便宜上、「非副作用」としてログを記録することが多い傾向があります。しかし、本当にそれらを追跡したい場合は、 "フリーモナド"の概念を見てみたいかもしれません。詳細情報: general description,example with logging

私の大まかな説明は、「私たちのプログラムをいくつかのASTとしてモデル化して解釈しましょう」です。したがって、ASTでは、「ロギング」の概念を定義しますが、後で説明する実装は解釈しません。このアプローチでは、コードの "ビジネス"部分に影響を与えることなく、ロギングを監視し、アクションを(/ dev/nullへの書き込みから外部サービスへの非同期ポストへ)変更することができます。

+0

ありがとう! >「私たちのプログラムをいくつかのASTとしてモデル化して解釈しましょう」 いいですよ!多分 'log'という名前の設定のためのプロパティを追加するべきです。純粋なfpの場合、 'Free'モナドが最良の選択です。 –

関連する問題