Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
20
Help us understand the problem. What is going on with this article?
@hakuta

C#のコードフォーマット設定を共有する方法

More than 5 years have passed since last update.

背景

UnityでC#を使って複数人で開発していてコードフォーマットが
(コーディング規約を決めてはいたものの)人によってバラバラという状況に。。。
そこでコマンドラインからドバーッとコード整形できるツールを探していたところ
Artistic Styleというものが中々よさげだったので紹介したいと思います。

Artistic Styleとは

コマンドラインから実行できるコードフォーマッター。
macでのinstall方法はこちら => http://astyle.sourceforge.net/install.html#_Mac_OS_X_Version

使い方

astyle path/to/target_file
astyle --style=allman path/to/target_file # allmanスタイルで整形
astyle -bps4 # -b -p -s4 を指定したのと同じ
astyle --options=path/to/option_file # 任意のオプションファイル読み込み 

オプションの指定方法は引数を渡す方法と
オプションファイルを設定する方法があります。
オプションファイルは~/.asytlercに書いておくか、
--options=path/to/option_fileで任意の場所のファイルを指定できます。

設定例

microsoftのC#のコーディング規約( https://msdn.microsoft.com/ja-jp/library/ff926074.aspx )
に近くなるように色々試して設定してみた例を書いときます

# c#のファイルとして認識する
mode=cs
# allmanスタイルにする
style=allman
# インデントにタブを使う
indent=tab=4
# 継続行のインデントにもタブを使う(但し偶数個のタブでないときはwhite spaceで埋められる)
indent=force-tab=4
# namespace文の中をインデントする
indent-namespaces
# switch文の中をインデントする
indent-switches
# case文の中をインデントする
indent-cases
# 1行ブロックを許可する
keep-one-line-blocks
# 1行文を許可する
keep-one-line-statements
# プリプロセッサをソースコード内のインデントと合わせる
indent-preproc-cond
# if, while, switchの後にpaddingを入れる
pad-header
# 演算子の前後にpaddingを入れる
pad-oper
# originalファイルを生成しない
suffix=none
# if, for, while文の前後に空行を入れる
break-blocks
# コメントもインデントする
indent-col1-comments

自分のプロジェクトに応じて、色々と設定を変更してみると良いと思います!

ビフォーアフター

適当につくったファイルに対してasytleを適用してみます。

ビフォー

using System;

namespace test {
class MainClass {
    public static void Main(string[] args) {
        int localVariable1=1;

        bool isEnabled = false;
        if (isEnabled) {
#if FALSE
//dosomething
            #else
//dosomething
            #endif
            Console.WriteLine("is enabled");
        } else {
            Console.WriteLine("is not enabled");
        }
            if (isEnabled) { Console.WriteLine("one line if statement.");}
        for(int i=0; i<10; i++)
    {
                Console.WriteLine(i.ToString());
            }
            switch(localVariable1)
            {
                case 1:
                    int localVariable2 = 2;
                    localVariable2 += localVariable1;
                Console.WriteLine("localVariable2 = " + localVariable2.ToString());
                    break;
                default:
                break;
            }
}
}
}

アフター

using System;

namespace test
{ // <= allmanスタイルの字下げスタイルが適用されてる
    class MainClass // <= indent-namespacesでnamespace内がインデントされてる
    {
        public static void Main(string[] args)
        {
            int localVariable1 = 1; // <= pad-operで = の前後に空白が入ってる

            bool isEnabled = false;

            if (isEnabled) // <= break-blocksでif文の前後に空白行が入ってる
            {
                #if FALSE // <= indent-preproc-condでインデントされてる
                //dosomething // <= indent-col1-commentsでインデントされてる
                #else
                //dosomething
                #endif
                Console.WriteLine("is enabled");
            }
            else
            {
                Console.WriteLine("is not enabled");
            }

            if (isEnabled) { Console.WriteLine("one line if statement.");} // <= keep-one-line-statementsで1行if文はそのまま

            for (int i = 0; i < 10; i++) // <= pad-headerでforの後に空白が入ってる
            {
                Console.WriteLine(i.ToString());
            }

            switch (localVariable1)
            {
                case 1: // <= indent-switchesでswitch文内がインデントされてる
                    int localVariable2 = 2; // <= indent-casesでcase文内がインデントされてる
                    localVariable2 += localVariable1;
                    Console.WriteLine("localVariable2 = " + localVariable2.ToString());
                    break;

                default:
                    break;
            }
        }
    }
}

大分見やすくなりました!
あとはこれをgitのpre-commitフックとかに仕掛けとけばコードフォーマットが綺麗に保たれるはず!

20
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hakuta
alu-inc
アルは、マンガファンがもっとマンガを楽しめるサービスを作るために立ち上げられた、テクノロジー企業です。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
20
Help us understand the problem. What is going on with this article?