多くのオプションがあるため、最近、Scala コードを整理する方法に混乱しています。
コードを整理するためにパッケージ、オブジェクト、パッケージ オブジェクトを使用する方法/時期に関する Scala のガイドラインはありますか?
まず、各モジュール化戦略の機能と制限を理解する必要があります。
これらは Java と同じように機能します。多くのファイルを使用して 1 つのパッケージのさまざまな部分を宣言でき、多くのレベルを深くネストできます。これにより、レイアウトの柔軟性が最大になります。ただし、デフォルトのクラスローダーはパッケージ内のクラスとインターフェースのみを見つけることを想定しているため、Scala がそこに置くことができるのはそれだけです。(クラス、特性、およびオブジェクト。)
オブジェクトには、メソッド、フィールド、その他のオブジェクト、クラス、特性など、何でも含めることができます。サブクラス、特性、およびオブジェクトは、実際には、含まれているオブジェクトを名前マングル接頭辞として持つ独自の別個のエンティティです (JVM に関する限り)。 )。オブジェクトは 1 つのファイル内に完全に含まれている必要があります。サブクラスを任意の深さにネストすることはできますが、それは、クラスローダーのパスに追加するのではなく、ますます長くなる名前をマングリングすることによって行われます。
オブジェクトとパッケージしかない場合の問題は、ネストされた構造が必要になる場合があることです。
scala.xml
scala.xml.include
scala.xml.include.sax
そのため、パッケージを使用する必要があります (1 つの巨大なファイルと不穏なほど長いクラス名を避けるため)。しかし、あなたも望むかもしれません
import scala.xml._
オブジェクトを使用する必要があるように、さまざまな定数と暗黙的な変換を利用できるようにします。 パッケージ オブジェクトが役に立ちます。それらは本質的に通常のオブジェクトと同じですが、あなたが言うとき
import scala.xml._
scala.xml._
パッケージ内のすべて ( ) と、対応するパッケージ オブジェクト内のすべて( )の両方を取得しますscala.xml.package
。
各部分がどのように機能するかがわかったので、整理する方法についてはかなり明白なルールがあります。
object
するだけです。package object
パッケージとオブジェクトの他に、コードの構造化に役立つ「暗黙」があります。使用 (誤用を避けるため) に関する適切なガイドラインは、 http ://suereth.blogspot.com/2011/02/slides-for-todays-nescala-talk.html にあります
コードを構造化するための型クラスもお勧めします。ここで、このトピックに関する素晴らしい記事を書いてください: http://debasishg.blogspot.com/2010/07/refactoring-into-scala-type-classes.html
私はできる限りパッケージを使用します。つまり、「モジュール」がクラス/特性/オブジェクト定義だけで構成されている場合です。パッケージには、変な構文を使わずに Java から直接アクセスできるという利点があります。
それ以外の場合は、ほとんどプレーン オブジェクトを使用します。
プロジェクト パッケージのルートに、プロジェクトごとに 1 つのパッケージ オブジェクトがある場合があります。そのパッケージ オブジェクトには、必要なすべての暗黙的要素と最も重要なクラスとオブジェクトが格納されます。すべてのプロジェクトを 1 行でインポートできます。
名前空間とコードを別々のファイルに分割することにのみ関心がある場合(OPのように聞こえるため)、@Rexの回答を参照してください。
互換性や標準 ML スタイルのファンクターなど、モジュール システムにさらに期待する場合は、こちらで説明されているアプローチを使用できます。
基本的に、モジュール インターフェイス (別名 SML のシグネチャ) は Scala のトレイトになります。モジュール (別名構造体) は Scala のオブジェクトです。ファンクターは、結果のモジュールに互換性のある型を持たせるかどうかに応じて、クラス、抽象クラス、または抽象フィールドまたはコンストラクター引数に変換されたファンクター引数を備えた実装を持つトレイトのいずれかに変換できます。