A Philosophy of Software Design ch11. Design It Twice

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

出典: 


Design It Twice

  • ソフトウェア設計は難しいので、ベストなものを一発で考えつくことはまずできない
  • 設計は二回せよ

    1. 列挙する
    2. 比較検討して選定する
  • 例: GUIエディタのTextクラスのインタフェース設計

    1. まずいくつか可能性を挙げてみる

      • 例:

        • 行指向
        • 文字指向
        • 文字列指向
      • 根本的に異なるアプローチを挙げると学びが多い
      • 理にかなったものが1つしか思い浮かばなかった場合、よくないものも挙げて比較してみる
    2. 利点欠点をリストアップする

      • 検討事項

        • 高水準側から利用しやすいのは?

          • 最重要
          • 上記の例では…

            • 行指向: 利用側に行の分割・マージを強いるので良くない
            • 文字指向: 利用側にループを強いるので良くない
        • インタフェースが単純なのは?
        • インタフェースが汎用なのは?
        • 高効率な実装を可能とするのは?

          • 文字指向は1文字ずつループするので効率が悪くなりそう
    3. ここにおいて、「一番よい設計」のよりどころが明確になる

      • 最初に挙げたもののいずれかかもしれない
      • キメラが良いかもしれない
      • どれも良くないかもしれない
    4. 最初に挙げたものがどれも魅力的でなかったら

      • 比較検討時に特定した「良くない点」をもとに、新しい選択肢を挙げる
      • 例: 最初に行指向と文字指向しか思いつかなかった場合

        • 共通の「良くない点」は「利用側にテキスト操作を強いる」こと

          • 危険信号: Textクラスなのにテキスト操作が完結していない
        • 文字列指向アプローチを思いつく材料になる
  • 実装にも適用できる

      • 連結リスト
      • 固定長配列
      • gap buffer

        • 【補】カーソル位置に常にギャップを移動し、入力時はそこに文字列を挿入するやつ

          • Emacsはこれ
    • 比較検討の検討事項はインタフェースのものとは異なってくる:

      • 単純さ
      • パフォーマンス
  • Designing-it-twice Principleと時間

    • 二回設計することでかかった余分の時間は、良い設計を選定したことでペイできる
    • 小さなモジュール(クラス等)のインタフェース設計なら大して時間がかからない
    • 大きなモジュールのインタフェース設計や、実装設計では比較的長時間かかる
    • が、良い設計のメリットも大きいのでペイできる
  • 「一度で済ませられないのは賢くないから」という誤解

    • んなことはない

      • ソフトウェア設計は本当に難しいのである
  • 設計が向上するのみならず、設計スキルを磨くことにもつながる

    • 複数のアプローチを考案して比較検討することで、設計の良し悪しを決める要因がわかってくる
    • 悪いものを除外し、良いものに焦点を合わせることが簡単にできるようになる

英語

  • devise

    • 考案する
  • hone

    • かみそりを研ぐ
  • hone in on

    • …に焦点を合わせる