2

エキスパートのScala開発者に電話します!書き込み可能なデータストアを表す大きなオブジェクトがあるとします。この一般的なJavaのようなアプローチに満足していますか?

val complexModel = new ComplexModel()
complexModel.modify()
complexModel.access(...)

またはあなたは好きですか:

val newComplexModel = complexModel.withADifference
newComplexModel.access(...)

それを好み、モデルにアクセスするクライアントがいる場合、クライアントは、complexModelではなくnewComplexModelを指すことをどのように知るのでしょうか。ユーザーの観点からは、変更可能なデータストアがあります。その視点をScalaの不変性の強調とどのように調和させますか?

これはどう:

var complexModel = new ComplexModel()
complexModel = complexModel.withADifference
complexModel.access(...)

これは最初のアプローチに少し似ていますが、withADifference内のコードは、既存のオブジェクトを変更するのではなく、まったく新しい複雑なデータオブジェクトを作成する必要があるため、modify()内のコードよりも多くの作業を行う必要があるようです。 。(不変性を維持するためにさらに多くの作業を行う必要があるというこの問題に遭遇しましたか?)また、これで、スコープが大きいvarができました。

最善の戦略をどのように決定しますか?選択する戦略に例外はありますか?

4

4 に答える 4

3

機能的な方法は、実際にStreamにデータ構造のさまざまなバージョンをすべて含め、コンシューマーがそのストリームから次の要素をプルしようとすることだと思います。

しかし、Scalaでは、データ構造全体が不変のままである一方で、1つの中心的な場所で変更可能な参照への絶対的に有効なアプローチであり、それを変更すると思います。

データ構造がより複雑になると、この質問に興味があるかもしれません。ネストされた構造を更新するためのよりクリーンな方法で、些細なことではない不変のデータ構造の新しい変更バージョンを実際に作成する方法を尋ねます(そして答えられます)。

于 2012-07-08T20:22:15.327 に答える
1

あなたの質問に対する標準的な答えは、ジッパーを使用することです。これについての1つのSO質問です。

私が知っているScalaの唯一の実装は、ScalaZにあります。

于 2012-07-08T21:41:58.290 に答える
1

メソッドの名前は、ミューテーターオブジェクトとしてmodify簡単に識別できるため、状態が変化することを意味します。ComplexModelこれは、この種のオブジェクトが関数型プログラミングとは関係がなく、疑わしい知識を持つ誰かがScalaのすべてを不変にする必要があると言ったからといって、それを不変にしようとすることは単に間違いであることを意味します。

これで、APIを変更して、これComplexModelが不変のデータで動作するようにすることができます。そうすべきだと思いますが、これComplexModelを不変に変換しようとしてはいけません。

于 2012-07-08T22:33:49.460 に答える
0

不変性は単なる有用なツールであり、教義ではありません。不変性のコストと不便さがその有用性を上回る状況が発生します。

aのサイズはComplexModel、変更されたコピーの作成がメモリやCPUの点で十分に高価であり、可変モデルがより実用的であるようにすることができます。

于 2012-07-08T20:26:58.173 に答える