自動コード フォーマット ツールを GitHub でリリース

本記事は、マイクロソフト本社の .NET Blog の記事を抄訳したものです。 【元記事】 Automatic code formatter released to GitHub 2015/02/09 9:10 AM

書式に従ってコードを書くということは、かなり面倒なものです。この記事では、Roslyn チームのソフトウェア開発者である Jared Parsonsが、これを支援するツールについて説明します。

先日、マイクロソフトはコード フォーマット ツール (英語) をリリースしました。このツールは、コード作成のガイドライン (英語) の規定に従ってコードの書式を自動的に整形するものです。Roslyn をベースに作成されており、任意の C# プロジェクトで使用できます。

clip_image001

マイクロソフトでは、スタイルの整合性を確保することはコード ベースの可読性と保守性を向上させるうえで非常に重要であると考えています。人それぞれにスタイルがあるとは思いますが、真に重要なことはスタイルに整合性を持たせることです。このため、.NET チームではチーム内で作成するすべての C# コードにスタイルのガイドラインを適用しています。

しかし、これらのスタイルは .NET がリリースされた当時から定義されているものではないため、古いコードベースの中にはこのスタイルに準拠していないものが多数あります。コーディング スタイルがプロジェクト全体で遵守されていないとそのメリットが失われますが、中核的な BCL プロジェクトのほとんどでこのような整合性のないコード ベースが見られます。

これはチームにとって長年の懸念事項となっていましたが、修正は非常に困難でした。修正が必要な箇所があまりにも多いため、無数にある C# ファイルを編集するには時間がかかりすぎるのです。

しかし、コードをオープン ソース化することが決定され、この問題は転機を迎えました。社内のチームは整合性のないコードに慣れていましたが、これをコミュニティの開発者に押し付けるわけにはいきません。最も中核的なライブラリのスタイルが、マイクロソフトの推奨するスタイルに準拠していないとなれば、協力者向けガイドラインの説得力が失われます。これはユーザーにとって好ましい事態ではないため、ツールを使用してコードを修正することにしました。

幸いにも、Roslyn プロジェクトからこの問題を解消するためのツールが提供されました。ツールの主な機能の中には非常に厳格な解析ツリーと API のセットがあり、文法的にも意味的にも支障なく扱うことができます。これは、古いソース コードを単一の統合されたスタイルに移行するうえで、まさにうってつけのツールでした。

ツールの使い方自体は簡単で、プロジェクトやソリューションでツールを指定すると、対象となるすべてのコードをシステムがコーディングスタイルの規定に従って変換します。この処理は非常に高速で、ほとんどのプロジェクトでは数秒ほど、非常に大規模なプロジェクトでも数分程度で完了します。また、何度も実行できるため、長期間にわたってスタイルの整合性を維持できます。

1.0 のころに作成された Regex コード ベースを例として、どれほど簡単に修正できるかをお見せします。

codeformatter.exe System.Text.RegularExpressions.csproj

このコマンドで、下記の Regex.cs のような古い標準やドキュメントに準拠しているコードを取得します。

/// <devdoc>
/// 正規表現の GroupNameCollection を返します。
/// このコレクションには、正規表現で使用されるキャプチャ グループの
/// 名前として定義されている文字列のセットが含まれます。
/// </devdoc>
public String[] GetGroupNames() {
    String[] result;
    if (capslist == null) {
        int max = capsize;
        result = new String[max];
        for (int i = 0; i < max; i++) {
            result[i] = Convert.ToString(i, CultureInfo.InvariantCulture);
        }
    }
    else {
        result = new String[capslist.Length];
        System.Array.Copy(capslist, 0, result, 0, capslist.Length);
    }
    return result;
}

上のコードは次のように変換されます。

/// <summary>
/// 正規表現の GroupNameCollection を返します。
/// このコレクションには、正規表現で使用されるキャプチャ グループの
/// 名前として定義されている文字列のセットが含まれます。
/// </summary>
public String[] GetGroupNames()
{
    String[] result;
    if (_capslist == null)
    {
        int max = _capsize;
        result = new String[max];
        for (int i = 0; i < max; i++)
        {
            result[i] = Convert.ToString(i, CultureInfo.InvariantCulture);
        }
    }
    else
    {
        result = new String[_capslist.Length];
        System.Array.Copy(_capslist, 0, result, 0, _capslist.Length);
    }
    return result;
}

現時点では、このツールは単純なコマンドラインのラッパーを含むライブラリに過ぎませんが、今後は Visual Studio 内での作業を含めさまざまなシナリオをサポートする予定です。このツールを使用すればスタイルの規定に反する箇所を修正することができるので、開発者は、スタイルを気にせずにコードを作成できます。

注: このツールによりコード ベースが大幅に変更される可能性があります。プロジェクト所有者に大規模なスタイル PR を提出する前に、スタイル更新の要望について所有者と連絡を取ることをお勧めします。

まとめ

このツールは GitHub の codeformatter リポジトリ (英語) で配布しています。また、コンパイル前のバイナリはこちら (英語) で配布しています。コミュニティの皆様のフィードバックおよびご協力をお待ちしております。