インスタンス変数・カプセル化・グローバル変数
インスタンス変数とカプセル化
- グローバル変数は便利だが多用するとモジュール間の密結合化によりバグの温床となり、またスコープが広すぎるためデバッグが困難となる。
- クラス内のどこからでもアクセスできるインスタンス変数は疑似グローバル変数と同じ振る舞いをし、カプセル化がされていればスコープは制限される。
つまり適切にカプセル化されたインスタンス変数は、グローバル変数のメリットとモジュールの疎結合化という本来矛盾する要素の両立を実現する。
では何をインスタンス変数にすべきか
一時的なデータをインスタンス変数に入れるとクラスの利用者が不便になるだけでなく、そのクラスに手を加えるときもインスタンス変数が「クラス内のグローバル変数」になってしまい、クラスが大きくなるにつれて保守性がどんどん低下します。 こういった一時的なデータはメソッドの引数と戻り値、またはローカル変数として受け渡す必要があります。
基本的にはクラス内でもメソッドには引数と戻り値でやりとりするという原則で一貫すべきなのか!