失敗パターン一覧

失敗パターン名 概要
Architecture

ソフトウェアの大局的構造に関する失敗パターンです。

Design

ソフトウェア開発の設計工程に関する失敗パターンです。

FWべったり

ハードウェアへのアクセス関数を、多くの個所で使っている。

getter/setterの利用

ファイル内の変数を公開して、他のファイルから利用可能にしている。

HWべったり

ハードウェアのレジスタ値が公開されていて、多くの個所で使っている。

Module

関数分割やファイル分割における失敗パターンです。

openひとつclose複数

open(入口)が一つなのに、そのclose(出口)が複数になっていること。close漏れが発生しやすくなります。

Task

タスク分割やスレッド設計に関する失敗パターンです。

「~メイン」や「~コモン」という名称で雑多な処理を呼び込む

ファイル名に「メイン」や「コモン」があることで、なんでも含めてしまう。

いびつな形状
そもそも設計していない

構造化されていない一筆書きコードやクローンコード。

とりあえずNULL確認
ひとつの大きなファイルが全体を制御している

動作シナリオがすべて一つのモジュールに入っている。中央集権。

アクティビティ図での仕様

ひとつの処理の流れのみの仕様記述であり、複数を重ね合わせないと、横断的な仕様が見えてこない。

アドホックなインスタンス生成

手続きの途中でクラスをインスタンス化すること。ライフタイムの逆転が引き起こされることがある。

アドホックなデータ収集

様々な場所から直接データを収集している。

アドホックなフラグ追加

手続きの流れの中で、特定の条件の時にフラグを立てて、別の手続きから参照する。

インスタンスがいない

ライフタイムのねじれが発生している。処理の途中でインスタンスを生成していると発生しやすい。

クラス分割の失敗
クローン

コード断片を切り貼りすること。

グローバル変数が全体を支配している
コード断片の切り貼り
サイクロマチック複雑度10超
システム全体の状態遷移
スパゲティ
タイミングチャートでの仕様
タスク過多

開発チーム単位でタスク分割されていて、並行動作で必要なタスク数を上回っている。

データ競合
パーティション違反(直交性の欠如)

機能構造の内部に横断的関心が混在している。異なるドメインの用語が一つのモジュールに混在している。

ファイルや関数の依存線が絡みあっている

ファイル間の呼出関係の規則がなく、スター形状に絡み合っている。

フラグの成り立ちを誰も知らない「秘伝のたれ」

代々伝わってきた、なぜが動くプログラム。

フラグ判断の積み重ね

フラグ変数が多く、複数のフラグの組合せの条件判断が、複数個所に存在している。

フローチャートでの仕様

処理の流れをそのままプログラムすると、構造が「ない」プログラムになってしまう。

フローチャートをそのままコード化

処理の流れをそのままプログラムすると、構造が「ない」プログラムになってしまう。

プリミティブコマンドと複合コマンドの混在

インタフェース設計で粒度が混在していること。

マネージャが多く、担当範囲が曖昧

「~マネージャ」というモジュールが横並びになると、責務分担が曖昧になってしまう。

メソッド名が説明的

クラスのメソッドが3単語以上の連結になっている。

メッセージだけで処理が決まらない

クラスの責務が曖昧で「動詞のみ」のメソッドにはならず、メソッド名で処理内容を補足説明している。

ユースケースシナリオでの仕様

ひとつの処理の流れのみの仕様記述であり、複数を重ね合わせないと、本当の仕様が見えてこない。

レイヤーの飛び越え

3層アーキテクチャで、ミドル層を飛び越えた依存性。

レイヤーを超えて、全て対処する
レイヤー違反

アプリ層⇔ミドル層⇔ドライバ層という3層構造において、下から上への逆方向依存や階層を飛び越えた依存。

一枚岩

循環依存が多く、分割コンパイルできないソースコード。

一筆書き

手続きをそのまま並べたソースコード。

万能構造体
上下の役割分担が曖昧
下から上への逆方向依存

レイヤー化において「下位が上位のサービスを利用する」という逆方向の依存性。

中央集権
仕様通りに実装してしまう

要求仕様のまま、動く関数を作ってしまう。その結果、設計構造がなく、重要なドメイン変数が肥大化してしまうこと。

何が入っているかはわからない容れもの

意味の異なる変数を、ひとつにまとめている。バンドリング結合。

何でも屋アンチパターン

「~メイン」などの名称で、雑多なことを多く引き受けている。自分自身の責務は曖昧。

使っていない変数の残骸
例外処理の多重化
例外処理の点在
入口ひとつ出口複数
全体構造の欠如

全体俯瞰の構造図が、縦横無尽の依存線になっている。

冗長なタスク
処理の起点は小さいが、処理の終了が広がる
処理仕様とおり実装
凸凹インタフェース
分割コンパイルできない
分割統治の失敗
制御スレッドの途中で特定のイベントを待っている
制御仕様とおり実装

ハードウェアのタイミングチャートを、そのままプログラミング。

動く関数を下から積み上げただけ
同一責務の点在

同じ用語を使っているクラスが点在している。

基本処理とエラー処理が混在
多重継承の乱用
失敗パターン地図
子クラスから親クラスへの指示
安定した構造がなく、毎回構造が変わる
対称性の欠如

openとclose, newとdeleteという対になる操作が、構造的に対象の位置にない。

巨大な状態遷移表
広範囲な循環依存
意味のないコメント残骸

/* とりあえず */ や /* 20210305 */ など、コード内容が伝わらないコメント。

撮影アプリ―撮影ミドルー撮影ドライバ
曖昧な責務

クラス名と変数の相関が薄い。変数が雑多であり、寄せ集めている。

末広がり
横並びアンチパターン
横断的関心の混在
混ぜこぜ状態

状態の取りうる値が意味的まとまりがない。

状態の取りうる値が10を超えている
状態仕様とおり実装
状態内部の条件判断で、次の状態を決めている
状態迷路
画面べったりアンチパターン
画面操作の関数で処理を行っている
異ドメインの混在

問題ドメインとUIドメインや通信ドメインが混在すること。基本構造が見えなくなる。

異常系の内包

正常系処理と異常系処理が混在してること。設計の基本構造が見えなくなる。

相互依存が多い星形の依存性
相互依存アンチパターン
神様データ
統一感のない提供インタフェース
継承の誤利用
縦繋がりアンチパターン
老舗温泉旅館
脆い骨格アンチパターン
裏取引

アドホックなフラグを作って、別な場所でそのフラグを判断することです。

複数のリソースを、複数の制御スレッドで、無秩序に使っている
親クラスより子クラスの責務が多い
走り切らない制御スレッド
起床部の再帰呼び出し
途中で待つ

制御スレッドの途中でイベント待ちや遅延をしてしまう。

野面積みアンチパターン
関数の途中でreturn