バグを出しにくいソフトウェアを型で実現、みたいな話題が好きで、しょっちゅう型でなんとかできないか考えている。
そんな中、そもそもバグが出るのって、1つの変数を複数回「見る」ことによるものも多いのではないかと思った:
- 同じ変数が、離れた別々のスコープにまで引き回されて、別々の使い方をされているのは健全なのか?
- ある箇所でオブジェクトの
foo
プロパティを見て処理しているが、しばらくしてまたfoo
プロパティを見ているのは良いことなのか? - ↑こういうことをしていると、「思いもよらない場所に影響が出る」という類のバグになる
- これを防げないか、というのが主題
そこで、こういうことを発想してみた:
- オブジェクトのプロパティは、一度取り出すと、元のオブジェクトからは見えなくする
- つまり、
{foo: 1, bar: 2}
のfoo
をなんらかの形で使うと、そのスコープ以降foo
の使用ができなくなる
- つまり、
- これを型で強制する
んー、これってRustの所有権みたいな話題じゃん、と考えながら自分で思ったのだけれど、所有権と違って、書き込みのみならず読み込みすらも1度に制約しているというのが違う。
なんらかのプロパティを使う処理をそれぞれApplicativeとして表現して、お互いに見ているプロパティが重複していなければ合成可能、みたいなふうに規則を与えたらうまく動くかもしれない。