第80回 ソースコードリーディングのコツ 関数突入編
さて、今回は、
関数に引数が渡るときの話を書きます。
変数を追うか追わないかそれが問題だ
use strict; my $c = 1; hoge($c);
こういうソースを見たとき、
$cの値がかわってたら大変だなぁ と思って
hoge関数の中を読む事はまずない。
なぜかというと、
関数へは値のコピーしか渡らない「値渡し」だからである。
それに対して、
つぎのようになっていると「参照渡し(Perl的にはリファレンス渡し)」なので、
$cの内容がhoge関数の中で書き換えられる可能性があるのでhoge関数の中を読まなければならないだろう。
use strict; my $c = 1; hoge(\$c);
ただ、値渡しの場合でも、hoge関数の中のロジックを理解しておかないと
それ以降の部分を読むに苦労しそうならばhoge関数の中まで目を通しておかないといけないだろう。
目も当てられない状況
関数にハッシュのリファレンスが渡っているときは、
泣きそうになりながらそのソースを読むか、平穏に読み切れるかは、そのソースを書いた人の手腕による。
use strict; my $c = {}; hoge($c);
このように、ハッシュへのリファレンスが渡った場合、これは「参照渡し」である。
さらに、ハッシュへはいつでもキーと値を追加可能なのである。
hoge関数の処理を抜けると、
{ 'n' => 1, 'm' => 3, 'z' => 20, 以下略 };
こんな感じでキーが20個も30個も作られていたら泣いてしまいそうになる。
しかもデータ構造として脈略があればまだ少しは納得がいくのだが、データ構造としてなんの脈力もなかった日にはもう...
さらに、if文の分岐で、キーが増える可能性がある処理と、増えない可能性がある処理だった日にはもう...