2016-07-25 7 views
0

この状況を考えてみると、入力を確認してエラーを処理する必要があるサービスがたくさんあります。どのようにこの機能をスカラ方法を記述するのですか?

val log = Logger("access") 

def service1(){input=> 
    try{ 
     val id = input.split(",")(0).toInt 
     val value = input.split(",")(1) 
     //do something 
    } catch { 
     case e1: NumberFormatException => log.info("number format is wrong") 
     case e2: ArrayIndexOutOfBoundsException=> log.info("not enough arguments") 
    } 
} 

すべてのサービスでこの共通部分を処理するメソッドを記述したいと思います。私は、このようにそれを行うことができます:

def common(input:String, log:Logger, action:(Int)=>String):String={ 
    try{ 
     val id = input.split(",")(0).toInt 
     val value = input.split(",")(1) 
     action(id) 
    } catch { 
     case e1: NumberFormatException => log.info("number format is wrong") 
     case e2: ArrayIndexOutOfBoundsException=> log.info("not enough arguments") 
    } 
} 

そして、サービス機能は次のようになります。

def service1(){input=> common(input, log, id=>{ 
     //do something return a string 
    }) 
} 

は、それがコレクションにマップのような、よりエレガントに見えるように共通のパラメータをスキップする方法はありますか?

common(id=>{ //... }) 
+0

タプルとして使用するか、ケースクラスを作成して、求めているものを達成します。関数型プログラミングの方法ではありませんが、最初からやり直す必要があります(文字列の代わりにscalaz/catsを使うなど)。あなたのコールバックが 'NumberFormatException'や' ArrayIndexOutOfBoundsException'以外の例外を投げた場合、あなたのコードは動作しません – suish

答えて

1
import com.typesafe.scalalogging.StrictLogging 


class MyService extends AbstractService { 
    def service1(input: String): String = common(input) { 
    id => 
     id.toString 
    } 

    def service2(input: String): String = common(input) { 
    id => 
     id.toString.toLowerCase 
    } 
} 

trait AbstractService extends StrictLogging { 

    def common(input: String)(f: Int => String): String = { 
    try { 
     val id = input.split(",")(0).toInt 
     f(id) 
    } catch { 
     case e1: NumberFormatException => 
     logger.error("number format is wrong",e1) 
     "" //??? 
     case e2: ArrayIndexOutOfBoundsException => 
     logger.error("not enough arguments",e2) 
     "" //??? 
    } 
    } 
} 

入力が特定されている場合は、入力として、それを配置する必要があります。そうでない場合は、特性のメソッドdef input:Stringを定義して、サービスの実装を提供します。

関連する問題