私は徐々に型付けされた言語を個人的なプロジェクトとして設計しています。私は、不変性に関する特定の設計上の決定に固執しています。不変性:変数、値、または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
クラス)など
私は本当にこれには "正しい"答えがないことを理解しているので、私が本当に求めているのは、哲学と動機の比較ですこれらのアプローチのために。
私はこの見解を理解していますが、それが「正解」であることに同意できません。確かに、純粋な不変性は物事を行うための「最良の」方法であるという主観的意見です。私が想像しているターゲットオーディエンスは、おそらく可変性を制御する方法を好むだろうから、私はそのコントロールをエレガントに "正しく"提供する方法を探しています。 –
現代の純粋に機能的な言語は、突然変異を持つ可能性を与え、非常にエレガントでバグのない方法でそれらを制御することもできます。これは、コア言語のセマンティクスよりも高いレベルで行われます。したがって、 "ハスケルは最高の命令的言語です"と言っています。 – libeako
私は観客の推論を理解しますが、私はそれに同意しません。命令主義者に別の言葉を与えるのではなく、純粋に機能的なプログラミングに移行するよう奨励すべきである。 – libeako