クラスのメンバ関数(メソッド)をstaticにするべき理由

スポンサーリンク

クラスのメンバ関数(メソッド)を書いている際、メソッドをstaticにするかどうか迷うことってありませんか?

  • オブジェクト指向は一つ一つのオブジェクトが状態と動作を持つというイメージ上、オブジェクトに帰属しないstaticが沢山あるのはなんとなく変ではないのか
  • メンバ変数を使っていないメソッドに全部staticと付けてまわるメリットは何なのか

みたいな事を考えたことはありませんか?

有名な書籍「リーダブルコード」に可読性、リーダビリティの観点から興味深い話が書かれていたので紹介します。

コードを読む人間の脳内からメンバ変数を排除できる

メソッドの宣言にstaticと書かれている限り、そのメソッドはメンバ変数を絶対使いません。そのコードの読者は脳内からメソッド外のメンバ変数のことを100%排除して読むことができます。
また例えばC++など言語によってはthisを省略してメンバ変数を直接名前のみで参照できて、ローカル変数とメンバ変数の区別がつきにくくなったりしますが、staticメソッドだとわかっていればその状況でも「ここにメンバ変数はない」と判断することができます。

メンバ変数を使うメソッドをstaticに変える意味

前段落では元々staticにできるメソッドにstaticと明記するメリットについて述べました。
しかしメンバ変数を利用するコードを引数でのパラメータ渡しに書き換えてstaticにすることにも可読性やその他の価値があります。
メンバ変数を使うというのは、言うなればメソッドの外のグローバル変数を使うようなものです。コードの読者はそのメソッドが使うメンバ変数を理解する為に、他のメソッドがそのメンバ変数を書き換える可能性などを考慮にいれないといけません。逆に引数であればそのメソッド内に閉じた値なので、そのメソッドの外で何が起きるかを考慮する必要がありません。
また外部の状態に依存しないメソッドとなるため、テスト等もしやすくなりコードの再利用性も上がります。

コメント