ブログ 約4分

C++プロジェクトの内部を探る:POCOケーススタディ

Share this article
C++プロジェクトの内部を探る:POCOケーススタディ

The POCO C++ ライブラリは、C++でネットワーク中心のポータブルアプリケーションを開発するためのオープンソースクラスライブラリ集です。

POCOは POrtable COmponents の略です。これらのライブラリは、スレッド、スレッド同期、ファイルシステムアクセス、ストリーム、共有ライブラリとクラスロード、ソケットとネットワークプロトコル(HTTP、FTP、SMTP など)の機能を提供します。さらに、HTTPサーバー、SAX2およびDOMインターフェースを備えたXMLパーサー、SQLデータベースアクセスも含まれています。

モジュール式で効率的な設計と実装により、POCO C++ライブラリは組み込み開発に適しています。

それでは、 CppDepend を使ってPOCOの内部を見て、その実装と設計に関するいくつかの事実を探ってみましょう。

POCOの実装

コード行数

コード行数の多いメソッドは、理解も保守も難しくなります。60行を超えるメソッドを検索してみましょう。

60行を超えるメソッドは1%未満です。

循環的複雑度

循環的複雑度は広く使われている手続き型ソフトウェアメトリクスで、プロシージャ内で取り得る判定の数に等しくなります。

リファクタリングすべきメソッドを検出するため、次のCQLinqクエリを実行してみましょう。

結果として、複雑と見なせるメソッドは1%だけです。

複雑でありながら、ドキュメントが不十分なメソッドはどれでしょうか。

変数の多いメソッド

NbVariables が8を超えるメソッドは、理解と保守が難しくなります。NbVariables が15を超えるメソッドは非常に複雑であり、より小さなメソッドに分割すべきです(ツールによって自動生成された場合を除きます)。

変数が多すぎるメソッドは8個だけです。

メソッドとフィールドの多い型

メソッドが多い型は3%だけです。

フィールドについても同じ検索ができます。

フィールドが多い型は1%未満です。

POCOは適切に実装されていると結論付けられます。複雑と見なされるメソッドは少なく、型はシンプルでメソッドとフィールドも比較的少なく、コードには十分なドキュメントが付いています。

設計

抽象度 vs 不安定度

「Abstractness vs Instability」グラフは、保守や進化が難しいプロジェクトを検出するのに役立ちます。次の 記事 では、このグラフの有用性と、設計改善に活用する方法が説明されています。

POCOの「Abstractness vs Instability」グラフを次に示します。

Zone of Pain 内にあるのは Foundation だけです。これは、ほかのプロジェクトから多用されていることを考えれば理解できます。

継承

多重継承は複雑さを増大させるため、慎重に使う必要があります。

基底クラスの多いクラスを検索してみましょう。

青い長方形が結果を表します。

複数のクラスから派生しているクラスはごくわずかです。

型の凝集度

単一責任の原則は、クラスが変更される理由を1つだけ持つべきだと述べています。このようなクラスは凝集度が高いと言われます。一般に、高いLCOM値は凝集度の低いクラスを示します。LCOMには複数のメトリクスがあります。LCOMは [0-1] の範囲の値を取ります。LCOMHS(HSはHenderson-Sellersの略)は [0-2] の範囲の値を取ります。LCOMHSメトリクスは、非凝集型を検出するうえでより効果的と見なされることが多い点に注意してください。LCOMHS値が1を超える場合は、要注意と見なすべきです。

非凝集と見なされる型は1%だけです。

求心性結合度(Efferent coupling)

特定の型の求心性結合度は、その型が直接依存している型の数です。TypeCe > 50 の型は、ほかの型に過度に依存しています。これらは複雑で、複数の責務を持っており、リファクタリングの良い候補です。

次のCQLinqクエリを実行してみましょう。

結果は空です。つまり、多くの責務を持つクラスはありません。

最もよく使われる型

どの型が最も頻繁に使われているかを知ることは有用です。そのために、TypeRankメトリクスを使えます。

TypeRank値は、Google PageRank アルゴリズムを型の依存関係グラフに適用して計算されます。平均TypeRankが1になるよう、中心0.15の相似変換が適用されます。

TypeRankの高い型は、バグがより重大な影響を及ぼす可能性が高いため、より慎重にテストすべきです。

頻繁に使われていて、かつ複雑な型を検索してみましょう。

結果は空です。つまり、頻繁に使われていて複雑でもあるクラスはありません。

レイヤリングとレベルメトリクス

この 記事 では、レベルメトリクスと、それを設計改善に活用する方法が説明されています。

依存関係サイクルを検索してみましょう。そのために、次のCQLinqクエリを実行できます。

依存関係サイクルに関与しているメソッドはごくわずかです。例としてZipプロジェクトを取り上げ、その依存関係グラフを見てみましょう。

このプロジェクトには依存関係サイクルが1つだけ存在します。

結論として、POCOは設計面でも優れています。凝集度が高く、疎結合です。

Share this article