What is it, naokirin?

mutableな参照渡しについて

mutableな参照渡しというものが、たまに出てくる。

あれがどうにも苦手で、コードの理解が約1/4に落ちているような感覚になる。 私自身はあまり記憶の才はないので、こっちの関数でこの変数はこう変更されて、次の関数に渡されて…と考えてるとわけが分からなくなることが多いからかもしれない。

できれば、mutableかつ参照渡し、というものを控えてコードを書くように (むしろ、どうしても必要じゃなければ書かないのだけど) している。

あと、誰がどこまでの変更に関与しているかが非常にわかりにくくなりやすいのも苦手 (というよりこちらはむしろ嫌い) だったりする。

例としてあげると、以下みたいな状況と同じなのかなと思った。


今日の晩御飯のための食材を買っている。
買い物カゴにはいろんな食材が入っている。

ひと通り店内を回って、レジで会計をする。
カゴを店員に渡す。

ここで一緒に財布を渡す。
きっと値段がわかったら財布から、店員が何も言わずに代金を抜いて、レシートを入れて商品と一緒に返してくれることだろう。


参照渡しは、呼び出し元の情報を、呼び出された側に完全に任せてしまう方針で、呼び出される側は非常に大きな範囲に責任をもつ必要が出てしまう。

はっきり言ってしまうと、私がもし店員なら、財布ごと受け取るような不必要に重大な責任は負いたくないし、客側ならいくら抜かれるかわからない状況で財布を渡したくはない (下手をすれば財布を全部燃やされてしまうかもしれないしねw)。

参照渡し自体はすべて悪ではないし、たとえばswapをする関数などは、mutableな参照渡しをされる方が都合もいいし、仕事を全うできる。

でも不要なら、なるべくimmutableな参照渡しか値渡しで、呼び出し元の変更は呼び出し元に任せるために、結果は戻り値で返すようにする、が正解だと思っている。