我在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
特征实现。
但是,我不确定这是否是最佳方法。
您可能认为这些是关于松散耦合和抽象的非常基本的问题。这不一定是这种情况,我自己一直使用依赖注入框架和类似的东西。然而;我以前从未发布过图书馆,发现很难提供一些可以灵活使用的东西而不会变得复杂。