A Philosophy of Software Design ch17 Consistency

APoSDソフトウェア設計勉強メモ

出典: 


Consistency

  • 一貫性は複雑性を減らす強力なツール

    • 似ているものは似たやりかた
    • 似ていないものは異なるやりかた
一貫性がある 一貫性がない
学習にかかる時間 短い 長い
ミス 少ない 多い
  • 認知の助け

    • 一つ理解すれば他の部分にも知識を流用できる
  • 一貫性がないとミスが増える

    • 誤った仮定をおいてしまうため

      • 例: 「同じだろう」と思いきや実は異なる代物だった

Examples of consistency

  • さまざまなレベルで適用できる

    • 識別子の名前

      • ch14に詳しい
    • コーディングスタイル

      • インデント
      • 中カッコ位置
      • 危険な言語機構の使用の制限
    • インタフェース

      • 複数の実装に共通のインタフェースをもたせる
      • ひとつ学習すれば他の実装も簡単に理解できる
    • デザインパターン

      • 広く受け入れられている解法

        • 例: UIのMVC
      • 効能

        • よりすばやく開発できて
        • よりうまくいく見込みがあり
        • 読み手にとって、より明瞭になる
      • ch19.に詳しい
    • 不変条件

      • 常に真であるような特性
      • 【補】コンストラクタで確立するアレ
        • Textクラスが集約する各行の文字列はLFで終わる
        • 【補】バスが必ず/で終わる、とかもこれかな
      • 効能

        • 特殊ケースを減らせる
        • コードの振る舞いの理由付けが容易になる

Ensuring consistency

  • 新参は知らずのうちに規約を破ってしまったりするもの
  • 一貫性をどう維持するか

    • 文書化する

      • 目に触れる場所に配置する

        • Wikiなど
      • ときどき更新する
      • 不変条件のような、より局所的な規約は、コード中に書き下す
    • 強制する

      • しくみで強制する

        • linterが通らないとcommitできないようにする、みたいな

          • LF/CR-LFの話(省略)

            • 【所感】Gitなら.gitattributesで一撃
        • コードレビューで口うるさく言う
    • 郷に入っては郷に従え

      • 既存のコードベースで規約らしきものを見つけたら従う
      • 既存の設計思想に従う
    • 既存の規約を変えようとするな

      • 「より良いアイデアだから」というだけでは、一貫性を壊す理由としては不十分

        • 新しい手法を正当化できる有意義な根拠はありますか?
        • 新しい手法は、時間をかけて古いやり方を全て置換するに足る良いものですか?
      • これらの問いに対して、組織の合意がとれたらどうぞ

        • その場合、古い規約は跡形もなくすこと
        • 他の開発者が、新しい規約を知らず、古い規約を再導入してしまうリスクもある
      • 既存の規約を再考するのに工数を費やすのは、たいてい良くないことである

Taking it too far

  • 似ていないものを似たやり方でやるな

    • 例:

      • 異なるものに同じ変数名を割り当ててしまう
      • フィットしないデザインパターンを適用してしまう
    • 逆に複雑になり混乱を招く
  • 「似ていれば、それそのものである」と自信を持って言えること

Conslusion

  • 投資の姿勢

    • 【補】ch3.にて述べた「戦略的姿勢」
    • 一貫性を保証するためには、「動くコード」に加え、余剰の工数を要する
  • 投資の例

    • 規約の決定
    • 規約の自動チェッカの構築
    • 既存のコードベースを真似るために、似ている部分を探す
    • コードレビューでチームを教育する
  • 「明瞭なコード」という形で返ってくる

    • 速く正確に読み解ける
    • 開発が速くなり、バグも減る

英語

  • conspicuous

    • 目立つ
  • every once in a while

    • たまに

      • everyは強意
  • nit-picky

    • 口うるさい

      • 人の頭からシラミの卵を取る、という意味から
  • overzealous

    • 熱心すぎる