1

私は、並行プログラミングにおける Java に対する Scala の利点を比較してきました。

明らかに私が最初に気づいた点は、Scala は関数型プログラミング言語であり (部分的に) FP を使用すると、副作用が自然に回避されるということです。

命令型言語と比較して、関数型プログラミングで副作用がどのように回避され、マルチスレッド/並行プログラミングでどのように機能するか?

4

1 に答える 1

5

このステートメントが意味することは、関数型オブジェクト指向ハイブリッド言語としての Scala は、副作用のない関数型構造と規則の使用を奨励する(場合によっては可能にする) ということです。副作用のある機能しないステートフルな Scala コードを十分に書くことができます;-) 一方、機能的な Java (たとえば) を書こうとすることはできますが、関数は最初のクラスのオブジェクトではないため、見苦しく見えるかもしれません。だから私はそれが自然にそうするとは言いませんが、いくつかの方法であなたを助け、全体的にそうするように促します.

関数型プログラミングを行う際に従うべき原則がいくつかあります。これにより、結果として副作用がなくなります。

  • 不変は良いことです-一度作成されて変更できない構造を好みます。たとえば、Java リストでは n 番目の要素を変更できますが、Scala ではそのリストのコピーを新しい要素とともに返します。はい、これはプログラム内のオブジェクトが増えることを意味するかもしれませんが、より再利用可能で安全なコードになるはずです。
  • 値をパラメーターとして渡し、メンバー変数に状態を保存しないでください- 共有状態は多くの問題の原因であり、共有状態の管理には問題があります (たとえば、ロックを使用する必要があるなど)。
  • 値をキャッシュするのではなく、安価であれば再計算することを好みます (これにはルールの例外がいくつかあります。たとえば、 http://en.wikipedia.org/wiki/メモ化はかなり頻繁に使用される手法です!)

実際、上記のルールに従うことで副作用を回避することの最大のメリットの 1 つは、並行プログラミングが容易になることです。並行プログラミングにおける最大のハードルは、結局のところ、共有状態の管理です!

ルールの 1 つは、変更可能で共有された状態が悪いということなので、使用しないでください。代わりに、多くの関数型言語 (Erlang や Scala など) は、アクター (スレッドと比較できます) が互いにメッセージを送信することによってのみ通信する、いわゆるアクター モデルを好みます (値をどこかに保存する代わりに渡すことを参照してください!)。

于 2013-10-14T06:37:41.390 に答える