プログラミングの複雑性(またはソフトウェアの複雑性)とは、内部的な相互作用に影響を与えるソフトウェアの特性を含む用語です。多くの論者は、「複雑」と「入り組んだ」という用語を区別しています。入り組んだとは、理解するのが難しいものの、最終的には把握できることを意味します。一方、入り組んだとは、エンティティ間の相互作用を表します。エンティティの数が増えるにつれて、それらの間の相互作用の数は指数関数的に増加するため、それらすべてを把握し理解することは不可能になります。同様に、ソフトウェアの複雑性が高まると、意図せず相互作用に干渉するリスクが高まり、ソフトウェアを変更する際に欠陥が発生するリスクも高まります。極端な場合、ソフトウェアの変更が事実上不可能になることもあります。
ソフトウェアの複雑性と保守性を結びつけるという考え方は、ソフトウェア進化の法則を開発したマニー・レーマン教授によって広く研究されてきました。彼と共著者のレス・ベラディは、ソフトウェアの状態を測定するために使用できる多数のソフトウェアメトリクスを研究し、最終的に、唯一の実用的な解決策は決定論的複雑性モデルを使用することであると結論付けました。[ 1 ]
種類
既存プログラムの複雑さが、プログラム変更の複雑さを決定します。問題の複雑さは、次の 2 つのカテゴリに分類できます。[ 2 ]
- 偶発的な複雑性とは、ソフトウェアエンジニアリングツールに起因するプログラマーの困難を指します。より優れたツールセットや高水準プログラミング言語を選択することで、これを軽減できる可能性があります。偶発的な複雑性は、ソリューションの形式をドメインに基づいて決定しないことから生じる場合が多いです。ドメイン駆動設計は、偶発的な複雑性を最小限に抑えるのに役立ちます。
- 本質的な複雑さは、解決すべき問題の特性によって生じるものであり、軽減することはできない。
対策
ソフトウェアの複雑性を測定するためのいくつかの指標が提案されている。これらの多くは、複雑性を適切に表現するものの、容易に測定できるものではない。より一般的に使用されている指標には以下のようなものがある。
- マッケイブの循環的複雑度指標
- ハルステッドのソフトウェアサイエンス指標
- HenryとKafuraは1981年に「情報フローに基づくソフトウェア構造メトリクス」[ 3 ]を導入し、複雑さを「ファンイン」と「ファンアウト」の関数として測定しました。彼らは、プロシージャのファンインを、そのプロシージャへのローカルフローの数と、そのプロシージャが情報を取得するデータ構造の数の合計として定義しています。ファンアウトは、そのプロシージャからのローカルフローの数と、そのプロシージャが更新するデータ構造の数の合計として定義されます。ローカルフローは、問題のプロシージャを呼び出す、または問題のプロシージャから呼び出されるプロシージャに渡されるデータと、そのプロシージャから渡されるデータに関連しています。HenryとKafuraの複雑性値は、「プロシージャの長さにファンインの2乗とファンアウトの2乗を掛けたもの」として定義されます(長さ×(ファンイン×ファンアウト)²)。
- チダンバーとケメラーは1994年に「オブジェクト指向設計のためのメトリクススイート」[ 4 ]を発表し、オブジェクト指向コードのメトリクスに焦点を当てました。彼らは6つのOO複雑性メトリクスを導入しました。(1)クラスあたりの重み付きメソッド、(2)オブジェクトクラス間の結合度、(3)クラスの応答性、(4)子の数、(5)継承ツリーの深さ、(6)メソッドの凝集度の欠如。
プログラミングの複雑さを測定するために、他にもいくつかの指標を用いることができます。
- 分岐の複雑さ(スニード指標)
- データアクセス複雑度(カードメトリック)
- データ複雑度(チャピン・メトリック)
- データフローの複雑性(エルショフ指標)
- 意思決定の複雑性(マクルーア指標)
- パス複雑度(Bangメトリック)
テスラーの法則とは、人間とコンピュータの相互作用に関する格言で、あらゆるアプリケーションには、取り除いたり隠したりできない固有の複雑さが存在するというものである。
参考文献
- ↑ MM Lehmam LA Belady; プログラム進化 - ソフトウェア変更のプロセス 1985
- ↑ソフトウェアエンジニアリングでは、問題は偶発的複雑性と本質的複雑性に分けられる[1]。
- ↑ Henry, S.; Kafura, D. IEEE Transactions on Software Engineering Volume SE-7, Issue 5, Sept. 1981 Page(s): 510 - 518
- 1 2 Chidamber, SR; Kemerer, CF IEEE Transactions on Software Engineering 第20巻、第6号、1994年6月、476 - 493ページ