我在 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
trait 实现。
但是,我不确定这是否是最好的方法。
- 这种方法有什么普遍的缺点吗?
- 使用访问修饰符隐藏这两个实现怎么样?从客户的角度来看,是否有理由访问实施?
您可能认为这些是关于松散耦合和抽象的非常基本的问题。情况不一定如此,我自己一直在使用依赖注入框架和类似的东西。然而; 我以前从未发布过库,并且发现很难提供每个人都可以灵活使用而又不复杂的东西。