作成日 2007/5/27 最終更新日 2008/3/21
デザインパターンとアンチパターン
このページでは
デザインパターン と
アンチパターン
とは、どのようなものなのかについて簡単に説明します。
デザインパターンは簡単に言うと成功事例集といいのでしょうか。この場合は、こうやったらうまくいきますよという事例集です。
アンチパターンは逆に失敗事例集です。これやったら失敗しますよ、解決するにはこうしてくださいという事例集です。
(だるまもその一人でしたが、)オブジェクト指向の基礎(クラスやオブジェクトの概念)を理解せずに、オブジェクト指向におけるデザインパターンやアンチパターンを勉強する人がいますが、これは非常に危険ですのでやめて下さい。
クラスとオブジェクトの概念を理解していない人は「
クラスとオブジェクト
」を先に見てください。
デザインパターンとアンチパターンの名前と概要は
UMTPの試験
で出てきますので、取得を考えている人は概要くらいは覚えておいた方が良いです。
情報処理技術者試験
ではどうだろうか…。さすがに、多分出題されないと思いますが…。
面倒なので、e-Words からはじめの1行だけ引用します。
プログラム設計時に起こる典型的な問題とそれに対する解決策を整理し、再利用できるようにまとめたもの。
デザインパターン で一番有名なのはGoFによるデザインパターンです。(というか、だるまはこれくらいしか知りません。) 主なものにシングルトンパターン 、ステートパターン、デコレーターパターン があります。
デザインパターンを勉強するメリットには、
デザインパターンの名前を覚えておくと、他の人との意思疎通が楽になる。
つまり、どのように設計するのか、もしくはしたのかを、他の人に説明するときに、いちいちすべてを説明する必要がなくなります。
「名前がついている」ということはとても重要なことです。(※1)
クラスライブラリの理解が深まります。
クラスライブラリにデザインパターンが適用されている場合があります。
有名なのはjava.ioパッケージにあるInputStreamクラス とそのサブクラス、OutputStreamクラス
とそのサブクラスでしょう。これらのクラスの設計にはデコレータパターンが適用されています。
自分が設計するときに使えます。
があります。
デザインパターンを適用するときの注意としては、
設計時にデザインパターンを適用するときは、適用することによるメリットだけでなく、デメリットも検討し、本当に適用すべきなのかを検討してから適用すべきです。
オブジェクト指向でデザインパターンを適用した場合、クラス数が増える傾向にあります。アスペクト指向
でデザインパターンを適用した場合は、オブジェクト指向のときほどではないようですが…。
他の人がデザインパターンを知っているかを確認した方が良いかもしれません。
だるまが思うに、ちゃんと勉強して理解している人は少ないです。デザインパターンと言う名前しか知らなかったり、GoFのデザインパターンのうちの、2・3個しか知らない人は多いです。(だるまもその一人ですが…。)
があります。
-----
※1:別に、これはデザインパターンに限ったことではありません。
他の技術(いや、技術に限らない。)でもそうですが、名前がついているということは大事なことです。
アンチパターンの説明は、Wikipedia からの引用します。
アンチパターンとは、ある問題に対する、不適切な解決策を分類したものである。語源は、ソフトウェア工学におけるデザインパターンである。
主に失敗した開発プロセスに焦点を当てて失敗に陥るパターンを類型化する。そうすることで、そのような事例の早期発見と対応策に関しての提案を目的とする。
競合状態が発生するソフトウェアの開発や保守性の低いソースコードなどが主な例である。
アンチパターンは名前、根本原因、一般症状、リファクタリングの方法(アンチパターンを取り除く方法)などからなります。
アンチパターンの提要範囲は、デザインパターンと違って設計だけにとどまりません。まあ、設計が悪いというのは、それ自体がソフトウエアの品質低下、進捗遅れ、コスト増などに絡んでくるのですが、アンチパターンの中には初めから設計以外のもの(プロジェクト管理、セキュリティなど)に対してのものもあります。
アンチパターンの名前と概要を紹介します。(アンチパターンはたくさんありますが、すべては紹介しきれません。)
溶岩流(Lava
Flow)
研究開発や技術などの変化スピードが多い場合に起こる可能性があります。一時しのぎ的に作成し、ドキュメントが無く、不要なソースがありこちにある状態です。
そのようなわけの分からないソースは、今後もそのままになる可能性が高いです。だって、仕様がよくわからないものに対して修正するは大変だから…。
放置しておくと、わけのわからないソースが増えていきます。
打ち出の小槌(Golden
Hammer)
自分が使い慣れている技術や考えなどをなんにでも適用させようとする。
これは非常に良くある話です。
切り張りプログラミング(Cut and Paste
Programming)
似ている箇所だからと、ソースをコピペしてませんでしょうか?
コピペした箇所、すべて修正したと思ったら、実は残っていたってことないですか〜。
※オブジェクト指向プログラミングではログ出力やアクセス制御など、どうしてもこのアンチパターンに陥ってしまう場合があります。
機能的分解(Functional
Decomposition)
オブジェクト指向を理解していない人(プロセス中心アプローチで設計・実装する人)がオブジェクト指向設計・実装をすると…?
クラス=関数の集まりって思ってないよね?
これも、非常に良くあることです。
クラッシュ(Crush)
複数のユーザが同一データを同時に更新しようとしています。
例えば、
Aさんがあるデータを開きました。
Bさんもあるデータ(Aさんが見ているデータ)を開きました。(BさんはAさんも同じデータを見ていることは知りません。)
Aさんがデータを修正して保存しました。
Bさんもデータを修正して保存しました…って、これじゃあ、Aさんが保存したデータが消えちゃうよ。しかも、そのことにAさん、Bさん気がつかない…。
アンチパターンを勉強するメリットは
アンチパターンに名前がついているので、他の人とのコミュニケーションがスムーズに行きやすくなる。
(いちいちすべてを説明する必要が無くなる)
自分が設計などをするときの間違いを減らせる。
教育にも使える。(初心者が陥りやすい間違いがアンチパターンの中には結構あるため。)
ソフトウエア業界以外と話すときの笑い話のネタとして(?)として使える…。
でしょうかね。
だるまがこのHPを作成するときには当然、Googleで「アンチパターン」を検索したのですが、ここのアンチパターンの詳細について説明しているHPは多くないようです(2007/6/16現在)。
アンチパターンについて勉強したい場合は、本を買って読んでください。
このページを作成するのに参考にしたページです。
ただし、だるまは、このページを作成するにあたり、これらのページを100%理解してから作成したわけではない(おいおい。)です。
間違い(リンク先のページではなく、このページに)があったら、ごめんなさい。
番号
著者名
書籍名
ISBN
1
結城 浩
増補改訂版Java言語で学ぶデザインパターン入門
978-4797327038
2
W.J. ブラウン (著), 3,Hays W.
McCormick (著), Raphael C. Malveau (著), Thomas J. Mowbray (著), William J.
Brown (原著), 岩谷 宏 (翻訳)
アンチパターン―ソフトウェア危篤患者の救出
978-4797321388
3
ビル ダドニー (著), ジョセフ クロザック (著), スティーブン アズベリー (著),
ケビン ウィトコフ (著), Bill Dudney (原著), Joseph Krozak (原著), Stephen Asbury (原著),
Kevin Wittkopf (原著), トップスタジオ (翻訳)
J2EEアンチパターン
978-4822281984
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メール をお願いします。
Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS
、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
UMTP は特定非営利活動法人UML モデリング推進協議会の登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。