プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

2012-12-10から1日間の記事一覧

C++テンプレートテクニック 特殊化、部分特殊化

最近読んだ本だがあまり頭に入っていないようなので、読みなおして復習する。特殊化 template<typename T> bool equal(T x, T y){ return x==y; } //const char*特殊化 template<> bool equal(const char*x, const char*y){ return std::strcmp(x,y) == 0; } 部分特殊化 </typename>…

付録D デザインパターンQ&A

デザインパターンとは ソフトウェアでよくある問題の解法。GoFと呼ばれる4人によってまとめられた23のパターンが有名。新しいパターンは続々生まれている。 デザインパターンは万能? No。すべての問題を解決できるわけではない。 適切なデザインパターンの…

23.Interpreter 文法規則をクラスで表現する

デザインパターンの目的の一つはクラスの再利用性を高めること。再利用性とは、一度作成したクラスをあまり修正せずに(できれば全く修正せずに)何度も使えるようにすること。 Interpreterパターンでは解決しようとしている問題を「ミニ言語」で表現する。…

22.Command 命令をクラスにする

命令を表すクラスのインスタンスという1個の「もの」として表現 履歴やマクロはそのインスタンスの集合。 CommandはEventと呼ばれることもある。Command・・・命令のAPI ConcreteCommand・・・Command実装 Receiver・・・命令の実行対象。命令を受けてアクシ…

21.Proxy 必要になってから作る

proxy=代理人 たとえばコンストラクタが重い場合はproxyパターンの適用対象となる。 使う前にインスタンスを作成しても実際に使われない限りはコンストラクト処理にかかった時間が無駄になる。そこで対象クラスと同じインターフェースを持つproxyクラスによ…

20.Flyweight 同じ物を共有して無駄をなくす

メモリ消費を減らす。 インスタンスをできるだけ共有して無駄にnewしない。Flyweight・・・共有するクラス(メモリ食う) FlyweightFactory・・・工場。内部にインスタンスをコンテナに格納。 Client・・・FlyweightFactoryを使ってFlyweightを作り出し、そ…

19.State 状態をクラスとして表現する

同一のインターフェースを持ったクラスを状態ごとに作成する。状態に応じてクラスを切り替えることで、状態の変化を表すと同時に状態に応じた振る舞いを表現する。State・・・状態に依存した振る舞いをするAPI ConcreteState・・・Stateの実装。 Context・・…

18.Memento 状態を保存する

アンドゥ(もとに戻す)、リドゥ(やり直し)、ヒストリー(履歴)、スナップショット(現在の状態の保存)の提供。 インスタンスを復元するには内部の情報にアクセスする必要がある。しかし不用意にアクセスを許可すると内部構造に依存したコードが散乱する…

17.Observer 状態の変化を通知する

Observerは観察者。観察対象が変化すると観察者に対して通知。Subject・・・観察される側。Observerを登録・削除するメソッドと、登録されているObserverへ通知するメソッドを持つ。また、Subjectの状態を取得するAPIの宣言をする ConcreteSubject・・・具体…

16.Mediator 相手は相談役一人だけ

メンバーはみんな相談役だけに報告し、メンバーの指示は相談役だけからくる。 メンバー同士が状況を探り合ったり指示する必要がなくなる。Mediator・・・Colleagueと通信して調整を行うAPI ConcreteMediator・・・Mediatorの実装を行い、実際の調整をする Co…

15.Facade シンプルな窓口

ファサードパターン。フランス語で建物の正面という意味らしい。 シンプルな窓口というくらいだからページ数も少ない。 ごちゃごちゃした詳細をまとめ、高レベルのAPIを提供する。システムの外側にシンプルなAPIを見せる。Facade・・・システムを構成してい…

14.ChainOfResponsibility 責任のたらい回し

ある要求を処理するオブジェクトをダイレクトに決められない場合に、オブジェクトを鎖のようにつないでおき、そのオブジェクトを順次渡り歩いて目的のオブジェクトを決定する。Handler・・・要求を処理するAPI。次の人(Handler)を保持しておき、自分で処理…

13.Visitor 構造を渡り歩きながら仕事をする

データ構造と処理を分離Visitor・・・コンテナの要素ごとに処理を行うメソッドを宣言 ConcreteVisitor・・・Visitorの実装。 Element・・・Visitorの訪問先。訪問者を受け入れるメソッドを宣言 ConcreteElement・・・Elementの実装 ObjectStructure・・・Ele…

12.Decorator 飾り枠と中身の同一視

透過的なインターフェース。ComponentをいくらDecoratorで包んでも、APIは隠されない。 中身を変えずに機能追加ができる。 動的な機能追加ができる。 単純な品揃ででも多様な機能追加ができる。 デメリットは小さいクラスが増えてしまうこと。Component・・…

11.Composite 容器と中身の同一視

ディレクトリなどの再帰的な構造。Leaf・・・中身。この中には入れられない Composite・・・容器。LeafとCompositeを格納 Component・・・LeafとCompositeを同一視するための役。 Client・・・Compositeの利用者 関連しているパターン Command・・・マクロを…

10.Strategy アルゴリズムをごっそり切り替える

委譲によってアルゴリズムを切り替える プログラムは問題を解くために書かれている。問題を解くための手法を交換できるようにしたのがStrategyパターン。Strategy・・・戦略を利用するためのAPI ConcreteStrategy・・・Strategyの実装。具体的な戦略 Context…

9.Bridge 機能の階層と実装の階層を分ける

機能の階層=新しい機能を追加するためのクラス階層。ネストすることが多い 実装の階層=具体的な実装を定義するクラス階層。インターフェースあるいは抽象クラスから枝分かれすることが多い あるシステムの階層に機能と実装の階層が混じっていたらそれをBri…

8.AbstractFactory 関連する部品を組み合わせて製品を作る

抽象的な工場では、抽象的な部品を組み合わせて抽象的な製品を作る。 実装には注目せず、APIに注目する。APIだけを使って部品を組み立てて製品にまとめる。 製品を得るために必要な手順と情報を実装から切り離す。AbstractProduct・・・抽象的な部品や製品の…

7.Builder 複雑なインスタンスを組み立てる

インターフェースのAPIを利用してロジックという枠組みを作り、具体的な実装を外部に任せることで、複雑なインスタンスを作成する。Builder・・・インスタンスを作成するためのAPI。インスタンスの各部分を作るためのメソッドを用意 ConcreteBuilder・・・Bu…

6.Prototype コピーしてインスタンスを作る

1つずつnewすると大変な場合にインスタンスを複製して新しいインスタンスを作りたい。 種類が多すぎてクラスにまとめられない クラスからインスタンスを作るのが難しい フレームワークと生成するインスタンスを分けたい newでインスタンスを作成する場合は…

5.Singleton たった1つのインスタンス

指定したクラスのインスタンスが絶対に1個しか存在しないことを保証したい インスタンスが1個しか存在しないことをプログラム上で表現したい コンストラクタをプライベートにすることで外部でnewできなくする。Singleton・・・自分自身のインスタンスをsta…

4.FactoryMethod インスタンス生成をサブクラスに任せる

インスタンスの作り方をスーパークラスで定め、肉付けをサブクラスに任せる。Product・・・生成されるインスタンスが持つべきAPI Creator・・・Productを生成する抽象クラス。抽象メソッドを使ってProductを作る。実際のインスタンス生成はConcreteCreatorに…

3.TemplateMethod 具体的な処理をサブクラスに任せる

スーパークラスで抽象メソッドを使ったロジック(テンプレートメソッド)の構築、サブクラスで抽象メソッドの実装。AbstractClass・・・テンプレートメソッドを実装し、抽象メソッドの宣言 ConcreteClass・・・抽象メソッドの実装ロジックが共通化できる。ア…

2.Adapter 一皮かぶせて再利用

異なるインターフェース間の仲介を行うためにインターフェースをラッピングする。 継承と委譲の2種類がある。Target・・・必要とされるAPIの定義 Client・・・Targetのメソッドを使って仕事をする Adaptee・・・すでに用意されている実装。変更が困難 Adapt…

1.Iterator 1つ1つ数え上げる

配列、集合など要素の集まり(コンテナ)を走査するための仕組みを提供するパターン。Iterator・・・要素を1つずつ走査するためのAPI ConcreteIterator・・・Iteratorの実装 Aggregate・・・Iteratorを作り出すAPI。コンテナを走査するためのIteratorを返す…