Last Updated 2011/09/21
Visual Studio 2008/2010 のメニューの [編集]-[詳細] の中に、[ドキュメントのフォーマット] と [選択範囲のフォーマット] という項目があります。Visual Studio のヘルプに解説がないので、気付きませんでしたが、これはソースコードを整形する機能を提供します。そこで、このページではソースコードの整形について書いてみたいと思います。なお、この機能は C# のコードおよび XML に対してのみ有効です。
WEB サイトをうろついていると、これはと思う公開されたソースコードに出くわすものです。これはようさそうだと考え、さっそくダウンロードし、Visual Studio に読み込んでみてガッカリすることがよくあります。他人が書いたコードは元々読みにくいものですが、読みにくさの前に読むこと自体に疲れるようなコードがあるからです。
以下は私が見たことのあるコードをまねて、私自身が書いたコードを修正したものです。このコードで問題ないという人もいるでしょうが、私は風通しのいいほうを好みます。
private void DoExecute(string text) { if(this.GetStringByteCount(text)<=FLimit) FStringList.Add(text); else { int index; while(true) { index = this.GetLimitColumnIndex(text); // 折り返し位置が行頭禁止文字であるかぎり、インデックスを戻す while (Array.IndexOf(NOT_HEAD_CHARS,text[index+1])>=0) --index; // 行頭禁止文字ではない文字の 1 つ手前の文字が行末禁止文字の場合はさらにインデックスを戻す while (Array.IndexOf(NOT_TAIL_CHARS,text[index])>=0) --index; FStringList.Add(text.Substring(0,index+1)); text=text.Substring(index+1,text.Length-index-1); if (this.GetStringByteCount(text)<=FLimit) { FStringList.Add(text); break; } } } }
ソースコードの形式でもっとも影響のある要素は中カッコ "{ }" の扱い方でしょう。十人十色とはよくいったもので、いろいろなバリエーションがあります。しかし、これについてはどういうわけか Microsoft と Borland との意見は一致しています。それは次のような形式です。
if (condition) { ... }
つまり、開くカッコは次の行に置きます。Visual Studio の C# のテンプレートコードはそうなっていますよね。
次の形式も支持者が多いですね。
if (condition) { ... }
開くカッコを条件式と同じ行に書く形式です。そのほかにも次のような形式もあります。
if (condition) if (condition) { { ... ... } }
左側は意外に支持者が多いのは長年の疑問でしたが、ふとしたことから気付きました。Petzold 本として知られる Windows 3.1 時代 の Windows プログラミング関係の名著がありますが、そのサンプルコードがそうなっています。この本の影響を受けた人は多いですからマネする人がたくさんいるということなのだと思います。ちなみに、Petzold は .Net Framework 関係の本も書いていますが、この形式のコードはやめて、標準的(?)な形式にしています。
丸カッコの前後にスペースを入れる人と入れない人がいますね。私は入れないタイプです。
if ((a + b > c) || (x * y < z)) if ( ( a + b> c ) || ( x * y < z ) ) { { ... ... } }
算術演算子などの演算子の前後にスペースを入れない人がいますが、私は入れたいですね。Visual Basic では自動的に整形してくれます。
if ((a + b > c) || (x * y < z)) if ((a+b>c)||(x*y<z)) { { ... ... } }
さて、ここからが本題ですが、Visual Studio の機能について解説します。とりあえず、どんなことができるかを見てもらいましょう。先に紹介したコードを Visual Studio の [編集]-[詳細]-[ドキュメントのフォーマット] を使った結果を以下に示します。
private void DoExecute(string text) { if (this.GetStringByteCount(text) <= FLimit) FStringList.Add(text); else { int index; while (true) { index = this.GetLimitColumnIndex(text); // 折り返し位置が行頭禁止文字であるかぎり、インデックスを戻す while (Array.IndexOf(NOT_HEAD_CHARS, text[index + 1]) <= 0) --index; // 行頭禁止文字ではない文字の 1 つ手前の文字が行末禁止文字の場合はさらにインデックスを戻す while (Array.IndexOf(NOT_TAIL_CHARS, text[index]) <= 0) --index; FStringList.Add(text.Substring(0, index + 1)); text = text.Substring(index + 1, text.Length - index - 1); if (this.GetStringByteCount(text) <= FLimit) { FStringList.Add(text); break; } } } }
中カッコ "{ }" の位置、丸カッコ前後のスペース、演算子の前後のスペースなどを見てください。また、インデントは Visual Studio のオプションで指定した [Tab] あたり 2 スペースになっています。これは私好みの整形方法ですので、私は満足できるレベルにあると思います。
逆の操作、つまり、整形後のコードを整形前のコードに変換したい人は Visual Studio の設定を変更しなければなりません。[ツール]-[オプション]-[テキストエディタ]-[C#]-[書式指定] がそうです。この中の [インデント]、[改行]、[行間]、[折り返し] の各項目の設定を変えてみてください。各項目の設定によってコードがどのように変化するかをプレビューする機能が付いていますので、設定の内容によってどのような効果があるかをビジュアルに確認することができます。たとえば、 [行間] の「メソッド名と始めかっこの間にスペースを挿入する」にフォーカスを与えると、そのプレビューは次のようになります。
int Method() { return 3; }
この項目にチェックを入れると、以下のようになります。
int Method () ← Method と ( との間にスペースを挿入する { return 3; }
Visual Studio の機能で満足できない人は別のツールを考えなければなりません。「ソースコードの整形」で Google をあたるといくつかのツールが見つかります。ソースコード付きで公開されているものもありますので、興味のある人はあたってみてください。有料のツールもあります。
特におすすめというわけではありませんが、ソースコードを公開している Artistic style というツールがあります。以下のサイトに行ってください。
http://www.6809.net/tenk/html/lib/doc/astyle_j.htm
ツール系のアプリケーションはたいていの場合、コンソールアプリケーションになっていますが、Astyle もその例にもれません。したがって、オプションの設定が面倒なのが欠点です。ソースコードは C++ ですので、それにならって自作する手もあるかもしれません。
なお、Visual Studio 自身の機能の中にソースコードを整形する機能があります。ソースコードの整形のページをご覧ください。
−以上−