メンバー変数は「共用変数」ではない

メンバー変数をメソッド間の値の受け渡しに使用しているケースを見かけますが、あまり良くないやり方です。

おそらく、メンバー変数のことを、「クラス内のどのメソッドからでも参照できる変数」と解釈しているのだと思います。
しかし、それは結果としてそのような使い方もできるだけであって、本来の用途とは異なります。

 

メンバー変数を値の受け渡しに使用するのが良くない理由は2つあります。

 

1つ目は、メモリの消費量を増加させてしまうという理由です。

ローカル変数と違って、メンバー変数はメソッドの処理が終わってもそのインスタンス本体が消えるまでは値を保持し続けます。
値を保持し続けるということは、その分メモリを消費し続けるということなので、本来メンバー変数に持たなくてもいい情報を持つことによって、無駄にメモリ消費量が増えてしまいます。

 

2つ目は、どこの処理で何を保持しているのか分かりにくいという理由です。

同じメンバー変数に対して複数のメソッドで値の設定を行っている場合、どの段階で何が保持されているのが正解なのか分かりにくいため、デバッグの際に正しい動きをしているのかどうか判別するのに時間がかかってしまいます。

もしどうしても値の受け渡しにメンバー変数を使わざるを得ない場合は、ネーミングや処理ロジックを工夫して、「どこで設定された何が入ってるか」が後から見ても瞬時に分かるようにしておくべきです。

 

そもそも、メンバー変数というのは「クラスの属性」です。
属性とは、そのクラスに直接紐付く、当然持っていなければいけない、かつ、滅多に変わることのない情報です。

例えば「猫クラス」だと、猫の種類や毛の色が属性になります。
一方、今食べている餌の種類とか、寝ている場所とかは属性ではありません。

 

プログラムでの具体例を挙げますと、「会員登録クラス」の場合、会員の氏名や登録時に発行されたIDなどは属性なので、メンバー変数に保持するのは何の問題もありません。

一方、入力値チェックエラー情報や登録処理失敗フラグなどは、「会員登録」に直接紐付く属性ではなく、あくまでも処理の過程で発生した情報に過ぎないのでローカル変数でやり取りすべきです。

※もし「入力値チェッククラス」であれば、入力チェックエラー情報は属性になります

 

もし、「1つのメソッドで複数の戻り値を返したいけど返せないから」という理由でメンバー変数を使っているのなら、それはメソッドの切り分け方を見直すべきです。
「メソッドを呼ぶ」→「要求された値を返す」という繰り返しを綺麗に作ることができれば、1つのメソッドで複数の戻り値を返す必要性は出てこなくなるはずです。

 

今までメンバー変数で値の受け渡しをしていた方は、それをやめるだけでプログラムの可読性が飛躍的に向上すると思います。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です