
パターンハッチング正誤表(主なもの)
P.9 1.1大誤解トップ10 誤解8の2行目
- 誤:
Software-Practice and Experienced[Kotula96]などの定期刊行物や、OOPSLA(Object-Oriented Programming, Systems, Languages & Applications)[HJE95, Schmid95]、ICSE[BCC+96]といった会議で、パターンから得られるメリットが報告されている。
- 正:
Software―Practice 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
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日付けの電子メールでのやりとり
