失敗パターン一覧
失敗パターン名 | 概要 |
---|---|
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 |