良いコードを書くための形
最近書いたコードについて、何人かから説明を求められ、説明するのに疲れ果てた結果、良いコードを書ける技術について、調査してまとめました。そのエッセンスをご紹介します。わりとすぐに使える実践的なtipsなので、どうぞお持ち帰りください。以下の本を参考にしました。
良いコードとは何か
一般的に、良いコードは以下の4つの特徴を満たすものと定義します。完全に私の独断と偏見に基づいて、優先順をつけています。
正確に動作する
素早く効果的に動作する
保守性が高い
無駄な部分がない
良いコードは、プロジェクトを推し進めて成功へ導くための基本的な要素となります。達人たちは、シンプルで保守性が高く、安定したコードを、ものすごいスピードで書き上げていきます。
良いコードを書くための5つの習慣
Deliberate Practiceの信者として、私は何事も必要な仕組みとして練習すればある程度は上達できると思っています。そのため、良いコードを書くには、良いコードを書ける仕組みを日々の練習課題にし、自然に書けるようにすることを目指しています。その中で、良いコードを書ける習慣には次の5つのステップがあります。
Step.1: 良いコードをたくさん読め!
Step.2: 写経のようにとにかく書く!
Step.3: 自分に快適なコーディング環境を作る
Step.4: 良いコーダーが集まるコミュニティーに参加し、情報をアップデート
Step.5: Outputとfeedbackから学習
良いコードの名前付け
良いコードの変数名、メソッド名、クラス名などは説明的=意味意図が明確です。
// 悪い例
String s = fmt(value);
String formattedConsumptionTax = insertGroupingSeparators(ConsumptionTax);
// 良い例
String formattedTax = insertGroupSeps(ConsumptionTax);
以下の3つのポイントも注意しましよう。
省略した単語でも意味が伝わる。定番的に省略できる場合(image->img, server->srv, database->db etc.)
一貫性がある。対称性(begin/end, write/read, on/off etc.)と省略の方法(scoreAvgとavgScoreどちらかを使うかを一貫することが必要です。)
英語でつける。(いうまでもないですが)
スコープ
基本的はスコープは小さくし、依存性を保守するための複雑性を減らすべきです。メソッド(関数)、クラス、パッケージのスコープを小さく分割することで、組み合わせの大きいプログラムをつくることが理想的です。
コードの分割
関数は100行以内、できれば30行以内が理想的です。なぜなら、可読性・保守性・再利用性が向上するためです。分割の方法として、トップダウン式とボトムアップ式があります。基本的は2つの方法を組み合わせて利用します。
トップダウン式:必要なクラスや関数を洗い出して、UML(Unified Modeling Language)のようにクラスなどの使い方によって、分割されます。
ボトムアップ式:処理を全部書き終わってから、リファクトリングして分割することです。
コードの集約
「コードの重複は悪」と言われています。同じコードが複数な箇所に現れると、変更が発生するために、単純に作業量が倍になるだけです。そのため、同じ機能を満たすコードは集約する必要があります。主に以下の7つの方法で集約されることが多いです。
関数に機能を抽出する
継承でまとめる
ユーティリティクラスにまとめる(NN系はよく使う)
階層型にまとめる(サービス、モデル(クラス)、controller)
オブジェクトにまとめる
定数にまとめる(よく使う設定値など)
列挙型のデータにまとめる(例えばconfigのパターンなど)
データの構造
配列、リスト、辞書型、ハッシュ、木構造、グラフ(さらにjsonやpickle)などありますので、どのデータ構造が有効かつ効率的かをデザインしましょう。仕様と制約を明示的に決める必要があります。
まとめ
今回は良いコードを書くためのエッセンスをまとめました。さらにコードのパフォーマンス、テスト・デバックなどについて、次回ご紹介したいと思います。
次回は以下について、調査してまとめたいと思います。
コードのパフォーマンス
ユニットテスト
抽象化
メタプログラミング
フレームワークを作ろう
コードリーディングの方法