アンチパターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

アンチパターン (: anti-pattern) とは、ある問題に対する、不適切な解決策を分類したものである [1][2]。語源は、ソフトウェア工学におけるデザインパターンである。

主に失敗した開発プロセスに焦点を当てて失敗に陥るパターンを類型化する。そうすることで、そのような事例の早期発見と対応策に関しての提案を目的とする。

競合状態が発生するソフトウェア開発や保守性の低いソースコードなどが主な例である。

アンチパターンという呼び方は、アンドリュー・ケーニッヒ英語版が1995年に作り出したもので[3]、後に書籍The patterns handbook[4]で再掲された。

ギャング・オブ・フォーの書籍『オブジェクト指向における再利用のためのデザインパターン』からヒントを得て、書籍AntiPatternsが出版され、3年後には「アンチパターン」という単語はソフトウェアの設計から一般的な社会の相互作用についても広く用いられるようになった。AntiPatternsの著者によれば、アンチパターンと単なる悪癖、悪習などと区別するには二つの要素があるという。

  • 動作やプロセス、構造についての繰り返されるパターンで、最初は有益だと思えるが、最終的に悪い結果をもたらすもので、
  • リファクタリングするための方法が存在し、文書化され、実例で証明されており、再現可能であること

数多く挙げられたアンチパターンは、矛盾した言葉侮蔑的に用いた新しい用語で呼ばれ、可能なら避けられるべき、単なる誤り、未解決の問題、悪習以上の意味を持っている。「落とし穴」や「暗黒のパターン」とも呼ばれる別の呼び方があるが、これは、悪い問題の解決策が再発明されることを指す。こうしたアンチパターンの候補は、公式にアンチパターンとは考えられない。

繰り返される間違いを記述することによって、繰り返しにつながる力学的な構造や、誤ったパターンを取り除くようリファクタリングする方法を学習することができる。

よく知られるアンチパターン[編集]

組織上のアンチパターン[編集]

分析の麻痺英語版
プロジェクトの分析段階に、不釣合いなほどの労力を費やすこと
ドル箱商品英語版
収益が上がっている古い製品に満足して、新しい製品に無頓着になること
委員会による設計英語版
多数の人間が設計に関与しているが、統一された考え方がないこと
約束の拡大英語版
後で誤っていると判っても、決定を取り消せないこと
閻魔の組織管理英語版
異議を許さない、独裁的な組織管理方法
モラル・ハザード
意思決定者が、意思決定の結果から隔離されていること
キノコ栽培的組織管理英語版
部下に情報を伝えなかったり、誤った情報を伝える(暗所で栽培する)
縦割り英語版
上下方向の情報の流れが強く、組織間のつながりを禁じる組織構造
ベンダー依存(Vendor lock-in)
外部提供のコンポーネントに極度に依存したシステム[5]

プロジェクト管理上のアンチパターン[編集]

デスマーチ(Death March)
プロジェクトが大失敗に終わることを CEO 以外全員が気づいているが、プロジェクトはデイ・ゼロ(ビッグバン)が来るまで無理やり存続させられる。あるいは、理解できない締め切りのため、従業員が深夜や休日まで勤務するよう強要される
集団思考(Group Think)
集団の各メンバーが、同意が得られそうな領域以外の考え方を避ける
手品師(ソフトウェア)英語版
未実装の機能を実装されているように見せる
ソフトウェアの肥大化(Software Bloat)
システムの後続のバージョンに、より多くの人員が必要になる

分析におけるアンチパターン[編集]

傍観者効果(Bystander apathy)
要求や設計上の判断が誤っていることに気づいた人間も、多くの人々に影響を及ぼすことになるのを恐れて、何も行動しない

ソフトウェア設計のアンチパターン[編集]

抽象化の逆転英語版
利用者に求められた機能を、外部から利用できるように実装しなかったため、同様の機能を上位の機能を使って再実装してしまうこと
あいまいな視点英語版
(通例オブジェクト指向分析設計において)表現される視点を示さずに記述されたモデル
泥団子(ソフトウェア)英語版
明確な構造を持たないシステム
石油精製工場英語版
不必要に複雑な設計
金箔 (ソフトウェア)英語版
もはや更なる開発を行っても価値が向上しない業務やプロジェクトに対して作業を継続すること
内部プラットフォーム化英語版
カスタマイズ性を持たせすぎ、基礎にしたプラットフォームの劣化したコピーとなってしまったシステム
不適切な入力英語版
正しくない入力の検出や扱いの失敗
インターフェイスの肥大化英語版
実装が極めて困難になるほどインターフェイスを強力にしてしまうこと
魔法のボタン英語版
抽象化を行わず、インタフェースコードの中でロジックを実装してしまうこと
競合状態(Race hazard)
イベントが想定と異なる順序で発生することを予見していないこと
煙突システム英語版
複雑に相互関連したコンポーネントからなる、メンテナンスが困難なシステム

オブジェクト指向設計のアンチパターン[編集]

貧血ドメインモデル英語版
ビジネスロジックが欠けたドメインモデル。オブジェクトは属性と振る舞いを持たなければならないので、オブジェクト指向プログラミングではない
スーパークラスの呼び出し英語版
サブクラスがスーパークラスのオーバーライドされたメソッドを呼び出さなければならないような設計
円-楕円問題英語版
変更できない型から変更可能な派生型を作成する際の問題
循環依存英語版
オブジェクトやモジュール間の直接的・間接的な依存関係を不必要に取り込んでしまうこと
定数インターフェイス英語版
インターフェイスを定数の定義に用いること
神オブジェクト英語版
設計の一部分(クラス)に、過剰に機能を集中させること
オブジェクトのゴミ溜め英語版
再利用に必要な(暗黙のうちの)規則に合致しない状態のオブジェクトを再利用する
オブジェクトの乱交状態英語版
内部へのアクセスを制限なく許し、適切なカプセル化に失敗する
シーケンスによる結合英語版
メソッドが特定の順序で呼び出される必要のあるクラス
ヨーヨー問題英語版
過剰な断片化により、理解するのが難しい構造(たとえば継承関係)

プログラミングのアンチパターン[編集]

偶発的な複雑性英語版
問題の解決に不要な複雑性を導入する
遠隔動作英語版
システムの大きく分散した部分同士が相互作用する
盲信英語版
バグ修正の正しさ、あるいはサブルーチンの結果を確認しないこと
ボートの碇英語版
もはや使用されていない部分をそのままにしておく
ビジーウェイト(Busy spin)
何らかの事象が発生するのを待つ際に、メッセージングを使わずに、繰り返し確認することでCPUを無駄に使用する
失敗のキャッシュ英語版
回復された後も、エラーフラグをリセットしない
カーゴ・カルト・プログラミング(Cargo cult programming)
パターンや方法論を理由を理解せずに用いる
特殊事項によるコーディング英語版
特殊なケースが認識される度に、それに対応するコードを追加する
エラーの隠蔽英語版
エラーメッセージをユーザーに通知する前に捕捉し、隠蔽したり、安全なメッセージを見せたりする
例外によるプログラミング英語版
プログラミング言語のエラー捕捉機構を、正常なプログラムのロジック記述に使用する
ハードコード英語版
システムの動作環境についての仮定を実装に埋め込む
溶岩流 (ソフトウェア)英語版
除去することが非常に困難で、結果が予測できないために悪い(冗長で品質の低い)コードを維持する[6][7]
switchとループによる順序処理英語版
順序的な処理を、swtich文を使ったループ文の中に埋め込む
マジックナンバー(Magic numbers)
説明のない数値をアルゴリズムで使用する
ソフトコード(Softcoding)
ビジネスロジックをソースコードではなく設定ファイルに格納する[8]
スパゲッティコード(Spaghetti code)
構造がほとんど理解できないようなシステム、特にコードの構造が誤っているもの

方法論のアンチパターン[編集]

コピー&ペーストプログラミング英語版
汎用的なコードを作らず、既存のコードをコピーし(改変して)使う
金のハンマー英語版
気に入った方法が、あらゆるところで利用できると思い込む(銀の弾丸も参照)
発生しないであろう現象英語版
既知のエラーを、実際に発生することはないだろうと思い込む
尚早な最適化(Premature optimization)
初期の段階から効率を追求してコーディングし、良い設計やメンテナンス性を犠牲にしてしまう。時には現実の効率も悪化させてしまう
書き直しプログラミング英語版/偶然にもとづくプログラミング
コードを徐々に修正しながら動くかどうかを確認することで、問題を解決しようとする
車輪の再発明(Reinventing the wheel)
すでに知られている適切な解決方法を採用しない
銀の弾丸(Silver bullet)
気に入った方法が、問題の大半を解決できると思い込む
テスター駆動開発英語版
新しい要求がバグ報告書で記述されるようなプロジェクト

構成管理のアンチパターン[編集]

依存関係地獄英語版
必要とする構成要素のバージョンによる問題
DLL地獄(DLL hell)
特にMicrosoft Windowsにおける、ダイナミックリンクライブラリ (DLL)の不適切な管理
機能拡張の競合英語版
Mac OS Xより前のMac OSにおいて、オペレーティングシステムの同じ箇所に複数の機能拡張を追加した際に発生する問題
JAR地獄(JAR hell)
JARファイルを使用しすぎ、Javaクラスローダーのモデルを理解しておらず、バージョンや配置場所の問題を生じる

関連項目[編集]

参考文献[編集]

  1. ^ Budgen, D. (2003). Software design. Harlow, Eng.: Addison-Wesley. pp. 225. ISBN 0-201-72219-4. http://books.google.com/books?id=bnY3vb606bAC&pg=PA225&dq=%22anti-pattern%22+date:1990-2003&lr=&as_brr=3&sig=r9gtkcqzMJILx1_JnUQ5yF1kx5s#PPA225,M1.  "As described in Long (2001), design anti-patterns are 'obvious, but wrong, solutions to recurring problems'."
  2. ^ Scott W. Ambler (1998). Process patterns: building large-scale systems using object technology. Cambridge, UK: Cambridge University Press. pp. 4. ISBN 0-521-64568-9. http://books.google.com/books?id=qJJk2yEeoZoC&pg=PA4&dq=%22anti-pattern%22+date:1990-2001&lr=&sig=NExBN4vweIRBnMfR223RG0R-dVo.  "...common approaches to solving recurring problems that prove to be ineffective. These approaches are called antipatterns."
  3. ^ Koenig, Andrew (March/April 1995). "Patterns and Antipatterns". Journal of Object-Oriented Programming 8, (1): 46?48. 
  4. ^ Rising, Linda (1998). The patterns handbook: techniques, strategies, and applications. Cambridge, U.K.: Cambridge University Press. pp. 387. ISBN 0-521-64818-1. http://books.google.com/books?id=HBAuixGMYWEC&pg=PT1&dq=0-521-64818-1&lr=&as_brr=3&sig=Fb61zp1zqrcOZYysT7QjIXsuBvo#PPA387,M1. 「アンチパターンは一般的なパターンとよく似ており、パターンが問題の解決方法を提供するが、アンチパターンは一見問題の解決方法に見えて実際はそうではない」
  5. ^ Vendor Lock-In at antipatterns.com
  6. ^ Lava Flow at antipatterns.com
  7. ^ Undocumented 'lava flow' antipatterns complicate process
  8. ^ Soft Coding

外部リンク[編集]

書籍[編集]

  • 『アンチパターン ソフトウェア危篤患者の救出』、William J. Brown (著) 、Raphael C. Malveau (著) 、Hays W."Skip" McCormick III (著) 、Thomas J. Mowbray (著) 、岩谷宏 (訳) 、ソフトバンククリエイティブ、2002年 (初版は1999年) 、ISBN 978-4797321388
  • ソフトウェア構成管理の悪夢 アンチパターン』、William J. Brown (著) 、 Scott W. Thomas (著) 、Hays W."Skip" McCormick III (著) 、岩谷宏 (訳) 、ソフトバンククリエイティブ、1999年 、ISBN 978-4797311303