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