0

Scalaでライブラリを作成しました。これは、さまざまな実装が付属するパーサーです。すべてから抽象化する特性は、次のようになります (簡略化)。

trait Parser {
  def parse(in: Array[Byte]): Array[Byte]
}

ライブラリによって提供される具体的なパーサーの実装は、上記の特性を拡張します (目を見張るものはありません)。

class FastParser(...) extends Parser...
class HighQualityParser(...) extends Parser...

クライアントが具体的な実装クラスに依存することを望まないので (パッケージを非公開にすることも考えました)、タイプを公開せずにパーサーへのアクセスを提供するトレイトのコンパニオン オブジェクトを使用しています。

object Parser {
  def getFastParser: Parser = new FastParser(...)
  def getHighQualityParser: Parser = new HighQualityParser(...)
}

ユーザーは、必要に応じて独自Parserトレイトの実装を使用できる必要もあります。

ただし、これが最善のアプローチであるかどうかはわかりません。

  • このアプローチには一般的な欠点がありますか?
  • アクセス修飾子を使用して 2 つの実装を非表示にするのはどうですか? クライアントの観点から、実装にアクセスする理由はありますか?

これらは、疎結合と抽象化に関する非常に基本的な質問だと思うかもしれません。これは必ずしもそうではありません。私は常に依存性注入フレームワークなどを使用しています。でも; 私はこれまでライブラリを公開したことがなく、誰もが柔軟に使用できるものを複雑にすることなく提供することは非常に難しいと感じています.

4

0 に答える 0