gpt4 book ai didi

scala - 如何从 Scala 公共(public) API 中屏蔽实现级别的类、特征和对象?

转载 作者:行者123 更新时间:2023-12-01 02:06:11 25 4
gpt4 key购买 nike

我想减少泄漏到我的 Scala 公共(public) API 中的实现级别细节,并且有太多可用于调整可见性的旋钮,以至于我的头在试图弄清楚:

What is the best way to shield implementation level classes, traits and objects from Scala public APIs ?



我能想到的最好的事情就是这样做:
package restaurant {
trait Service {
acceptOrder(dish: String, quantity: Int)
}

package impl {
private class ServiceImpl { // mark this & everything else in package as private
acceptOrder(dish: String, quantity: Int) = println("order accepted")
}

private class ServiceHelper { // mark this & everything else in package as private
def helpDoStuff() = ???
}
}
}

但请注意,我必须将 impl 包中的所有内容都标记为“private”,
随着包裹中元素数量的增加,这变得非常乏味(并且容易忘记)。如果 Scala 可以选择将 > 包 < 声明为私有(private),或者至少将包中所有事物的默认可见性设置为该包的私有(private),那就太好了。但这似乎并不存在。

我确信有这样做的最佳实践模式......如果您知道,请告诉我。

更新:我确实在 Programming Scala 中阅读了有关包对象的信息。书。这似乎是一种将所有内容集中在公共(public) API 中的好方法。但是包对象似乎并没有提供一种方便的方法来隐藏不在包对象中的所有对象的可见性。

IDEA 用户的旁注:
我的嵌套方法的一个问题是它似乎弄乱了 IDEA 中的自动缩进。对我来说,另一个问题是找到解决方法。我向 Intellij 提交了一个错误(如果你们中的任何人遇到此问题并想对其进行投票: https://youtrack.jetbrains.com/issue/IDEA-144872)

最佳答案

好问题!

使用私有(private)对象怎么样?当然,这只有在你可以的情况下才有效
在单个文件中实现您的服务。否则我认为 impl 命名空间方法是你能做的最好的。

package restaurant

sealed trait Service {
def acceptOrder(dish: String, quantity: Int): Unit
}

object Service {
def create: Service = new Impl.ServiceImpl()

private object Impl {
class ServiceImpl extends Service {
def acceptOrder(dish: String, quantity: Int) = println("order accepted")
}

class ServiceHelper {
def helpDoStuff() = ???
}
}
}

关于scala - 如何从 Scala 公共(public) API 中屏蔽实现级别的类、特征和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32451043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com