私は比較的新しい Scala ユーザーで、自分のコードの現在の設計について意見を求めたいと思っていました。
すべて固定長 Vector[Byte] (最終的にはバイト文字列を必要とする学習アルゴリズムで使用されます) として表されるクラスがいくつかあります。たとえば、A、B、および C です。これらのクラスを A と呼びたいと思います。 、B および C は、読みやすくするためにパッケージ内の他の場所に配置されています。これらのメソッドのために、Vector にクラス メソッドを追加する必要はありません。したがって、extend-my-library パターンはここでは役に立たないと思います。ただし、毎回ラッパー オブジェクトに「ドリル」する必要なく、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(...)
型エイリアスのコンパニオン オブジェクトを記述することに対して特に警告するものは見つかりませんが、型エイリアスの使用方法に反しているようです。また、これらの 3 つのクラスはすべて、理想的には分離する必要がある場合でも、同じファイルで定義されることを意味します。
- このアプローチに隠れた問題はありますか?
- この問題に対するより良い設計はありますか?
ありがとう。