InfoQ

InfoQ

Articles

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

.NET コード解析について Patrick Smacchia氏に聞く

作者 Robert Bazinet , 翻訳者 伊藤 幸博 投稿日 2009年3月31日

セクション
プロセス/プラクティス,
デベロップメント,
設計/アーキテクチャ
トピック
コード分析 ,
.NET
タグ
Refactoring ,
Coding Standards ,
Code Coverage

Patrick Smacchia氏は15年余りの間ソフトウェア開発に携わってきた Visual C# の MVP です。彼は現場での経験から着想した .NET プラットフォームに関する書籍である Practical .NET 2 and C# 2 の著者です。数学および計算機科学の学位取得後、彼は Societe Generale 社での証券取引、Amadeus 社での航空券予約システム、さらに Alcatel 社での衛星基地局など様々な分野でソフトウェア開発を手がけてきました。現在彼は NDepend というツールの主導的な開発者です。

Rob Bazinet (RB): NDepend とは何でしょうか?

Patrick Smacchia (PS): NDepend は .NET 開発者およびアーキテクトのためのツールです。コードベースはとても複雑なものですが、NDepened はソースコードからの情報の取得を手助けするツールです。例えば、NDepened を使ってあなたのコードベースが正しく階層化されているかどうかを知ったり、前回のリリースから何が変更されたかを把握したり、あるいは従来のツールでは何時間あるいは何日もかかっていたかも知れないような、コードの品質の評価を行って即座に何らかのタスクを提示するといったことが可能です。

RB: どうやって NDpened のアイデアを思い付いたのですか?

PS: 5年前、私は巨大かつ低質なコードベースのコンサルティングに取り組んでいました。同じ頃、私は Robert C Martin氏による素晴らしい著書 Agile Software Development, Principles, Patterns, and Practices(リンク) を読んでいました。その本はコードベースのコンポーネント化を評価するいくつかのクールなメトリクスについて解説しています。 

当時私は C++ から .NET へと移行していた頃で、C++ の RTTI よりもずっと有力な System.Reflection の方が好みだと思うものの1つでした。それで当然のように、その巨大で低質なコードベースに対して Martin のメトリクスが何を示すのかを確かめるため、Reflection に基づいたちょっとしたツールの開発を始めました。後にそのツールを OSS 化し、その機能に対する多くの需要からそれは徐々にポピュラーになっていきました。そこで、私はもしこのツールが視覚化とクエリ処理の機能をサポートすれば、コードの複雑性にどう取り扱うのかという新しいステップを示す事ができるのではないかと気づきました。

RB: NDepend はコード記述のタスクおよび/あるいは開発のライフサイクルにおいてどのように役立ちますか?

PS: NDepend はリファクタリング、コードレビュー、コード品質のチェックと向上、設計浸食の検査、コードの調査、コードの閲覧、ビルドプロセスルールの励行といった様々なタスクにおいて非常に役立ちます。

NDpenend は依存関係マトリクスパネルと '箱と矢印' グラフの生成によってコンポーネント、名前空間、クラス、・・・等々の依存関係を表示することができるため、コードのリファクタリングにおいても有用です。

NDepend はコード品質の評価に利用可能な60以上のコードメトリクスをサポートしています。

NDepend の解析プロセスは MSBuild あるいは NAnt のビルドプロセスに統合することができます。解析が実行される度にビルドプロセスの健全性に関するレポートが出力されます。

コード構造クエリ専用の言語 (Code Query Language, CQL) によって、開発者は自身のコードベースに関するどのような種類の質問も問い合わせる事ができます。

  • どのクラスが IDisposable を実装しているか?
    SELECT TYPES WHERE IsClass AND Implements "System.IDisposable"
  • どの公開メソッドが非公開として宣言可能か?
    SELECT METHODS WHERE IsPublic AND CouldBePrivate
  • どのメソッドがあるフィールドに値を割り当てているか?
    SELECT METHODS WHERE IsDirectlyWriting "MyNamespace.MyClass.m_Field"
  • 複雑なメソッドのうちどれが十分にコメントが記述されていないか?
    SELECT METHODS WHERE CyclomaticComplexity > 15 AND PercentageComment < 20

この CQL 言語はビルド毎にチェック可能なルールを定義するためにも使用できます。何らかのルール違反があった場合は、ユーザはレポートからその通知を受けます。NDepend には50以上のあらかじめ定義されたルールがあり、またユーザが以下のようにカスタムなルールをシームレスに定義できるように設計されています。

  • 静的フィールドは m_XXX と命名されてはならない(カスタム命名規約)。
    WARN IF Count > 0 IN SELECT FIELDS WHERE NameLike "^m_" AND IsStatic
  • ユーザインターフェイス層をデータベース層に直接依存させたくない。
    WARN IF Count > 0 IN SELECT NAMESPACES WHERE IsDirectlyUsing "DataLayer" AND NameIs "UILayer"
  • MyAssembly および MyAssembly2 以外のアセンブリのメソッドのコードは30行を超えてはならない。
    WARN IF Count > 0 IN SELECT METHODS OUT OF ASSEMBLIES "MyAssembly1", "MyAssembly2" WHERE NbLinesOfCode > 30

NDepend は2つのバージョンのコードベースを比較するのに利用できます。この機能は特に新バージョンをリリースする場合やスモークテストやコードレビューにおいて変更点に注目したい場合に役立ちます。また CQL 言語は差分を調査するのにきわめて役に立ちます。例えば、2つのビルドの間で変更されているメソッドをリスト化するには、単に以下のように記述するだけです。

  • SELECT METHODS WHERE CodeWasChanged

最後に、NDepend は Visual Studio 2005 と 2008 のアドインおよび Reflector のアドインとして提供され、これらのツール上からその機能にアクセスすることができます。

RB: どうすれば NDepend を使い始めることができますか?おすすめの手順は?

PS: まずは NDepend をダウンロードしてあなたのコードベースを解析してください。VisualNDepend UI は Visual Studio と全く同じルック&フィールとなるように洗練されていますので、シームレスに実行できるはずです。

解析が完了すると、VisualNDepend UI は解析結果を閲覧するためのパネルをいくつか表示します。この時点でユーザは依存関係を閲覧するのか、メトリクスを閲覧するのか、CQL 言語を用いてコードベースに対するクエリを実行するのか、2つの解析結果を比較するのか、・・・等々を選択する必要があります。各機能には大抵それぞれ専用のパネルがあります。いくつかの '事始め' の説明を含む埋め込みのヘルプ欄もあります。スクリーンキャストもいくつかリンクされています。それらはそれぞれ特定のタスクの実行方法を説明しています。最後に、私たちのウェブサイトには完全な CQL の仕様などの詳細な文書が記載されています。

一度各機能をマスターすれば、コードベースのレビューや合理化のためにそれらを取り混ぜて利用できるようになります。

RB: NDepend は .NET Framework 3.5 に対応していますか?3.0 は?

PS: はい、 新しい NDepend のバージョン 2.6 の Visual Studio アドインは Visual Studio 2008 に対応しています。また NDepend は .NET 3.5 および 3.0 のアセンブリの解析が可能です。

RB: NDepend は .NET 言語用の製品ですが、今後 .NET 以外のプラットフォームに対応する予定はありますか?動的コードベース解析への対応の予定はありますか?

PS: はい。NDepend は C# で記述されていますが、そのうち .NET コードの解析に特化しているコードは5%だけです。これは95%のコードは解析対象コードのプラットフォームから抽象化されていることを意味しています。これに関連して、協力会社の OCTO Technoloy 社(リンク)が今現在 Java のコードを解析可能なバージョンの NDepend を開発しています。ソフトウェアや情報システムアーキテクチャに重点的に取り組んでいるフランスの企業である OCTO Technology 社は、Java および .NET の専門家たちで構成されるコンサルタント会社です。OCTO 社の .NET コンサルタントたちは NDepend がお気に入りで、と同時に Java コンサルタントたちが同じようなツールを求めていました。それで私たちは協力関係を結ぶことを決定しました。

XDepend プロジェクト(NDepend の Java 版)のベータ版が2008年の第1四半期中に利用可能となる予定です。

RB: NDepend によるコード解析を習得するのは難しそうにも思えますが、ユーザのためのチュートリアルや手引書などはありますか?

PS: VisualNDepend UI にはいくつか '事始め' の説明を含んだ埋め込みのヘルプ欄もありますし、またスクリーンキャストもいくつかリンクされています。www.ndepend.com/GettingStarted.aspx には取っ掛かりとなるいくつかの3分間のスクリーンキャストがあります。他にも主なユースケースシナリオを解説したいくつかのスクリーンキャストがメインページ(リンク)から参照されています。さらにその先へと踏み込むため、ドキュメンテーションの項では例えば完全な CQL の仕様書(リンク)、全てのメトリクス(リンク)に関する説明、そして Scott Hanselman氏(リンク)、Stuart Celarier氏および Patick Cauldwell氏(リンク)による要約ポスター「テーブルマット見える化名人の PDF」(PDF)などの文書も提供しています。また私は http://codebetter.com/blogs/patricksmacchia/default.aspx で NDepend の高度な使用方法を説明するブログ記事を定期的に配信しています。

RB: ソフトウェアチームを立ち上げてすぐに活動できるようなトレーニングは提供していますか?

PS: 私たちはたまにエンタープライズライセンスを発注していただいて特別なトレーニングを望まれた顧客を訪問しています。トレーニングは主要な活動ではないのですが、私たちはそれを続けていきたいと考えています。ユーザと直に接することでとても参考になることがあります。この製品にはユーザからのフィードバックによる機能が満載です。

RB: NDepend で最も強力な、もしくは最高の機能は何だと思われますか?またそれはなぜですか?

PS: 難しい質問ですが、実のところ私たちは NDepend のコード記述に NDepend を大いに利用しています。個人的に私は依存関係を閲覧してアーキテクチャをきれいに保つためにマトリクスを毎日利用しています。私たちは恒久的にコード品質の手入れを行うための400以上の CQL ルールを保持しています。また私は比較機能の中毒者でもあります。変更中のコードをレビューするためにそれを頻繁に利用しています。私は本当に、悪魔は変化の中にある、と信じていますから。

良かったのは、このような作業が奏功して私たちの開発プロセスは大幅に改善され、持続可能なリズムで新しいバージョンをリリースできているということです。詳細は私たちのリリースノート(リンク)で知ることができます。

RB: Patrick さん、本日は貴重なお時間を割いていただき NDepend について教えてくださって本当にありがとうございました。

NDepend に関する詳細は NDepend のウェブサイト(リンク)を参照してください。Ptrick氏についてより詳しいことは彼のブログで知ることができます。

 

原文はこちらです:http://www.infoq.com/articles/patrick-smacchia-interview
(このArticleは2008年1月7日に原文が掲載されました)

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。