問題タブ [immutability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 複雑な初期化を使用して不変オブジェクトを設計する方法
私はDDDについて学んでいて、「値オブジェクト」は不変でなければならないというステートメントに出くわしました。これは、オブジェクトの作成後にオブジェクトの状態が変更されないことを意味することを理解しています。これは私にとっては新しい考え方ですが、多くの場合、それは理にかなっています。
さて、不変の値オブジェクトの作成を開始します。
- 状態全体をコンストラクターへのパラメーターとして受け取るようにします。
- プロパティセッターは追加しませんが、
- また、コンテンツを変更するメソッドが許可されていないことを確認してください(新しいインスタンスのみを返します)。
しかし、ここで、8つの異なる数値を含むこの値オブジェクトを作成したいと思います。8つの数値パラメーターを持つコンストラクターを作成すると、使い勝手が悪くなると思います。つまり、数値を渡すときに間違いを犯しやすくなります。これは良いデザインにはなり得ません。
したがって、質問は次のとおりです。不変オブジェクトを改善する他の方法はありますか。コンストラクターの長いパラメーターリストを克服するためにC#で実行できる魔法はありますか?私はあなたの考えを聞くことに非常に興味があります。
更新:誰かがそれについて言及する前に、1つのアイデアがここで議論されました: C#の不変オブジェクトパターン-あなたはどう思いますか?
ただし、他の提案やコメントを聞くことに興味があります。
language-agnostic - 関数型プログラミング: 不変性など
最近、関数型プログラミングについて質問したところ、 (良い!) 回答が返ってきて、さらに多くの質問が寄せられました (学習の場合もそうであるように思われます)。以下にいくつかの例を示します。
1 つの回答は、不変データ構造の利点に言及しています。各スレッドは独自のコピーを持つことができます。私には、これはどちらかというとバージョン管理システムのように思えますが (類推すると)、誰かがチェックアウトしたコードをロックして他の人が変更できないようにするのではなく、誰もが自分のコピーをチェックアウトできます。いいですね。ただし、VCS では、2 人が同じものを変更した場合に備えて、変更を「マージ」するという概念があります。この問題は確かにマルチスレッドのシナリオで発生する可能性があるようです...では、スレッドが最新のデータを見ることが重要な場合、「マージ」はどのように行われるのでしょうか?
この回答では、オブジェクトのループで操作が実行されている場合と、古いオブジェクトを更新する代わりに毎回新しいオブジェクトを使用する方法について説明しました。ただし、
bankAccount
たとえば、GUI バンキング システムなど、非ループ シナリオで が更新されているとします。オペレーターが [金利の変更] ボタンをクリックすると、(C# などで) のようなイベントが発生しますbankAccount.InterestRate = newRateFromUser
。私はここで密集しているように感じますが、うまくいけば私の例は理にかなっています: オブジェクトが更新される何らかの方法が必要ですよね? 他にもいくつかのことが新しいデータに依存する場合があります。
とにかく、パラダイム シフトについて頭を悩ませるのを手伝ってくれたら、ありがたいです。コーディングへの単純な手続き型の命令型アプローチの背景を理解した後、OOP を学習するときに、私の脳が同様の「愚かな段階」を経験したことを覚えています。
.net - 文字列の不変性
文字列の不変性はステートメントごと、またはステートメント内の文字列ごとに機能しますか?
たとえば、次のコードはヒープに 2 つの文字列を割り当てることを理解しています。
「hello」は、ガベージが収集されるまでヒープに残ります。s は "hello world!" を参照するようになりました。ヒープ上。しかし、次の行はヒープ上にいくつの文字列を割り当てますか?1 または 2? また、結果を検証するためのツール/方法はありますか?
c# - C# で読み取り専用 (不変) オブジェクト インターフェイスを実装する
私の目標は、ほとんどのシナリオでオブジェクトが完全なインターフェイスのサブセットである「読み取り専用インターフェイス」を介して使用されるようにすることです。
const
たとえば、C++ を使用している場合は、オブジェクトを返すだけです。- C# では、インターフェイスでこれを実現できれば、読み取り専用のインターフェイスを実装して、どこでも使用できます。ただし、インターフェイスでは許可されていない演算子のオーバーロードが必要です。そのため、抽象基本クラスを使用する必要があります。
- しかし、抽象基本クラスを定義すると、派生型のアクセシビリティを変更することはできません。
では、C# で目標を達成するにはどうすればよいでしょうか。
java - Javaで同等のc++定数ポインタを取得するには?
不変型オブジェクト (String、Integer、..) を final としてメソッドに渡すと、C++ 定数ポインターの文字を実現できます。しかし、変更可能なオブジェクトでそのような動作を強制するにはどうすればよいでしょうか?
私が望むのは、someType を変更せずに someMethod が someObject の状態を変更できないようにすることだけです。これは可能ですか?
ruby - Ruby - 不変オブジェクト
いくつかのインスタンス変数を共有する、Ruby で記述された高度にマルチスレッド化されたアプリがあります。これらの変数への書き込みはまれ (1%) ですが、読み取りは非常に一般的 (99%) です。これらのスレッドが常に最新の値を参照できるようにする最善の方法 (あなたの意見または慣用的な Ruby の方法) は何ですか? これまでに私が持っていたいくつかのアイデアを次に示します (ただし、これをオーバーホールする前に、あなたの意見をお聞かせください)。
- これらの変数の読み取りまたは書き込みの前に最もよく使用されるロックを用意します ( Java Concurrency in Practiceから)。これの欠点は
synchronize
、コードに多くのブロックが配置され、それを回避する簡単な方法が見当たらないことです。 - Ruby の
freeze
方法 (こちらを参照) を使用しますが、これも同様に面倒に見え、最初のオプションが提供する同期の利点はまったく得られません。
これらのオプションはどちらも非常に似ているように見えますが、うまくいけば、そこにいる誰かがより良いアイデアを持っているでしょう (または、これらのアイデアのいずれかについてうまく議論できるでしょう)。また、操作の途中でオブジェクトが破損したり変更されたりしないように、オブジェクトを不変にしても問題ありませんが、自分で呼び出しを行うのに十分なほどRubyを知りません。この質問は、オブジェクトが非常に可変です。
c# - 可変構造体が「悪」なのはなぜですか?
SOに関するここでの議論に続いて、可変構造体は「悪」であるという発言をすでに数回読みました(この質問への回答のように)。
C#の可変性と構造体の実際の問題は何ですか?
c# - C# が読み取り専用のローカル変数を許可しないのはなぜですか?
これについて同僚と友好的な議論をしています。私たちはこれについていくつかの考えを持っていますが、SOの群衆はこれについてどう思っているのでしょうか?
ruby - Rubyオブジェクトが不変かどうかをテストする方法は?
オブジェクトが不変 (数値、nil) かそうでない (配列、ハッシュ、オブジェクト) かをテストする簡単な方法はありますか? つまり、他のコードからの副作用によって変更される可能性はありますか?
動機: バージョン管理された値ストアを作成したいのですが、一部のデータは配列です。一部の配列にはカスタム オブジェクトが格納されますが、「in」プロパティを格納して検索することで関係を逆転させることができます。しかし、シンボルの配列や他の配列なども保存できるようにしたいと思います.
functional-programming - (関数型言語で) 状態を変更しないアプリを作成するにはどうすればよいですか?
いつか関数型プログラミングを学びたいと思っていますが、単純な数学以外にどのように使用できるかわかりません。
例: 単純な Web ブラウザのブックマーク機能の追加では、ユーザーが次にブックマークをクリックしたときに新しいブックマークがリストに表示されるように、何らかの変更を加える必要があります。