A Philosophy of Software Design ch17 Consistency
Consistency
- 一貫性は複雑性を減らす強力なツール
- 似ているものは似たやりかた
- 似ていないものは異なるやりかた
一貫性がある | 一貫性がない | |
---|---|---|
学習にかかる時間 | 短い | 長い |
ミス | 少ない | 多い |
- 認知の助け
- 一つ理解すれば他の部分にも知識を流用できる
- 一貫性がないとミスが増える
- 誤った仮定をおいてしまうため
- 例: 「同じだろう」と思いきや実は異なる代物だった
- 誤った仮定をおいてしまうため
Examples of consistency
- さまざまなレベルで適用できる
- 識別子の名前
- ch14に詳しい
- コーディングスタイル
- インデント
- 中カッコ位置
- 危険な言語機構の使用の制限
- インタフェース
- 複数の実装に共通のインタフェースをもたせる
- ひとつ学習すれば他の実装も簡単に理解できる
- デザインパターン
- 広く受け入れられている解法
- 例: UIのMVC
- 効能
- よりすばやく開発できて
- よりうまくいく見込みがあり
- 読み手にとって、より明瞭になる
- ch19.に詳しい
- 広く受け入れられている解法
- 不変条件
- 常に真であるような特性
- 【補】コンストラクタで確立するアレ
- 例
- Textクラスが集約する各行の文字列はLFで終わる
- 【補】バスが必ず
/
で終わる、とかもこれかな
- 効能
- 特殊ケースを減らせる
- コードの振る舞いの理由付けが容易になる
- 識別子の名前
Ensuring consistency
- 新参は知らずのうちに規約を破ってしまったりするもの
- 一貫性をどう維持するか
- 文書化する
- 目に触れる場所に配置する
- Wikiなど
- ときどき更新する
- 不変条件のような、より局所的な規約は、コード中に書き下す
- 目に触れる場所に配置する
- 強制する
- しくみで強制する
- linterが通らないとcommitできないようにする、みたいな
- LF/CR-LFの話(省略)
- 【所感】Gitなら.gitattributesで一撃
- LF/CR-LFの話(省略)
- コードレビューで口うるさく言う
- linterが通らないとcommitできないようにする、みたいな
- しくみで強制する
- 郷に入っては郷に従え
- 既存のコードベースで規約らしきものを見つけたら従う
- 既存の設計思想に従う
- 既存の規約を変えようとするな
- 文書化する
Taking it too far
- 似ていないものを似たやり方でやるな
- 例:
- 異なるものに同じ変数名を割り当ててしまう
- フィットしないデザインパターンを適用してしまう
- 逆に複雑になり混乱を招く
- 例:
- 「似ていれば、それそのものである」と自信を持って言えること
Conslusion
- 投資の姿勢
- 【補】ch3.にて述べた「戦略的姿勢」
- 一貫性を保証するためには、「動くコード」に加え、余剰の工数を要する
- 投資の例
- 規約の決定
- 規約の自動チェッカの構築
- 既存のコードベースを真似るために、似ている部分を探す
- コードレビューでチームを教育する
- 「明瞭なコード」という形で返ってくる
- 速く正確に読み解ける
- 開発が速くなり、バグも減る
英語
- conspicuous
- 目立つ
- every once in a while
- たまに
- everyは強意
- たまに
- nit-picky
- 口うるさい
- 人の頭からシラミの卵を取る、という意味から
- 口うるさい
- overzealous
- 熱心すぎる