47
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

#regionを使わないほうがよい3つの理由と1つの例外

Last updated at Posted at 2019-09-19

#regionとは何

#regionは、IDE(VisualStudio)上でコードを折りたたむための機能です。
以下のようなコードを書くと、

HogeForm.cs
public class HogeForm : Form
{
    #region Member variables
    private string _currentStatus = "";
    private bool _isInitialized = false;
    #endregion

    #region Constructor
    public HogeForm()
    {
        InitializeComponent();
    }
    #endregion

    #region Event Handlers
    public void Hoge_Load()
    {
        // Process something
    }
    #endregion
}

VisualStudio上では下図のようにコードが折りたたまれます。
#regionはクラス内のメンバの分類や、メソッド内の処理の区切りとして、コードの可読性を上げるために使用されます。
image.png

使わないほうがいい理由

用途があいまい

単にコードを折りたたむだけの機能なので、コードのブロック単位を無視した使い方ができます。
コード規約で縛るのであればまだしも、無秩序に使われると可読性が逆に低下します。

例えばこんなコードは

Huga.cs
public class Huga
{
    #region Member variables
    private string _initialValue;
    #endregion

    #region Public methods
    public bool SetInitialValue(string value)
    {
        #region Check input
        if (string.IsNullOrEmpty(_initialValue))
        {
            return false;
        }
        #endregion
        #region Set value
        _initialValue = value;
        #endregion
        return true;
    }
    #endregion
}

こんな風になります。ネストして使われるとわけがわからないよ。
image.png

保守が難しくなる

Windowsフォームのコードを例として出します。
下記のクラスにメンバを追加するとき、正しい位置に追加するには#region-#endregionのブロックをいちいち調べなければいけません。
労力に見合うほどのリターンが、果たしてあるのでしょうか?

PiyoForm.cs
public partial class PiyoForm : Form
{
    #region Member variables
    private bool _isInitialized;
    #endregion

    #region Constructor
    public PiyoForm()
    {
        InitializeComponent();
    }

    #endregion

    #region Event handler
    private void PiyoForm_Load(object sender, EventArgs e)
    {
        // Something
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        // Something
    }
    #endregion

    #region Private methods
    private void ProcessSomething()
    {
        // Something
    }
    #endregion
}

リファクタの必要性を隠してしまう

#regionがなければ読みづらいコードは、そもそもリファクタを必要としている可能性が高いです。
長大なメソッドをの可読性を上げるために#regionで分割することがよくありますが、そもそもメソッドを分割しておけば#regionを使う必要はなく、より可読性も向上します。

例外

長大なリテラルを隠すのに使う

多次元配列やヒアドキュメントのリテラルがコードの途中にあると、
膨大な行を使ったり、インデントを崩したりするので、読みやすさをかなり損ねてしまいます。
リテラルに用途を絞って#regionを使うのは可読性の向上に有効と言えます。

LongLongLiterals.cs
public class LongLongLiterals
{
    public void ProcessSomething()
    {
        var identityMatrix =
        #region Two dimensional array literal
            new int[,]
        {
            { 1, 0, 0, 0, 0, 0, 0, 0},
            { 0, 1, 0, 0, 0, 0, 0, 0},
            { 0, 0, 1, 0, 0, 0, 0, 0},
            { 0, 0, 0, 1, 0, 0, 0, 0},
            { 0, 0, 0, 0, 1, 0, 0, 0},
            { 0, 0, 0, 0, 0, 1, 0, 0},
            { 0, 0, 0, 0, 0, 0, 1, 0},
            { 0, 0, 0, 0, 0, 0, 0, 1}
        };
        #endregion
        var sql =
        #region Sql statement literal
            @"SELECT *
FROM dbo.Hoge
WHERE id = 1 and name = 'Jane Doe'";
        #endregion
    }
}

image.png

まとめ

便利機能として多用されることの多い#regionの注意点について解説しました。
どうしても#regionを多用したコードを向き合わざるを得ない場合に、役立つアドオンを最後にご紹介しておきます。どちらのアドオンも、#regionをデフォルトで展開状態にしてくれます。

47
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?