パターンハッチング正誤表(主なもの)

P.9 1.1大誤解トップ10 誤解8の2行目

  • 誤:
    Software-Practice and Experienced[Kotula96]などの定期刊行物や、OOPSLA(Object-Oriented Programming, Systems, Languages & Applications)[HJE95, Schmid95]、ICSE[BCC+96]といった会議で、パターンから得られるメリットが報告されている。
  • 正:
    SoftwarePractice and Experience[Kotula96]などの定期刊行物や、OOPSLA(Object-Oriented Programming, Systems, Languages & Applications)[HJE95,Schmid95]、ICSE[BCC+96]といった会議で、パターンから得られるメリットが報告されている。

P.16 2.1基本 25行目

  • 誤:
    for (int i = o; child = getChild(i); ++i) {
  • 正:
     for (int i = 0; child = getChild(i); ++i) {

P.18 2.1基本 図2.1

  • 誤:
    Composlte
  • 正:
    Composite

P.22 2.2解放、追加、代理(Orphan,Adoption and Surrogate) 11行目

  • 誤:
    if (subpath.empty()) {
    } else {
  • 正:
    if (subpath.empty()) {
    current->adopt(new Directory(path));
    } else {

P.24 2.2解放、追加、代理(Orphan,Adoption and Surrogate) 9行目

  • 誤:
    virtual void Node::orphan(Node* child) {¥
  • 正:
    virtual void Node::orphan(Node* child) {

P.25 2.2解放、追加、代理(Orphan,Adoption and Surrogate) 12行目

  • 誤:
    string name = head(path};
  • 正:
    string name = head(path);

P.25 2.2解放、追加、代理(Orphan,Adoption and Surrogate) 14行目

  • 誤:

    cerr << getName()
    << " is not a directory."
    << endl;
  • 正:

    cerr << name
    << " is not a directory."
    << endl;

P.34 2.4訪問(Visiting Rights) 27行目

  • 誤:

    } else if (l-<getSubject()); // cat the link's subjct
    }
  • 正:
    } else if (l = dynamic_cast(node)) {
    cat(
    l-<getSubject()); // cat the link's subjct
    } );

P.38 2.4訪問(Visiting Rights) 18行目

  • 誤:
    void Client::(Node* n) {
  • 正:
    void Client::ls(Node* n) {

P.38 2.4訪問(Visiting Rights) 36行目

  • 誤:
    virtual void visit(File*) = 0;
    virtual void visit(Directory*) = 0;
    virtual void visit(Link*) = 0;
  • 正:

    virtual void visitFile(File*) = 0;
    virtual void visitDirectory(Directory*) = 0;
    virtual void visitLink(Link*) = 0;

P.39 2.4訪問(Visiting Rights) 10行目

  • 誤:
    void Directory::accept(Visitor& v) {
    }
    void Link::accept{Visitor& v} { v.visitLink(this); }
  • 正:

    void Directory::accept(Visitor& v) {
    v.visitDirectory(this);
    }
    void Link::accept(Visitor& v) { v.visitLink(this); }

P.46 2.6 シングルユーザープロテクト 1行目

  • 誤:
    それには、TEMPALTE METHODデザインパターンを利用すればよい。
  • 正:
    それには、TEMPLATE METHODデザインパターンを利用すればよい。

P.46 2.6 シングルユーザープロテクト 5行目

  • 誤:

    TEMPALTE METHODパターンによって、アルゴリズムの構造を変えずに、特定のステップだけをサブクラスで再定義することができる。
  • 正:

    TEMPLATE METHODパターンによって、アルゴリズムの構造を変えずに、特定のステップだけをサブクラスで再定義することができる。

P.46 2.6 シングルユーザープロテクト 7行目

  • 誤:

    「適用可能性」の節の第一段落によれば、TEMPALTE METHODは次のような場合にいつでも適用できる。
  • 正:

    「適用可能性」の節の第一段落によれば、TEMPLATE METHODは次のような場合にいつでも適用できる。

P.47 2.6 シングルユーザープロテクト 22行目

  • 誤:
    static void detroy(Node*);
  • 正:
    static void destroy(Node*);

P.47 2.6 シングルユーザープロテクト 33行目

  • 誤:

    destroyがNode基底クラスのメンバなので、isWriableとdeleteのようなプロテクトオペレーションを、カプセル化を破らずにNodeインスタンス上へと呼ぶことができる。
  • 正:

    destroyがNode基底クラスのメンバなので、isWritableとdeleteのようなプロテクトオペレーションを、カプセル化を破らずにNodeインスタンス上へと呼ぶことができる。

P.48 2.6 シングルユーザープロテクト 9行目

  • 誤:
    if *node->isWritable()) {
  • 正:
    if (node->isWritable()) {

P.48 2.6 シングルユーザープロテクト 12行目

  • 誤:
    node->doWarnig(UndeletableWarning);
  • 正:
    node->doWarning(UndeletableWarning);

P.48 2.6 シングルユーザープロテクト 15行目

  • 誤:

    doWarnigは、削除できないというメッセージだけではなく、その他のエラーメッセージに対応できるように抽象化されている。
  • 正:

    doWarningは、削除できないというメッセージだけではなく、その他のエラーメッセージに対応できるように抽象化されている。

P.48 2.6 シングルユーザープロテクト 26行目

  • 誤:

    doStreamOut(Out);
    } else {
    doWarning(unreadableWarning);

    static const User* User::logIn(
    const string& loginName, const string& passwd

    );
  • 正:

    doStreamOut(out);
    } else {
    doWarning(unreadableWarning);
    }
    }

P.49 2.6 シングルユーザープロテクト 4行目

  • 誤:

    TEMPALTE METHODパターンは、ハリウッドの法則(つまり、「我々を呼び出すな。必要な時は、我々が君を呼ぶ。」)として知られている、逆向きの制御につながる。
  • 正:

    TEMPLATE METHODパターンは、ハリウッドの法則(つまり、「我々を呼び出すな。必要な時は、我々が君を呼ぶ。」)として知られている、逆向きの制御につながる。

P.49 2.6 シングルユーザープロテクト 28行目

  • 誤:

    TEMPALTE METHODは、オブジェクトレベルよりはオペレーションレベルで、つまりフレームワークよりも小さい規模でのメリットを教えてくれる。
  • 正:

    TEMPLATE METHODは、オブジェクトレベルよりはオペレーションレベルで、つまりフレームワークよりも小さい規模でのメリットを教えてくれる。

P.58 2.7 マルチユーザープロテクション 12行目

  • 誤:
    Node::isReadableBy(const User* user) {
  • 正:
    bool Node::isReadableBy(const User* user) {

P.62 2.7 マルチユーザープロテクション 3行目

  • 誤:
    virtual void ~Grouping* getGrouping();
  • 正:
    virtual ~Grouping();

P.62 2.7 マルチユーザープロテクション 8行目

  • 誤:
    virtual void resister(
  • 正:
    virtual void register(

P.62 2.7 マルチユーザープロテクション 11行目

  • 誤:
    virtual void unresister(
  • 正:
    virtual void unregister(

P.62 2.7 マルチユーザープロテクション 18行目

  • 誤: const Group* int index = 0
  • 正: const Group*, int index = 0

P.63 2.7 マルチユーザープロテクション 10行目

  • 誤: 例えば、TEMPALTE METHODはmediatorのサブクラスでの振る舞いを部分的に変更する。
  • 正: 例えば、TEMPLATE METHODはmediatorのサブクラスでの振る舞いを部分的に変更する。

P.63 2.8 まとめ 19行目

  • 誤:
    プロテクトに関しては、基本的なレベル、つまり個々のオペレーションレベルでは、TEMPALTE METHODが対応した。
  • 正:
    プロテクトに関しては、基本的なレベル、つまり個々のオペレーションレベルでは、TEMPLATE METHODが対応した。

P.64 2.8 まとめ 図2.4

  • 誤:
    Concretc Visitor
  • 正:
    ConcreteVisitor

P.68 3.1 Singletonの否定(取消、Kill) 16行目

  • 誤:
    class Simgleton {
    public:
    static Simgleton* instance();
  • 正:
    class Singleton {
    public:
    static Singleton* instance();

P.68 3.1 Singletonの否定(取消、Kill) 29行目

  • 誤:
    SingletonDestoyer Singleton::destroyer;
  • 正:
    SingletonDestroyer Singleton::_destroyer;

P.68 3.1 Singletonの否定(取消、Kill) 35行目

  • 誤:
    return_instance;
  • 正:
    return _instance;

P.69 3.1 Singletonの否定(取消、Kill) 3行目

  • 誤:
    calss SingletonDestroyer {
  • 正:
    class SingletonDestroyer {

P.69 3.1 Singletonの否定(取消、Kill) 16行目

  • 誤:
    delete_singleton;
  • 正:
    delete _singleton;

P.69 3.1 Singletonの否定(取消、Kill) 22行目

  • 誤:
    return_singleton;
  • 正:
    return _singleton;

P.71 3.1 Singletonの否定(取消、Kill) 10行目

  • 誤:
    static Destroyer Singleton::_destroyer;
  • 正:
    _destroyer;

P.73 3.1 Singletonの否定(取消、Kill) 4行目

  • 誤:
    それは、destroyerを徹底的にさけて、その代わりに標準ドラフトのatexit()関数に頼ることである。[Peierls96]
    indexPeierls, T.
  • 正:
    それは、destroyerを徹底的にさけて、その代わりに標準ドラフトのatexit()関数に頼ることである。[Peierls96]

P.74 3.1 Singletonの否定(取消、Kill) 29行目

  • 誤:
    しばらくして、Doug Schmidtが関連のあるもっと基本的なバグを指摘してきた。[Schmid96c]
  • 正:
    しばらくして、Doug Schmidtが関連のあるもっと基本的なバグを指摘してきた。[Schmidt96c]

P.75 3.1 Singletonの否定(取消、Kill) 21行目

  • 誤:
    static TYPE* _instance;'
  • 正:
    static TYPE* _instance;

P.75 3.1 Singletonの否定(取消、Kill) 27行目

  • 誤:
    if (_instance = 0) {
    Guard monitor(_lock);
    if (_instance = 0) _instance = new TYPE;
  • 正:
    if (_instance == 0) {
    Guard monitor(_lock);
    if (_instance == 0) _instance = new TYPE;

P.80 3.2 Observerでのトラブル 図3.4

  • 誤:
    金額sub ject
  • 正:
    金額subject

P.85 3.3 Visitorの再訪問 31行目

  • 誤:
    virtual void visit(AmountSubject);
  • 正:
    virtual void visit(AmountSubject*);

P.86 3.3 Visitorの再訪問 図3.6

  • 誤:
    支払期間sublect
  • 正:
    支払期間subject

P.90 3.3 Visitorの再訪問 1行目

  • 誤:
    p.visitSubject(this);
  • 正:
    p.visit(this);

P.90 3.3 Visitorの再訪問 13行目

  • 誤:
    catch-allを提供するときは、必ずダウンキャストをそこに入れて、できることならvisitorオペレーションをオーバーロードする。
  • 正:
    catch-allを提供するときは、必ずダウンキャストをそこに入れて、できることならvisitオペレーションをオーバーロードする。

P.98 3.4 Generation Gap 図3.10

  • 誤:
    Ctock
    draw()
    tick()
  • 正:
    Clock
    draw()
    tick()

P.99 3.4 Generation Gap 構造

  • 誤:
    DCoreClass
  • 正:
    CoreClass

P.104 3.4 Generation Gap 11行目

  • 誤:
    Interacter* Interior();
  • 正:
    Interactor* Interior();

P.104 3.4 Generation Gap 18行目

  • 誤:
    SF_ Rect* _min_hand;
  • 正:
    SF_Rect* _min_hand;

P.109 3.5 型の選択(Type Laundering) 27行目

  • 誤:
    vitual long timestamp() = 0;
  • 正:
    virtual long timestamp() = 0;

P.114 3.5 型の選択(Type Laundering) 14行目

  • 誤:
    ListElem* getCurrent(ListElem* e) { _current = e; }
    void setCurrent(ListElem* e) { -current = e; }
  • 正:
    ListElem* getCurrent() const { return_current; }
    void setCurrent(ListElem* e) { _current = e; }

P.116 3.5 型の選択(Type Laundering) 31行目

  • 誤:
    ListCursor() { _ci=urrent = 0; }
  • 正:
    ListCursor() { _current = 0; }

P.119 3.6 メモリリークに感謝 16行目

  • 誤:
    CursorImp{const Cursor&);
  • 正:
    CursorImp(const Cursor&);

P.120 3.6 メモリリークに感謝 33行目

  • 誤:
    Cursor c = s.cursor(); // 112ページの例に対する唯一の変更
  • 正:
    Cursor c = s.cursor(); // 113ページの例に対する唯一の変更

P.123 3.7 PushかPullか(Pushme-Pullyu) 10行目

  • 誤:
    if (ie = Dynamic_cast(e)) {
    // call CoinInsertedEvent-specific operatons on ie
    } else if (ie = Dynamic_cast(e)) {
  • 正:
    if (ie = dynamic_cast(e)) {
    // call CoinInsertedEvent-specific operatons on ie
    } else if (re = dynamic_cast(e)) {

P.127 3.7 PushかPullか(Pushme-Pullyu)

  • 誤:
    static notify(Coin I nsertedEvent)
  • 正:
    static notify(CoinInsertedEvent)

P.128 3.7 PushかPullか(Pushme-Pullyu) 図3.12

  • 誤:
    hand le(CoinReleaseEvent)
    static notify(CoinInserl:edEvent e)
    code for handiing a ProductDispensedEvent
  • 正:
    handle(CoinReleaseEvent)
    static notify(CoinInsertedEvent e)
    code for handling a ProductDispensedEvent

P.132 4 好きでする仕事 図4.1

  • 誤:
    Insuff icientFundsEvent
    ProduclRemovedEvent
  • 正:
    InsufficientFundsEvent
    ProductRemovedEvent

P.133 4 好きでする仕事 図4.2

  • 誤:
    Event
    Handler
    handle(Event)
  • 正:
    Event
    Handler
    handle(Event)

P.134 4 好きでする仕事 14行目

  • 誤:
    void CoinChanger::handle(Enent* e) {
  • 正:
    void CoinChanger::handle(Event* e) {

P.135 4 好きでする仕事 図4.3

  • 誤:
    handle(ProductOispensedEvent e)
  • 正:
    handle(ProductDispensedEvent e)

P.138 4 好きでする仕事 構造

  • 誤:
    AbstractReceiverA
    receive(MessageA)
    AbstractReceiverB
    receive(MessageB)
  • 正:
    AbstractReceiverA
    receive(MessageA)
    AbstractReceiverB
    receive(MessageB)

P.142 4 好きでする仕事 26行目

  • 誤:
    たとえばValueModelsを使えば、イベントをオブジェクトにしなくても、たくさんの条件文を省略できる。
  • 正:
    たとえばValueModelを使えば、イベントをオブジェクトにしなくても、たくさんの条件文を省略できる。

P.153 4 好きでする仕事 23行目

  • 誤:
    HandlerList:::iterater i;
  • 正:
    HandlerList::iterator i;

P.153 4 好きでする仕事 30行目

  • 誤:
    void notify() { T::notify(this); }
  • 正:
    void Notify() { T::notify(this); }

P.154 4 好きでする仕事 3行目

  • 誤:
    public ProductDispensedEvent::Handler }
  • 正:
    public ProductDispensedEvent::Handler {

P.154 4 好きでする仕事 9行目

  • 誤:
    int HandleEvent(const CoinReleaseEvent& event) {
  • 正:
    int handleEvent(const CoinReleaseEvent& event) {

P.167 関連図書

  • 誤:
    [Schmid96a] 1996年1月2日付けの電子メールでのやりとり
    [Schmid96b] 1996年1月9日付けの電子メールでのやりとり
    [Schmid96c] 1996年2月7日付けの電子メールでのやりとり
    [Schmid96d] 1996年2月8日付けの電子メールでのやりとり
  • 正:
    [Schmidt96a] Schmidt, H. 1996年1月2日付けの電子メールでのやりとり
    [Schmidt96b] Schmidt, H. 1996年1月9日付けの電子メールでのやりとり
    [Schmidt96c] Schmidt, H. 1996年2月7日付けの電子メールでのやりとり
    [Schmidt96d] Schmidt, H. 1996年2月8日付けの電子メールでのやりとり