2

質問は自明ですが、例を挙げさせてください:

私は次のものを持っています:

class Foo {
    def doAndPrint {
        val result = doSomething()
        val msg = message(result)
        println(msg)
    }

    private def message(result: Result): String = {
        "message formatted with %s".format(result)
    }
}

このコンテキストでは、質問は次のとおりです。に住む必要がありますか?def message(result: Result)object Foo

賛成の議論は、def message(result: Result)内のどの状態にも依存しないことを明示することclass Fooです。反対意見は、コンパニオン オブジェクトの動機は、Java public static メソッドを配置する場所を提供することだったというものです。

4

2 に答える 2

4

この誤った二分法に対する答えは、どちらでもありません。へのローカル メソッドである必要がありますdoAndPrint

class Foo {
  def doAndPrint {
    val result = doSomething()
    def message(result: Result): String = s"message formatted with $result"
    val msg = message(result)
    println(msg)
  }
}

実際には、

class Foo {
  def doAndPrint {
    val result = doSomething()
    def message = s"message formatted with $result"
    println(message)
  }
}

実際には地域の状態に依存することに注意してください。

編集:OK、「自明」のうなずきとして、意味のある最小のスコープを使用し、例は仲間間の私的関係の非対称性を指摘します。これは、私が提供する時間がない多くの駄洒落を懇願します.

私の観察から、より直接的に答えると、コンパニオンモジュールは通常、FooUtilスタイル関数のリポジトリとして機能しませんが、暗黙の変換のリポジトリとして機能しますが、公開されているとは言え、ほぼ間違いなく同様のフレーバーを持っています。コレクション型のオブジェクトで何が起こるかを考えてみましょう。

関心の分離を検討してください。

class Foo(f: String => Unit) {
  def doSomethingAndDoSomethingWithIt {
    val result = doSomething()
    def message = s"message formatted with $result"
    f(message)
  }
}
于 2014-03-11T00:17:51.483 に答える
1

メソッドは、それらが属する場所に配置する必要があります。テスト目的、読みやすさ、さらには保守性のために物事を分割する必要がある場合は、それらを分割する必要があります。Scala は FP の概念、FP パターン、および FP の考え方の影響を受けていますが、依然として OO 言語でもあります。

プライベート ヘルパー メソッドは、コードを簡単に操作できるようにするためのヘルパー メソッドです。クラスでそれらが必要な場合、そのロジックを別のクラスに分散させる理由はありません...ただの理由です。それらを同じ場所に置きます (そして、パッケージの可視性などの単体テストの目的でこれらのメソッドにアクセスする手段を追加します)。

于 2014-03-11T00:37:15.457 に答える