4
class A {
  def algorithmImplementation (...) = { ... }
}

object A {
  def algorithmImplementation (...) = { ... }
}

をどのような状況classで使用する必要があり、どのような場合に使用する必要がありobjectますか (上記のダイクストラ アルゴリズムなどのアルゴリズムを実装する場合)。

そのような決定を下す際に考慮すべき基準はどれですか?

現時点では、a を使用することの利点がよくわかりませんclass

4

2 に答える 2

6

実装が1つしかない場合、これは主に判断の呼びかけになる可能性があります。グラフ上で実行されるダイクストラのアルゴリズムについておっしゃいました。これで、そのアルゴリズムを記述して、グラフオブジェクトを明示的なパラメーターとして受け取ることができます。その場合、アルゴリズムはおそらくGraphシングルトンオブジェクトに表示されます。次に、Graph.shortestPath(myGraph、fromNode、toNode)のようなものとして呼び出される場合があります。

または、Graphクラスでアルゴリズムを記述できます。その場合、グラフは明示的なパラメーターとして使用されなくなります。これで、myGraph.shortestPath(fromNode、toNode)のようなものとして呼び出されます。

後者の場合は、1つの主要な引数(グラフなど)がある場合、特にアルゴリズムの一種のコンテキストとして機能する場合に、おそらくより理にかなっています。しかし、それはあなたが好む構文に帰着するかもしれません。

ただし、複数の実装がある場合、特にどの実装の選択が表現の選択に依存する場合は、バランスがクラスアプローチに向かってより大きくなります。たとえば、shortestPathの2つの異なる実装があるとします。1つは隣接行列でより適切に機能し、もう1つは隣接リストでより適切に機能します。クラスアプローチを使用すると、2つの異なる表現に対して2つの異なるグラフクラスを簡単に作成でき、それぞれにshortestPathの独自の実装を設定できます。次に、myGraph.shortestPath(fromNode、toNode)を呼び出すと、myGraphが隣接行列を使用するか隣接リストを使用するかがわからない場合でも、適切な実装が自動的に取得されます。(これは、OOの要点の一種です。)

于 2012-06-26T13:40:45.320 に答える
5

クラスは実装をオーバーライドするサブクラスを持つことができますが、オブジェクトはサブクラス化できません。クラスは、オブジェクトができないパラメトリック型にすることもできます。

オブジェクトのインスタンスは常に 1 つだけ、またはコンテナーごとに少なくとも 1 つのインスタンスがあります。クラスには複数のインスタンスがあります。これは、クラスを値でパラメータ化できることを意味します

class A(param1 : int, param2 : int) {
    def algorithmImplementation(arg : List[String]) = // use arg and params
}

そして、それは次のように再利用できます

val A42_13 = new A(42, 13)
val result1 = A42_13.algorithmImplementation(List("hello", "world"))
val result2 = A42_13.algorithmImplementation(List("goodbye", "cruel", "world"))

Djikstra のアルゴリズムの例に関連してこのすべてを理解するために、複数のノード タイプで再利用可能なアルゴリズムの 1 つの実装を記述したいとします。次に、ノード タイプ、距離の測定に使用されるメトリックのタイプ、および距離の計算に使用される関数によってパラメータ化することができます。

val Djikstra[Node, Metric <: Comparable[Metric]](distance : (Node, Node) => Metric) {
    def compute(node : Node, nodes : Seq[Node]) : Seq[Metric] = {...}
}

プログラムで使用するノード/メトリック/距離関数の異なるタイプごとに Djikstra のインスタンスを 1 つ作成し、そのインスタンスを再利用します。Djikstra を計算するたびにすべての情報を渡す必要はありません。

要約すると、クラスはより柔軟です。柔軟性が必要な場合に使用してください。それ以外のオブジェクトは問題ありません。

于 2012-06-26T13:48:37.810 に答える