失敗パターン一覧

失敗パターン名 概要
Architecture

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

Design

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

FWべったり

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

getter/setterの利用

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

HWべったり

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

Module

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

openひとつclose複数

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

Task

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

「~メイン」や「~コモン」という名称

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

いびつな形状

モジュール構造の規則性がない。

そもそも設計していない

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

とりあえずNULL確認

インスタンスの有無をNULLチェックで行っている。

ひとつの大きなファイルが全体を制御

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

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

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

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

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

アドホックなデータ収集

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

アドホックなフラグ追加

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

インスタンスがいない

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

クラス分割の失敗

名称と属性を見ても責務が分からない。

クローン

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

グローバル変数が全体を支配している

何でも知っているグローバル変数がある。

コード断片の切り貼り

コード断片を他のモジュール内部に切り貼りしてしまう。

サイクロマチック複雑度10超

関数内の分岐が10を超えている。

システム全体の状態遷移

全体を表現する状態遷移に従ってプログラミング。

スパゲティ

関数の呼び出し構造が入り組んでいる。解きほぐせない。

タイミングチャートでの仕様

ハードウェア制御のタイミングチャート仕様のままプログラミングしてしまう。

タスク過多

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

データ競合

複数制御スレッドからのデータの取り合い。

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

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

フラグの「秘伝のたれ」化

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

フラグ判断の積み重ね

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

フローチャートでの仕様

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

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

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

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

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

メソッド名が説明的

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

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

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

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

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

レイヤーの飛び越え

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

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

アプリ層から直接最下位のドライバ層を呼び出す。

レイヤー違反

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

一枚岩

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

一筆書き

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

万能構造体

全てのデータにつながっている構造体。

上下の役割分担が曖昧

上位と下位のモジュールの役割が重複している。

下から上への逆方向依存

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

中央集権

メイン処理が巨大。200行を超える関数。

仕様通りに実装してしまう

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

何が入っているか分からない容れ物

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

何でも屋アンチパターン

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

使っていない変数の残骸

使っていない変数がある。

例外処理の多重化

例外処理の内部に他の例外処理がある。

例外処理の点在

似たような例外処理が複数個所にある。

依存線が絡みあっている

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

入口ひとつ出口複数

ひとつの関数に複数の出口(return)がある。

全体構造の欠如

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

冗長なタスク

タスクの数が多すぎる。同じ周期の処理も別タスクにしている。

処理の起点は小さいが処理の終了が広がる

時系列に処理の流れが広がる。

処理仕様とおり実装

仕様記述に従ってコーディングしてしまう。

凸凹インタフェース

粒度が不揃いなインタフェース。

分割コンパイルできない

複数のモジュールがつながっていて、モジュールの切り出しができない。

分割統治の失敗

責務分割されておらず、全てを知っているファイル(クラス)がある。

制御スレッドの途中でイベントを待つ

制御スレッドの途中で特定のイベントを待っている。

制御仕様とおり実装

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

動く関数を下から積み上げただけ

HWを動かすドライバモジュールを作って積み上げたソフトウエア

単純コマンドと複合コマンドの混在

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

同一責務の点在

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

基本処理とエラー処理が混在

基本処理の内部にエラー処理が混在している。

多重継承の乱用

責務クラスの継承と機構クラスの継承を組み合わせて使っている。

失敗パターン地図

設計実装の失敗パターンを4つに分類して図解

子クラスから親クラスへの指示

子クラスが親クラスのメソッドを呼び出す。

安定した構造がなく毎回構造が変わる

安定した構造がなく機能追加や不具合修正で構造が変わる

対称性の欠如

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

巨大な状態遷移表

状態数が10を超えている状態遷移表。

広範囲な循環依存

依存性が広い範囲で循環している。

意味のないコメント残骸

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

撮影アプリ―撮影ミドルー撮影ドライバ

アプリ層ーミドル層ードライバ層に同じ名称がある。

曖昧な責務

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

末広がり

処理の起点から徐々に処理が広がっていく。

横並びアンチパターン

多くのマネージャが林立している。

横断的関心の混在

初期化やエラー処理が、アプリの通常処理内に入り込んでいる

混ぜこぜ状態

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

状態の取りうる値が10を超えている

状態変数の項目が10を超えている。

状態仕様とおり実装

システム全体の大きな状態遷移図が有り、その通りに実装している。

状態内部で次の状態を決めている

状態内部の条件判断で次の状態を決めている。

状態迷路

状態遷移が入り組んでいる。

画面べったりアンチパターン

ユーザインタフェースがアプリ処理に接着されている。

画面操作の関数で処理を行っている

操作パネルや操作画面のフック関数の内部を作っていく。

異ドメインの混在

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

異常系の内包

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

相互依存が多い星形の依存性

モジュール間の依存関係に規則性がない。縦横無尽につながっている。

相互依存アンチパターン

2つのファイルの双方向に呼び出している。

神様データ

全てを持っているデータ構造。

統一感のない提供インタフェース

提供インタフェースの粒度がばらばら

継承の誤利用

親クラスよりも子クラスのメソッドが多い。

縦繋がりアンチパターン

モジュールの上下関係の役割分担が曖昧。

老舗温泉旅館

建造物の継ぎ足し。本館の4階が別館の1階につながっている。

脆い骨格アンチパターン

変更に弱い構造

裏取引

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

複数のリソースを無秩序に使っている

複数のリソースを、複数の制御スレッドで、無秩序に使っている。

親クラスより子クラスの責務が多い

子クラス独自の属性やメソッドがある。

走り切らない制御スレッド

制御スレッドの途中でイベント待ちループや遅延ループがある。

起床部の再帰呼び出し

制御スレッドの先頭ループを再帰的に呼び出す。

途中で待つ

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

野面積みアンチパターン

動くドライバモジュールを下から積み上げる。

関数の途中でreturn

ひとつの関数に複数のreturnがある。