Perl Hackers Hub

第8回 Perlによる大規模システム開発・設計のツボ(3)

この記事を読むのに必要な時間:およそ 2 分

コンポーネント横断の負債指数

コンポーネント内部の設計上の負債の次は,コンポーネント間でのつながり方に注目して,システム全体にとっての負債を計測します。

内向きの結合度

まずは内向きの結合度です。内向きの結合度(Ca)は次の数で表されます。

  • Ca= コンポーネントAのモジュールをコンポーネントA外部で利用している数

これは,次のような簡単なコマンドで探すことができます。

$ ack -l App::Hoge | grep -v lib/App/Hoge

上記のコマンドで得られる行数を内向きの結合度と定義します。これは,そのコンポーネントの重要さ(ほかのコンポーネントから必要とされているか)を表します。

外向きの結合度

外向きの結合度は,内向きの結合度の逆です。どれだけそのコンポーネントが外部のコンポーネントを必要としているか(Ce)を割り出します。

  • Ce= コンポーネントA内部でコンポーネントA以外のモジュールを利用している数

これは,各モジュール内のuse定義やuse baseなどをパースして,<<common library>>や<<framework>>,<<service>>に該当するコンポーネントを除く,ほかのコンポーネントに属するモジュールの数として取得します。

この値が大きいコンポーネントほど,ほかのコンポーネントの正常な動作を前提にしていると言えます。

システム全体にとっての負債指数の計算

これらの内向き結合度と外向き結合度から,一般に次の式で不安定度(I)を計算できます。

  • I=Ce/(Ca+Ce)

この値は,不安定度が小さいコンポーネントから大きいコンポーネントをuseすべきでないといった判断をするために用いることができます。しかし,0~1の比の値であるので,一律に大きさを比べることができません。そのため,システム全体で設計上の負債となっている程度を表すには不適です。

そこで,システム全体にとってのあるコンポーネントの負債の度合い(Couple)は,次のような指標で評価しています。

  • Couple=Ca×Ce

Coupleは,より重要なコンポーネントでありながら,より多くのコンポーネントに依存しているほど大きな値となります。たとえば,<<common library>>に属しているコンポーネントであれば,特定の<<application>>に依存した処理をしていることがないように設計する必要があるので,この値は0であることが望まれます。逆に多くのコンポーネントから利用されていながら,ほかの多くの<<application>>に依存した処理を実装していれば,大きな値となってしまい,設計を見直す必要があることがわかります。

品質評価の意味

今まで見てきたコードの品質評価は,あくまで改善や技術的負債を定量的に「見える化」するためのもので,個々のエンジニアを非難するためのものではありません。

数値化やポリシーの設計によって,改善のための道筋がわかりやすくなり,規模が大きくなったソフトウェアであっても継続的に良いものを作り上げるための手助けになります。

まとめ

本稿で紹介したことは,プロダクトの規模や状況,開発者数などによって最適解が異なるものばかりです。みなさんのプロダクトや言語,コーディングスタイルに適しているかどうかは,適宜判断してください。

重要なことは,ミクロな関数やコメントの記述から,システム全体の密結合性に至るまで,俯瞰的(ふかんてき)にコーディングやコラボレーションに対するポリシーを持つことです。そうすると,個々人の審美眼に頼らずとも,より大きなプロダクトであっても柔軟で高速な開発が可能になります。

次回の執筆者は嶋田裕二(xaicron)さんで,テーマは「PerlによるWeb API実装」を予定しています。お楽しみに。

著者プロフィール

広木大地(ひろきだいち)

筑波大学大学院卒業後,2008年度に新卒として株式会社ミクシィに入社。

広告システムの開発に従事したのち,システム本部たんぽぽ開発グループに所属。現在は「刺身の上にたんぽぽを乗せる仕事」を撲滅するべく,サービスアーキテクチャの設計/開発や技術者教育などを担当している。

YAPC::Asia 2010にて,mixiのアーキテクチャについての発表を行った。