#region을 사용하지 않는 것이 좋은 세 가지 이유와 하나의 예외

12805 단어 VisualStudioC#

#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은 클래스 내의 멤버의 분류나, 메소드내의 처리의 단락으로서, 코드의 가독성을 높이는데 사용됩니다.


사용하지 않는 것이 좋은 이유



용도가 모호하다



단순히 코드를 접는 기능이므로 코드의 블록 단위를 무시한 사용법이 가능합니다.
코드 규약으로 묶는다면 아직도, 무질서하게 사용되면 가독성이 반대로 저하합니다.

예를 들어 이런 코드는

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
}

이런 식으로 될 것입니다. 중첩하여 사용된다는 것을 알 수 없습니다.


유지 보수가 어려워진다.



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
    }
}




요약



편리한 기능으로 자주 사용되는 #region의 주의점에 대해 설명했습니다.
아무래도 #region을 다용한 코드를 마주 보지 않을 수 없는 경우에, 도움이 되는 애드온을 마지막으로 소개해 둡니다. 두 애드온 모두 기본적으로 #region을 배포 상태로 만듭니다.
  • VS2017,2019
  • #Regions Are Evil - Visual Studio Marketplace

  • ~VS2015
  • I Hate #Regions - Visual Studio Marketplace

  • 좋은 웹페이지 즐겨찾기