tseki blog

my study room

ソースコードが読みにくい理由

GWも折返し地点に差し掛かりましたが、皆さんいかがお過ごしでしょうか。

やや話題の「ユニコーン企業のひみつ」を読んで
組織やビジョナリー・カンパニー的な仕事のモチベーションに想いを馳せつつ、
GWの前半は手元のコードを眺めていました。

プロジェクトで決められたことしかやらないうちに
負債が溜まったコードとはまさにこのこと。

今日は、いろいろと弄っているうちに感じた
「このコードが読みにくい理由」
を書き留めておきます。

読みやすさには個人差があるのと、
C# 以外のケースでは必ずしも当てはまらない内容かもしれません。

1. 名前付けに違和感を感じる

名前から "違和感" を多く感じるコードは非常に読みにくいです。
コーディングする上で名前を付ける場面は非常にたくさんあります。

  • クラス名
  • 関数名
  • 引数名
  • ローカル変数
  • クラス変数 ...etc

コードを読んでいて違和感を感じた名前付けにはこんなものがありました。

  • 型名と変数名が大きく異なっており関連が分からなくなる
  • 名前が不自然に省略されており、いちいち考えてしまう
  • タイポがある
  • 命名規則(大文字・小文字、プレフィックス等)が統一されていない

些細なことと思うかもしれませんが、小さなジャブでもじわじわ効いてきます。
名前を変更することが可能かどうか確認し、IDEを使って安全に名前を変更しましょう。

2. 不要なコードが多い

不要なコードとしてはこんなものがありました。

  • コメントアウトされた古いコードが残っている
  • 現在使われていない関数や引数、変数等
  • マージ可能な変数宣言
  • 到達しないコード
  • 明らかに不要な条件分岐や属性

IDEのヒントが出てくるので余計に気になってしまうのかもしれませんが、
不要な情報を削ぎ落とすことで読みやすくなりました。
「将来きっと役に立つ」の精神ではなく断捨離をすると楽になれます。

3. いびつな実装

「その場しのぎの対応」とはこういうことを指すのでしょう。
サグラダ・ファミリア
度重なる機能追加・不具合修正等の結果、
後の理解が非常に難しくなってしまうことってあると思います。

  • 謎のクラス変数やプロパティ
  • 謎に生えたpublicメソッド
  • よく見ると実はstatic関数
  • 取ってつけただけの不要不急なInterface定義
  • 不適切なモジュールにあるクラス
  • 不適切なクラスにある関数

嫌な匂い的な何かを感じたら見直してみましょう。
時間がかかる場合もありますが、後に幸せになれるかもしれません。

4. 過剰なアクセス修飾子

「実はクラス内部からしかアクセスされていないのにpublicになっている」など、
アクセス修飾子が過剰に設定されていることにより、
クラス間相互作用の影響範囲が見えにくくなることがあります。
適切なアクセス修飾子に変更することで、
クラスの輪郭や役割がハッキリして理解しやすくなります。

5. コードが整理されていない

1ファイルに複数のクラスをまとめると理解がしづらくなります。
privateでないネストされたクラスなどの濫用にも注意しましょう。
コードクリーンアップやリファクタリングの機能が非常に便利です。
ReSharper などを使ってコードをきれいに保ちましょう。

まとめ

割れ窓理論という言葉もありますが、
不吉な匂いに対する感度を上げるためにも細かい整理が大切だなと改めて実感しました。