14

多くのオプションがあるため、最近、Scala コードを整理する方法に混乱しています。

コードを整理するためにパッケージ、オブジェクト、パッケージ オブジェクトを使用する方法/時期に関する Scala のガイドラインはありますか?

4

4 に答える 4

9

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
于 2011-07-27T03:19:20.070 に答える
2

パッケージとオブジェクトの他に、コードの構造化に役立つ「暗黙」があります。使用 (誤用を避けるため) に関する適切なガイドラインは、 http ://suereth.blogspot.com/2011/02/slides-for-todays-nescala-talk.html にあります

コードを構造化するための型クラスもお勧めします。ここで、このトピックに関する素晴らしい記事を書いてください: http://debasishg.blogspot.com/2010/07/refactoring-into-scala-type-classes.html

于 2011-07-27T08:44:52.107 に答える
1

私はできる限りパッケージを使用します。つまり、「モジュール」がクラス/特性/オブジェクト定義だけで構成されている場合です。パッケージには、変な構文を使わずに Java から直接アクセスできるという利点があります。

それ以外の場合は、ほとんどプレーン オブジェクトを使用します。

プロジェクト パッケージのルートに、プロジェクトごとに 1 つのパッケージ オブジェクトがある場合があります。そのパッケージ オブジェクトには、必要なすべての暗黙的要素と最も重要なクラスとオブジェクトが格納されます。すべてのプロジェクトを 1 行でインポートできます。

于 2011-07-26T14:52:42.023 に答える
0

名前空間とコードを別々のファイルに分割することにのみ関心がある場合(OPのように聞こえるため)、@Rexの回答を参照してください。

互換性や標準 ML スタイルのファンクターなど、モジュール システムにさらに期待する場合は、こちらで説明されているアプローチを使用できます。

基本的に、モジュール インターフェイス (別名 SML のシグネチャ) は Scala のトレイトになります。モジュール (別名構造体) は Scala のオブジェクトです。ファンクターは、結果のモジュールに互換性のある型を持たせるかどうかに応じて、クラス、抽象クラス、または抽象フィールドまたはコンストラクター引数に変換されたファンクター引数を備えた実装を持つトレイトのいずれかに変換できます。

于 2014-06-24T02:53:39.990 に答える