0

いくつかのミニパターンを探しています。プログラムは、さまざまな形式を入力としてサポートし、変換を適用して、最後のステップでそれらをデータベースにロードできる必要があります。

その主な目的は、テスト データを提供することです。

私の最初のアイデアは、さまざまなコンポーネントを次のように「接着」することでした。

汎用データソース [A] から [B] の反復子に抽出するエクストラクタ、[B] を [C] にマップするトランスフォーメータ、最後に [C] をデータベースにロードするステップがあります。これにアプローチするより良い方法があるに違いないと確信しています。これを達成するためのより良い、おそらくより一般的な方法はありますか?

trait Importer[A, B, C] {

  val extractor: Extractor[A, B]
  val transformer: Transformator[B, C]
  val loader: Loader[C]

  /**
   * this is the method call for chaining all events together
   */
  def importAndTransformData(dataSource: A): Unit =
    {
     /**
      * extraction step
      */
      val output = extractor.extract(dataSource: A)

      /**
       * conversion method
       */
      val transformed = output map (transformer.transform(_))

      /**
       * loading step
       */
      transformed.foreach(loader.load(_))
    }

}

敬具、

ステファン

4

1 に答える 1

0

Scala で使用される一般的なアプローチの 1 つは、セルフタイピングです (特にCake パターンで使用されます)。あなたの場合、それは次のようになります:

trait Importer[A, B, C] {
  self: Extractor[A, B] with Transformator[B, C] with Loader[C] =>

  /**
   * this is the method call for chaining all events together
   */
  def importAndTransformData(dataSource: A): Unit =
    {
     /**
      * extraction step
      */
      val output = extract(dataSource: A)

      /**
       * conversion method
       */
      val transformed = output map (transform(_))

      /**
       * loading step
       */
      transformed.foreach(load(_))
    }

}

その後、次のようなコードを使用して Importer を構築できます。

val importer = new Importer with FooExtractor with FooBarTransformer with BarLoader {}

また

val testImporter = Importer with MockExtractor with TestTransformer with MockLoader {}

またはあなたのテストケースに似ています。

于 2013-10-14T22:48:34.403 に答える