勉強日記

チラ裏

A Philosophy of Software Design ch11. Design It Twice

www.goodreads.com


Design It Twice

  • ソフトウェア設計は難しいので、ベストなものを一発で考えつくことはまずできない
  • 設計は二回せよ
    1. 列挙する
    2. 比較検討して選定する
  • 例: GUIエディタのTextクラスのインタフェース設計
    1. まずいくつか可能性を挙げてみる
      • 例:
        • 行指向
        • 文字指向
        • 文字列指向
      • 根本的に異なるアプローチを挙げると学びが多い
      • 理にかなったものが1つしか思い浮かばなかった場合、よくないものも挙げて比較してみる
    2. 利点欠点をリストアップする
      • 検討事項
        • 高水準側から利用しやすいのは?
          • 最重要
          • 上記の例では...
            • 行指向: 利用側に行の分割・マージを強いるので良くない
            • 文字指向: 利用側にループを強いるので良くない
        • インタフェースが単純なのは?
        • インタフェースが汎用なのは?
        • 高効率な実装を可能とするのは?
          • 文字指向は1文字ずつループするので効率が悪くなりそう
    3. ここにおいて、「一番よい設計」のよりどころが明確になる
      • 最初に挙げたもののいずれかかもしれない
      • キメラが良いかもしれない
      • どれも良くないかもしれない
    4. 最初に挙げたものがどれも魅力的でなかったら
      • 比較検討時に特定した「良くない点」をもとに、新しい選択肢を挙げる
      • 例: 最初に行指向と文字指向しか思いつかなかった場合
        • 共通の「良くない点」は「利用側にテキスト操作を強いる」こと
          • 危険信号: Textクラスなのにテキスト操作が完結していない
        • 文字列指向アプローチを思いつく材料になる
  • 実装にも適用できる
      • 連結リスト
      • 固定長配列
      • gap buffer
        • 【補】カーソル位置に常にギャップを移動し、入力時はそこに文字列を挿入するやつ
    • 比較検討の検討事項はインタフェースのものとは異なってくる:
      • 単純さ
      • パフォーマンス
  • Designing-it-twice Principleと時間
    • 二回設計することでかかった余分の時間は、良い設計を選定したことでペイできる
    • 小さなモジュール(クラス等)のインタフェース設計なら大して時間がかからない
    • 大きなモジュールのインタフェース設計や、実装設計では比較的長時間かかる
    • が、良い設計のメリットも大きいのでペイできる
  • 「一度で済ませられないのは賢くないから」という誤解
    • んなことはない
      • ソフトウェア設計は本当に難しいのである
  • 設計が向上するのみならず、設計スキルを磨くことにもつながる
    • 複数のアプローチを考案して比較検討することで、設計の良し悪しを決める要因がわかってくる
    • 悪いものを除外し、良いものに焦点を合わせることが簡単にできるようになる

英語

  • devise
    • 考案する
  • hone
    • かみそりを研ぐ
  • hone in on
    • ...に焦点を合わせる