3

我是一个相对较新的 Scala 用户,我想对我的代码的当前设计发表意见。

我有几个类都表示为固定长度的 Vector[Byte](最终它们用于需要字节字符串的学习算法),比如 A、B 和 C。我希望这些类被称为 A , B 和 C 为了便于阅读,我不需要在 Vector 中为这些方法添加任何额外的类方法。因此,我认为扩展我的库模式在这里没有用。但是,我想包含 Vector 附带的所有有用的函数方法,而不必每次都“钻取”到包装器对象中。由于效率在这里很重要,我也不希望增加包装纸的重量。

因此我决定在包对象中定义类型别名:

package object abc {
    type A: Vector[Byte]
    type B: Vector[Byte]
    type C: Vector[Byte]
}

但是,每个都有自己的固定长度,我想包括工厂方法来创建它们。似乎这就是伴随对象的用途。这是我最终设计的样子:

package object abc {
    type A: Vector[Byte]
    object A {
        val LENGTH: Int = ...
        def apply(...): A = {
            Vector.tabulate...
        }
    }
    ...
}

一切都可以编译,它允许我做这样的事情:

val a: A = A(...)
a map {...} mkString(...)

我找不到任何特别警告不要为类型别名编写伴随对象的东西,但它似乎与应该如何使用类型别名背道而驰。这也意味着所有这三个类都定义在同一个文件中,理想情况下它们应该分开。

  1. 这种方法有什么隐藏的问题吗?
  2. 这个问题有更好的设计吗?

谢谢。

4

1 回答 1

4

我想这完全没问题,因为您并没有真正实现伴随对象。

如果是这样,您将可以immutable.Vector从内部访问私有字段object A(例如private var dirty),而您没有这些字段。

因此,虽然它有点像是A一个伴生对象,但实际上不是。

如果可以通过使用类型别名为任何类型创建伴随对象,那么成员可见性约束将变得毫无意义(可能除外private|protected[this])。

此外,像类型别名一样命名对象可以阐明对象的上下文和目的,这在我的书中是一个优点。

据我所知,将它们全部放在一个文件中在 scala 中很常见(例如,在使用类型类模式时)。

因此:没有陷阱,我知道。而且,恕我直言,不需要不同的方法。

于 2015-08-29T14:51:40.833 回答