导出第三方库依赖项是好的编程实践吗?
Is exporting third party library dependencies good programming practice?
我正在使用 Intellij 14,在模块设置中,有一个导出依赖项的选项。
我注意到当我编写扩展特征的对象时,当其他模块尝试使用这些对象时,我需要在模块设置中 select 导出。
例如,
object SomeObj extends FileIO
需要我导出 FileIO 依赖项。
但是,如果我编写一个伴侣 class 在调用对象时创建一个新实例,则不再需要导出。
object SomeObject {
private val someObject = new SomeObject()
def apply() = someObject
}
private[objectPkg] class SomeObject() extends FileIO {}
这段代码比较冗长,有点像对 Scala 单例模式的破解。 export 第三方依赖与你的模块好吗?如果不是,我的模式是 Scala 的典型解决方案吗?
它们都涉及一般的代码设计原则。基本上,如果您稍后可能会切换底层第三方库,或者您的系统必须灵活地移植到其他一些库上——那么必须将实现隐藏在一些外观后面。
通常 java/scala 中有一组现成的接口,它们是在第三方中实现的,您可以将这些接口用作系统其余部分的外观的一部分,并且总的来说,这是一种 java 的方式。如果不是这种情况 - 您将需要自己派生接口。这个值不值大家结合上下文自己估计。
根据您的情况:请记住,在 java/scala 中您导出名称,并且如果您只使用 class(扩展 FileIO
)定义代码,这意味着 class 可以公开访问,并且它的类型也是 exported/leaked 外部。 Scala 应该抛出编译错误,如果一些私有 class 逃脱了它的可见范围(所以在你的 SomeObject
的第二个版本中可能是这种情况)。
考虑这个例子:我经常在我的应用程序中使用类型安全的配置库。它有方便的方法,但我通常将 space 留作可能的分隔(或者更确切地说是我自己的扩展名):
package object config {
object Config {
private val conf: TypeSafeConfig = ConfigFactory.load()
def toTypeSafeConfig: TypeSafeConfig = conf
}
@inline implicit def confToTypeSafeConfig(conf: Config.type): TypeSafeConfig = conf.toTypeSafeConfig
}
隐式转换只允许我在 Config
上调用所有 TypeSafeConfig
方法,而且它有很多方便的方法。从理论上讲,将来我可以删除我在 Config
对象中使用的隐式方法和实现方法。但是我很难想象为什么我会花时间在这上面。这是泄漏实施的一些示例,我认为没有问题。
我正在使用 Intellij 14,在模块设置中,有一个导出依赖项的选项。
我注意到当我编写扩展特征的对象时,当其他模块尝试使用这些对象时,我需要在模块设置中 select 导出。
例如,
object SomeObj extends FileIO
需要我导出 FileIO 依赖项。
但是,如果我编写一个伴侣 class 在调用对象时创建一个新实例,则不再需要导出。
object SomeObject {
private val someObject = new SomeObject()
def apply() = someObject
}
private[objectPkg] class SomeObject() extends FileIO {}
这段代码比较冗长,有点像对 Scala 单例模式的破解。 export 第三方依赖与你的模块好吗?如果不是,我的模式是 Scala 的典型解决方案吗?
它们都涉及一般的代码设计原则。基本上,如果您稍后可能会切换底层第三方库,或者您的系统必须灵活地移植到其他一些库上——那么必须将实现隐藏在一些外观后面。
通常 java/scala 中有一组现成的接口,它们是在第三方中实现的,您可以将这些接口用作系统其余部分的外观的一部分,并且总的来说,这是一种 java 的方式。如果不是这种情况 - 您将需要自己派生接口。这个值不值大家结合上下文自己估计。
根据您的情况:请记住,在 java/scala 中您导出名称,并且如果您只使用 class(扩展 FileIO
)定义代码,这意味着 class 可以公开访问,并且它的类型也是 exported/leaked 外部。 Scala 应该抛出编译错误,如果一些私有 class 逃脱了它的可见范围(所以在你的 SomeObject
的第二个版本中可能是这种情况)。
考虑这个例子:我经常在我的应用程序中使用类型安全的配置库。它有方便的方法,但我通常将 space 留作可能的分隔(或者更确切地说是我自己的扩展名):
package object config {
object Config {
private val conf: TypeSafeConfig = ConfigFactory.load()
def toTypeSafeConfig: TypeSafeConfig = conf
}
@inline implicit def confToTypeSafeConfig(conf: Config.type): TypeSafeConfig = conf.toTypeSafeConfig
}
隐式转换只允许我在 Config
上调用所有 TypeSafeConfig
方法,而且它有很多方便的方法。从理论上讲,将来我可以删除我在 Config
对象中使用的隐式方法和实现方法。但是我很难想象为什么我会花时间在这上面。这是泄漏实施的一些示例,我认为没有问题。