1

以下を仮定します。

  /**
 * the importer trait that glues extractor , transformator and loader together
 * (mini etl)
 */
trait Importer[A, B, C] {

  //this makes sure that the importer 
  //implements an extractor, a transformator and a loader (selfytping)

  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 =
    {

      /**
       * perform initializations if necessary
       */
      initializeExtractor
      /**
       * extraction step
       */
      val output = extract(dataSource: A)

      /**
       * before the loading takes place we initialize the Loader if required
       */
      initializeLoader
      /**
       * conversion method that gets injected the load method
       */
      val transformed = transform(output, load)

      /**
       * perform actions afterwards if required
       */
      cleanupExtractor

      cleanupLoader

    }

初期化メソッドには現在、何もしないダミーの実装があります。そして、必要に応じてそれを上書きするのは、具体的なトレイト/サブクラス次第です。これは少し不器用なようです。

それを行うより良い方法はありますか?

4

1 に答える 1

0

クラスは 1 つのことだけを実行する必要があります。

  • Extractor は、抽出方法を知っている必要があります。
  • Transformer は、変換方法だけを知っている必要があります。
  • ローダーはロード方法だけを知っている必要があります
  • Importer は、Extractor、Transformer、および Loader を指定して、インポートする方法を知っている必要があります。

つまり、インポーターがすべての ETL メソッドを実装する必要はありません。ETL オブジェクトを受信または作成し、適切に使用する必要があります。

ETL コンポーネントを自己完結型のユニットにします。それらは自分自身を処理する方法を知っている必要があります: 構築時に初期化し、スコープ外に出たときにクリーンアップします。

私はこの種のことを Java + Spring の依存性注入で行いました。My Importer は真のグルー コードであり、Spring によって構成された受信 ETL コンポーネントを 1 行のコードに単純に組み合わせたものです。

1 つのことだけを行うという原則の観点から設計を再考すると、疑問は自然に消えるかもしれません。Scala を使用しているので、突然変異を避けるようにしてください。自然にインターフェースがよりクリーンになります。(あなたの initialize* メソッドは状態を変更するように聞こえるので、これについて言及します。)

于 2013-11-14T21:35:16.253 に答える