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(...)
}

如果愿意,用户还应该能够使用他们自己Parsertrait 实现。

但是,我不确定这是否是最好的方法。

  • 这种方法有什么普遍的缺点吗?
  • 使用访问修饰符隐藏这两个实现怎么样?从客户的角度来看,是否有理由访问实施?

您可能认为这些是关于松散耦合和抽象的非常基本的问题。情况不一定如此,我自己一直在使用依赖注入框架和类似的东西。然而; 我以前从未发布过库,并且发现很难提供每个人都可以灵活使用而又不复杂的东西。

4

0 回答 0