Posts Tagged ‘クリーンコード’

クリーンコード一人読書(3) 第5章〜第7章

6月 18th, 2009

例によって括弧書きはコメント

○第5章 書式化
チームで仕事をしているなら1つの書式ルールで合意をとり、すべてのメンバーはそれに従うべき。
(当たり前のことだけどできてないことが多いコードが多い。ルールを文書化しておくと規約に沿ってないコードを書いたときも指摘しやすい。静的解析ツールのルール定義をしておくのもありかなと思う。)

コードの書式化は宗教戦争の引き金ではなく、長期にわたって保守容易性と拡張性を提供してくれるもの。

大きなファイルよりも小さなファイルの方が理解しやすい、当たり前のこと。
ソースファイル中の記述は抽象レベルが高いものが上、実装詳細が下にあることが望ましい。新聞と同じ構造。

縦方向で書式化に関連するのは空行の入れ方。パッケージ宣言、インポート文、各関数など別の概念のものは空行を挟むと良い。
逆に一続きの処理の間に空行がはいると読みにくくなる。関連するコードは空行を挟まず、物理的に近い位置に記述できることが望ましい。
変数宣言は使用位置に近いところで、ループ変数はループの中で宣言する。

横方向の書式化はインデントや空白、1行の文字数がある。
文字数はモニタに入りきるぐらいで、120文字ぐらいがいいのではないか。
空白をうまく挟むことで処理を強調できる。代入の左右に置くと変数名が読みやすくなるし、計算式の途中に入れると演算子の優先順位が読みやすくなる。
タブを使った変数の位置合わせは意味が無い。位置あわせしないと読みづらいような宣言はそもそも何かおかしい(関数/クラスが大きすぎる とか)。

○第6章 オブジェクトとデータ構造
すべてのメンバにゲッタとセッタを用意するのはアホのすること、最悪。
目指すべきは「抽象インターフェースを公開することで、データの実装を知らせること無しに利用者に対してデータの本質を操作することを可能とする。」

データ/オブジェクトには非対称性があり、状況に応じて使い分けることが大事。

データ構造(structとか)を使用するコードは新たな関数を既存のデータ構造に影響を与えずに追加することが可能。オブジェクト指向の場合、既存の関数を帰ること無く新たなクラスを追加することが可能。

言い換えると

データ構造を使用するコードは、新たなデータ構造を追加する場合、既存関数全てに手を入れる必要がある。オブジェクト指向の場合、新たな関数を追加する場合、既存クラス全てに手を入れる必要がある(interfaceを使った場合ね)。

○第7章 エラー処理
エラー処理は重要だが、エラー処理のせいでロジックが不明瞭になっているとしたらそれは間違っている。

例外が使えるなら戻り値によるエラー情報でなく、例外を積極的に活用する。
3rd partyのライブラリなど多数の例外に対応する必要がある場合はラッパを作って、不要な例外処理をロジック側に書かなくてもよくする工夫も有効。

nullは返さない、nullを渡さない。
nullを返す実装を作ると呼び出し側でチェックが必要になり、記述が複雑になる。空のリストを返すとか工夫をすることで、nullを返すのと同じ効果を得ることが可能なはず。
nullを渡すコードを原則禁止にしてしまえば、nullが渡って来た場合、誤りであるとすぐに気づくことができる。

Clean Code アジャイルソフトウェア達人の技 (大型本)
4048676881

クリーンコード一人読書(2) 第2章〜第4章

6月 9th, 2009

少し間が空きましたが、3章進みました。
納得できるもの、感心できるものもあれば疑問に思うところもちらほら。

○第2章 意味のある名前
いい名前を付けるには時間がかかるが、より多くの時間をあとで節約できる。
以下の命題に答えられる名前を付ける。

  • なぜ存在するのか
  • 何をするのか
  • どう使用するのか

嘘の情報や、紛らわしい名前はさける。具体的には”意図した意味以外に使われる名前”は避ける。例えば配列名にAccountListと名付けるとList構造で実装されていると連想させてしまう。(よくこういう名前を付けてるけど混同したこと無いな・・・)

  • 意味が無い名前も避ける、例えば一般的すぎる”Info”や”Data”。
  • 発音できない名前は使わない。
  • 検索可能な名前を使う。
  • メンバ変数にプレフィックスは不要。
  • ハンガリアン記法もコンパイラの方が賢いので不要。
  • 解決する問題領域の用語を使う。用語集や語彙集があるといい。
  • 当たり前のことだけど変数名には”名詞”、関数名には”動詞”

(最近は長い名前の変数名も使うようになった気がする。省略形をうまく作ったつもりでも引き継げないことの方が多い。
システム全体で用語集/語彙集を作っておくというのはいいかも。作ったときはコード規約に入れておくといいのかな?)

○第3章 関数
関数の原則は”小さくある”こと。一つの関数では一つのことだけを行い、それ以外のことを行わないこと。この原則に従うとif/else文やwhile文のブロック行は1行になり、関数の中にはネストされた構造も登場しなくなる。
関数の実装から別の関数を抽出できるか調べることで、関数が一つのことに集中しているかどうかを調べることができる。

関数は抽象レベルが高いものを先に記述する。こうすることでコードを物語のように読むことができる。(1ファイル中の並びはアルファベット順でいいのかと思ってた。確かに抽象度順がいいかも。)

関数の引数は0が理想、3以上は避けるべき。オブジェクトの状態を変更するようにコードを書くことで、0引数の関数が実現できる。あわせて出力先を引数で受け取るのも避けるべき(C言語ではこれは無理だ・・・)

例外を多用する、戻り値でエラーコードを返さない。エラーコードを使うとすべてのファイルが特定のエラーコードが記述されたファイルを参照するようになり、そのファイルの修正がしにくくなる。
try〜catchでエラーを補足するのも1つの処理になるので、エラーを補足する関数も別途分ける。

  • 副作用をさける。
  • 処理を行う関数と、応答を返す関数は分ける。
  • 最初から完璧な関数が書ける訳は無い。

○第4章 コメント
「ダメなコードをコメントで取り繕っては行けない。書き直すのだ。」
適切なコメントのあり方は、コードでうまく表現することに失敗したとき、それを補うのに使うこと。

コメントの使用がダメな理由は古いコメントはメンテナンスされる保証が無いから。
コメントを書く労力はコメント無しでコードを明確化する努力に当てるべき。
不正確なコメントがあるぐらいなら無い方がマシ。書かずに済むコメントよりも良いものは無い。

必要なコメントもある

  • 著作権/著作者の表示
  • 意図の説明
  • 曖昧な引数・戻り値の明確化
  • 結果に対する警告(この処理はスレッドセーフじゃないとか)
  • TODOコメント

ダメなコメントの例

  • プログラマの独り言、コードの他の箇所も理解していないと意図が分からないようなもの
  • 冗長なコメント(以下はデフォルトコンストラクタ とか)、コードの処理以上に説明しているコメント
  • 変更記録 → ソースコード管理システムに任せましょう
  • 閉じ括弧コメント→括弧の対応が1画面内に収まるぐらいに整理する

Clean Code アジャイルソフトウェア達人の技 (大型本)
4048676881

クリーンコード一人読書(1) 前書き〜第1章

6月 4th, 2009

今週からクリーンコードを毎晩読んでいます。
コードをどう書くべきか、かなり泥臭いところを懇切丁寧に解決した本です。
まだ触りを読んだだけですが、良書の感じがします。

あまりネット上に言及している記事が無いので自分の勉強がてら勉強したことを書いていくことにします。続くと思います、多分。

○前書き
ソフトウェア開発では小さなことこそが重要。
建築家はきちんと閉まらないドア、曲がった床のタイル、汚れた机をよしとするか?
「神は細部に宿る」

5S原則はソフトウェア開発にも当てはまる。

  • 整理:どこに何があるかを把握する。名前付けはきちんとできているか。
  • 整頓:コードは読む人が”ここにあるだろう”と推測した場所にあるべき
  • 清掃:コードをコメントアウトで汚してないか
  • 清潔:コーディングスタイル、仕事の進め方
  • しつけ:変革を厭わない姿勢を持っているか

設計に終わりは無い。常に元あった状態よりも良くしてチェックインすること。
ソフトウェア開発における改善(リファクタリング)はコストではなく、価値につながる。

○序論
職人技の習得は

  • 職人に必要な知識を得る(原則、パターン、経験則)
  • 知識を咀嚼して自分のものとする

からなる。
クリーンコードを書くには努力が必要。経験則とコードを洗練してく過程で行った判断が何よりも重要。

○第1章 クリーンコード
要件を詳細に定義し、機械に実行可能なものとするのがプログラミングであり、コードである。
よく定義された要件はコードと同じ、常にコードは必要である。

粗悪なコードはコードを追加/修正するのに必要なコストが結局高くつき開発スピードが遅くなって管理できなくなってしまう(ウェーディング(wading)と言うらしい)
プログラマはコードのプロなので、混乱のリスクを理解できない管理者に屈服してはならない。

きれいなコードを「読める」のと「書ける」のには大きな差がある、センスが重要。クリーンコードの定義は人により異なるが、以下の要件を満たすものが挙げられることが多い。

  • エレガントであること
  • 明快な抽象化、まっすぐな境界線
  • 原作者以外でも読め、拡張ができる
  • 誰かが気配りを持って書いたコード
  • テストがあり、重複が無く、システムの知識が表現されている

クリーンコードにも流派があって当然で、この本で紹介しているのは流派の1つに過ぎないことを頭に留めておくことは大事。

Clean Code アジャイルソフトウェア達人の技
Robert C. Martin
アスキー・メディアワークス
売り上げランキング: 5682