連載
|
![]() |
|
|
|
●リファクタリングの結果
最終状態のクラス図を以下に示す。
![]() |
| リファクタリングの結果として導かれたTemplate Methodパターンのクラス図 |
ここまでに行ったリファクタリングは「Template Methodの形成(K)」と呼ばれているものだ。
その手順を簡単に振り返ってみよう。
1. 「Compose Method(K)」(メソッドの組み立て)によるアルゴリズムの骨組みの形成
HtmlTextFormatterクラスのFormatメソッドとPlainTextFormatterクラスのFormatメソッドをそれぞれ単一の責務を持つメソッドに分解して再組織化
2. 「メソッドの引き上げ(F)」による派生クラス間で<同一なメソッド>の基本クラスへの引き上げ
(今回は必要がなかったのでスキップ)
3. 「メソッド名の変更(F)」による派生クラス間で<ユニークなメソッド>のメソッド・シグネチャの統一
(今回は必要がなかったのでスキップ)
4. 「メソッド名の変更(F)」による派生クラス間で共通化された<アルゴリズムの骨組みとなるメソッド>のメソッド・シグネチャの統一
(今回は必要がなかったのでスキップ)
5.「メソッドの引き上げ(F)」による<アルゴリズムの骨組みとなるメソッド>の基本クラスへの引き上げ
HtmlTextFormatterクラスのFormatメソッドとPlainTextFormatterクラスのFormatメソッドを基本クラスであるTextFormatterクラスへと引き上げる。それに伴って派生クラス間でユニークなメソッドを基本クラスに抽象メソッドとして定義し、HtmlTextFormatterクラスとPlainTextFormatterクラスでそれぞれオーバーライドする
クラス間をまたがって重複するアルゴリズムが存在するような場合には、このようなリファクタリングを実施する。これによってTemplate Methodパターンが適用され、アルゴリズムは可変部分(ホット・スポット)と固定部分(コールド・スポット)に分離される。
今回の例では、Template MethodとなったTextFormatterクラスのFormatメソッドはコールド・スポットに、FormatメソッドからフックされるTitleTextメソッド、ValuesHeaderTextメソッド、EachValueTextメソッド、ValuesFooterメソッドはそれぞれホット・スポットに分離された。
新しい形式で価値を出力する必要が発生すれば、TextFormatterクラスの派生クラスを用意して、ホット・スポットのメソッドを必要に応じてオーバーライドするだけでよい。
●まとめ
最終状態のすべてのコードを以下に示す。これらのコードでは、1つのことが1カ所でのみ行われていて、2度書かれていることはない。これは「一度、たった一度だけ」(Once and only once)というシンプルなルールに基づいている。
このルールと今回のリファクタリングで紹介したComposed Methodは、リファクタリングの基本となるものなので、ぜひ覚えておいていだだきたい。
|
|
| XpValuesクラス(C#) | |
|
|
| TextFormatterクラス(C#) | |
|
|
| PlainTextFormatterクラス(C#) | |
|
|
| HtmlTextFormatterクラス(C#) | |
前回は、条件分岐を除去するためのリファクタリングからStrategyパターンが導かれる実例を、そして今回は、重複するアルゴリズムを除去するためのリファクタリングからTemplate Methodパターンが導かれる実例を、それぞれコードを中心に解説した。
その中でリファクタリングとパターンの相性が非常に良いことが分かっていただけたのではないだろうか。
次回からは、リファクタリングからまた別のパターンを導くための方法を紹介する。![]()
|
|
|
中西 庸文 |
|
1998年 太陽システム株式会社入社。オブジェクト指向、アジャイル開発プロセスの啓蒙活動に従事。現在は「協調」と「自主的な行動」を基盤としたチーム開発を行うために、プロジェクトファシリテーション(PF)の重要性を強く感じている。 VB&C#デザインパターン(INETA Japan 加盟コミュニティ)を運営中。 |
|
|
| INDEX | ||
| .NETで始めるデザインパターン | ||
| 第4回 リファクタリングにより導き出すTemplate Methodパターン | ||
| 1.リファクタリングから Template Method パターンへ | ||
| 2.リファクタリング:「Compose Method(K)」 | ||
| 3.リファクタリング:「メソッドの引き上げ(F)」 | ||
| 4.リファクタリングの結果 | ||
| 「.NETで始めるデザインパターン」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -



