PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

c#のregionの使いどころ

f:id:Takachan:20170115150341j:plain

VisualStudio上でコードを折りたたむ機能で#region ~ #endgreionディレクティブというものがあります。「リージョン」と読みます。「レギオン」だと軍団で「L」と「R」が違うのでご注意を。

そんなリージョンですが、以下のように

public void Hoge()
{
    #region ナントカの処理
    
    if(this.....(中略)...
    
    }
    #endregion
}

と記述するとエディタ上でregionディレクティブで囲んだ個所が折りたためるようになります。

f:id:Takachan:20151123184054p:plain
任意の範囲を折りたたむことでコードを一見コンパクトかつシンプルでエレガントに見せることができます。
ただ、任意の範囲を折りたためる故、以下のように悪用する事もできます。

public void Hoge()
{
    #region 処理ステップ1
    
    // 数十行 ~ 数百行の処理
    
    #endregion
    
    #region 処理ステップ2
    
    // 数十行 ~ 数百行の処理
    
    #endregion
    
    #region 処理ステップ3
    
    // 数十行 ~ 数百行の処理
    
    #endregion
}

実際に職場であったのですが、1つのメソッドが1000行以上あるのに#regionで折りたためばあら不思議。
上記メソッドも折りたたむとたった数行に見えます。

この悪用ケースはクラスも同じ事ができます。複数のメソッドを#regionで囲んで「xxxを処理するところ」とか書いて折りたたんでおけば明らかに設計や実装個所を間違えてるコードも一見きれいに整理されているように見えます。但し、一見きれいに見えるだけで、実際は折りたたまれたところの実装がスパゲティの可能性がかなり高いと思います。

上記のような#region囲みが発生したらすぐにメソッドに分割しましょう。

じゃあどこで使うのかという話なんですが、充分小さいメソッドの集まりには使わないので、既にある(メンテが不可能な)大きくて複数の処理が詰め込まれているクラスやメソッドの処理ブロックをまとめる事に使えそうです。

もしくはパブリック/プライベートなメソッドをひとまとまりにして折りたたむところに使ったりします。

広告を非表示にする