doc.dev1x.org

A Philosophy of Software Design (John Ousterhout)

書籍情報

書籍目次

Preface

ソフトウェア設計の現状

問題分解の重要性と教育の欠如

プログラマの能力差と設計スキルの性質

スタンフォード大学 CS 190 の授業スタイル

著者の背景と経験

本書の位置付けと読者への要請

1 Introduction

ソフトウェア開発と複雑性の本質

複雑性に対処する2つのアプローチ

ウォーターフォールモデルとその問題点

インクリメンタル開発(アジャイル開発)

ソフトウェア設計の継続的プロセス

本書の目的と活用方法

2 The Nature of Complexity

章の目的と概要

複雑性の定義

複雑性の症状

複雑性の原因

複雑性の漸進的な蓄積

結論

3 Working Code Isn't Enough

戦術的プログラミングの問題点

戦略的プログラミングの原則

適切な投資量

スタートアップにおける設計投資

結論

4 Modules Should Be Deep

モジュラー設計の基本原則

インターフェースの構成要素

抽象化の概念と誤り

深いモジュール

浅いモジュール

private void addNullValueForAttribute(String attribute) {
    data.put(attribute, null);
}

クラシティス(Classitis)

JavaとUnix I/Oの比較例

結論

5 Information Hiding (and Leakage)

情報隠蔽の基本概念

情報漏洩とその危険性

時系列分解による情報漏洩

HTTPサーバを用いた実例

クラス内部での情報隠蔽

情報隠蔽の過剰適用への注意

結論

6 General-Purpose Modules are Deeper

汎用設計と特化設計のトレードオフ

事例: テキストエディタのテキストクラス設計

汎用性が情報隠蔽を向上させる

汎用インタフェース設計のための自己確認

結論

7 Different Layer, Different Abstraction

階層ごとに異なる抽象化の原則

パススルーメソッド

public class TextDocument ... {
    private TextArea textArea;
    private TextDocumentListener listener;
    ...
    public Character getLastTypedCharacter() {
        return textArea.getLastTypedCharacter();
    }
    public int getCursorOffset() {
        return textArea.getCursorOffset();
    }
    public void insertString(String textToInsert, int offset) {
        textArea.insertString(textToInsert, offset);
    }
    public void willInsertString(String stringToInsert, int offset) {
        if (listener != null) {
            listener.willInsertString(this, stringToInsert, offset);
        }
    }
    ...
}

インターフェースの重複が許容されるケース

デコレーターパターン

インターフェースと実装の違い

パススルー変数

結論

8 Pull Complexity Downwards

基本原則: 複雑さを下方に引き込む

例1: テキストエディタのテキストクラス

例2: 設定パラメータ

過剰適用への注意

結論

9 Better Together Or Better Apart?

基本的な問い: まとめるか分けるか

分割のコスト

コードをまとめるべき判断基準

まとめるべき具体的なケース

汎用コードと専用コードの分離

例1: 挿入カーソルと選択範囲

例2: ログ記録用の別クラス化(分離が不適切な例)

例3: エディタのUndo機構(汎用部分の分離)

メソッドの分割と統合

結論

10 Define Errors Out Of Existence

例外処理が生む複雑性

過剰な例外定義の問題

例外を定義によって排除する手法

例外マスキング

例外の集約

クラッシュ戦略

特殊ケースの設計による排除

限界と結論

Chapter 11 Design it Twice

基本原則

設計代替案の検討プロセス

代替案の評価基準

設計の統合と改善

多層的な適用

時間的コスト

優秀な人材とこの原則の関係

設計スキルへの効果