2017-02-04 1 views
0

私は徐々に型付けされた言語を個人的なプロジェクトとして設計しています。私は、不変性に関する特定の設計上の決定に固執しています。不変性:変数、値、またはAPIのプロパティ?

これは言語にとらわれない(おそらく粗い)やり方で言えば、私は可変であるか定数であるという2つのことがあります:可変バインディングと値そのものです。

可変バインディングはJavascriptの場合はconst、Javaの場合はfinalのように変数を再割当てできません。不変な値自体は、C++の場合はconst、Javascriptの場合はObject.freeze()です。

私が持っている質問は、不変の値(バインディングではない)の場合、不変性はどのような性質でなければならないのでしょうか?

値/オブジェクト自体はJavascriptのObject.freezeにありますか?

var point = {x: 10}; 
var frozenPoint = Object.freeze(point); 

またはC++のような型の一部ですか?

const Point p(10); 

またはRustのような可変結合として?

let p = Point { x: 10 }; 
// vs let mut p = Point { x: 10 }; 

またはライブラリのAPIの一部として使用しますか? FacebookのImmutable.js、GoogleのGuavaライブラリ(ImmutableListクラス)など

私は本当にこれには "正しい"答えがないことを理解しているので、私が本当に求めているのは、哲学と動機の比較ですこれらのアプローチのために。

答えて

1

正解がありますが、期待しているものと大きく異なります。

最高のものは、全く変更がないことです。換言すれば、言語は純粋に機能的でなければならない。ガベージコレクションの言語に変更可能性を持たせる理由はありません。ハスケルはこれの証です。

+0

私はこの見解を理解していますが、それが「正解」であることに同意できません。確かに、純粋な不変性は物事を行うための「最良の」方法であるという主観的意見です。私が想像しているターゲットオーディエンスは、おそらく可変性を制御する方法を好むだろうから、私はそのコントロールをエレガントに "正しく"提供する方法を探しています。 –

+0

現代の純粋に機能的な言語は、突然変異を持つ可能性を与え、非常にエレガントでバグのない方法でそれらを制御することもできます。これは、コア言語のセマンティクスよりも高いレベルで行われます。したがって、 "ハスケルは最高の命令的言語です"と言っています。 – libeako

+0

私は観客の推論を理解しますが、私はそれに同意しません。命令主義者に別の言葉を与えるのではなく、純粋に機能的なプログラミングに移行するよう奨励すべきである。 – libeako

関連する問題