💬

デバッグ前にソースコードを可視化しよう!!

2021/03/06に公開

規模の大きいプログラムを調査する前に、プログラムを可視化して
鳥瞰図を手に入れて作業を楽にしましょう。

プログラムの大まかな流れを先の押さえておくと、詳細部がより明確に分かるようになります。

さらにプログラムの複雑度などの情報を数値化しておくと、どの処理に解析時間がかかりそうか判断ができるようになります。
ソフトウェアの機能追加案件時の見積り精度を高める指標にも使えます。

今回は様々なフリーソフトを駆使して、ソースを解析してみたいと思います。

オープンソースプロジェクトの「サクラエディタ」のソースを解析を前提とします。
ソースコードは、最新のリポジトリから取得しました。
https://github.com/sakura-editor/sakura

まず、大まかなソースステップ数を調べてみましょう。
ソースコードのステップ数をカウントするツールである
「かぞえチャオ!」にてステップ数を出力してみます。
http://ciao-ware.c.ooco.jp/ft_manu.html

全ステップ数 クラス数 モジュール数
205,056 367 3,948

205,056ステップのコードとは、なかなかの規模のソフトウェアですね。

続いて、クラス間の関係性について調べてみたいと思います。

次は「Doxygen」を使って、ソースからドキュメントを生成し
クラス間の関係性を可視化してみます。

https://www.doxygen.nl/index.html

「CDocListenerEx」というクラスが様々なクラスと関係が強いことが解りました。
ツールがソースコードを解析し、自動でクラス間の関係を図示しています。
ただ、個人的な意見ですが「java」や「c#」などリフレクションやクラスローダーを使用していると
おそらく自動生成の妨げになるのでは?と思いました。

続いて「SourceMonitor」でソースコードの複雑度を調べてみます。
http://www.campwoodsw.com/sourcemonitor.html

循環的複雑度という値に着目します。

「CBackupAgent.cpp」の「Avg Complexity」の値が大きいですね。
この辺りはデバッグする際に、注意を払いながらコードを調べる必要があります。

「サイクロマチック複雑度」についての定義ですが、値が「10」以下であれば、ソースコードが読みやすい構造です。
「30」を超える場合は、早急にリファクタリングが必要な構造で、「50」を超えるとソフトウェアの構造に大きな
問題があり設計から見直す必要があります。

有償のIDEには、同等の機能が異なる名称で搭載されていたりします。
是非、使いこなしてプログラムの調査やデバッグ時間を短縮しましょう。

一定基準値を下回る質の悪いプログラムコードの納品を避けるため、発注側からコーディング規約の一環として条件が盛り込まれている場合もあります。
SIerのエンジニアにとっては、要チェック項目になります。

機会がありましたら、1つ1つのツールをもっと深堀して紹介させていただきたいと思います。

関連記事

https://menta.work/post/detail/14347/9BSOoOhvVU3D3IwUNjGF
https://menta.work/post/detail/14347/slgw1gZRzsEYS7sllBgO

Discussion