5

私はscalaでプログラミングすることを学んでいます。オブジェクト指向プログラミングと同様に、関数型プログラミングの経験があります。私の質問はシンプルですが、トリッキーです:

Scala ではどの構造を使用する必要がありますか? 不変のみに固執する必要があります。それを反復してリストを変更し、新しいリストを一緒に貼り付けますか、それとも変更可能にしますか? それについてのあなたの意見は何ですか、パフォーマンスの側面、メモリ関連の側面は何ですか...

私は関数型のスタイルでプログラミングする傾向がありますが、ミュータブルを使用して簡単に実行できることを行うには、非常に多くの労力が必要になることがよくあります。状況に応じて、何を使用しますか?

4

3 に答える 3

4

可変状態よりも不変状態を優先します。絶対に必要な場合にのみ、可変状態を使用してください。いくつかの注目すべき理由は次のとおりです。

  • パフォーマンス。標準ライブラリは、慣用的なScalaではありませんが、varsとwhileループを幅広く使用しています。ただし、これをエミュレートしないでください。ただし、コードをより必須に変更するとパフォーマンスが大幅に向上することを確認するためにプロファイルを作成した場合を除きます。

  • I/O。I / O、つまり外界との相互作用は本質的に状態に依存するため、変更可能な方法で処理する必要があります。

これは、命令型または機能型のすべての主要言語で見られる推奨コーディングスタイルと同じです。たとえば、Javaでは、private finalフィールドのみを持つデータオブジェクトを使用することが望ましいです。不変の(そして機能的な)方法で書かれたコードは、本質的に理解しやすいものです。なぜなら、を見るとval、それが決して変わらないことを知っており、特定のオブジェクトや関数が存在する可能性のある状態の数を減らすからです。

多くの場合、自動並列実行も可能です。たとえば、Scalaのコレクションクラスにはすべて関数があり、この関数は、または並列parの関数の呼び出しを自動的に実行する並列コレクションを返します。mapreduce

于 2013-01-10T18:12:42.887 に答える
3

私は通常、次の規則に従います。

  • 静的可変変数を使用しない

  • コピーに非常にコストがかかる場合を除き、すべてのユーザー定義のデータ型 (通常はケース クラス) を不変に保ちます。これにより、多くのアプリケーション ロジックが簡素化されます。

  • データ構造/コレクションが本質的に可変である (つまり、時間とともに変化するように設計されている) 場合、可変データ構造/コレクションを使用することが適切な場合があります。例として、プレイヤーが移動すると更新される大規模なゲーム ワールドが考えられます。ただし、スレッド間でこれらのデータ構造を (ほとんど) 決して共有しないことを忘れないでください。

  • メソッドで変更可能なローカル変数を使用しても問題ありません

  • 関数の結果には不変のコレクションを使用します。これらは、使用されるコンテキストで最高のパフォーマンスを発揮するものに応じて、厳密にまたは遅延的に評価できます。ただし、可変コレクションに依存する遅延評価結果を使用する場合は注意してください。

于 2013-01-10T15:08:32.867 に答える
3

(これは重複しているに違いないと思いましたが、以前の同様のものを簡単に見つけることができなかったので、あえて答えます...)

この質問に対する一般的な答えはありません。Scala の作成者によって提案された経験則は、不変の val と構造体から始めて、それが理にかなっている限りそれに固執することです。ほとんどの場合、この方法で問題に対する実行可能なソリューションを作成できます。しかし、そうでない場合は、もちろん実用的であり、可変性を使用してください。

解決策ができたら、微調整、テスト、パフォーマンスの測定などを行うことができますたとえば、遅すぎる、または過度に複雑であることに気付き、重要な部分を特定し、問題の原因を理解し、必要に応じて可変変数を使用して再実装し、理想的にはプログラムの残りの部分から分離したままにします。ただし、多くの場合、イミュータブル レルム内からもより良い解決策を見つけることができるので、まずそこを探してみてください。特に私のような初心者にとって、私が思いついた最善の解決策が歪んで複雑に見え、それを改善する明白な方法がないということは今でも定期的に起こります.数行のコードで同じ問題に対するシンプルでエレガントな解決策を見るまでは.言語とそのライブラリの力をより多く制御する経験豊富な Scala 開発者によって作成されました。

于 2013-01-10T11:06:22.710 に答える