箱庭ハーブblog

7年目プログラマの趣味の小部屋

Visual Studio #Region の使い道

VISUALSTUDIO、VisualStudio、Visualstudio、visualstudio
#Regionディレクティブ、#regionディレクティブ

ども、お疲れ様です
#Regionディレクティブの使い道、みなさんどうされてますでしょうか
自分はここ1年間で、次の使い方にほぼ確定してまいりました。

1、ある関数とそこからのみ呼ばれる関数をひとまとめにする

業務アプリを作っていると、実質的に1つのメソッドだが、500~1000行になることが往々に在ります。
その場合には、以下の3つのアプローチが考えられます
1、1000行のファットなメソッドを鎮座させる
2、純粋なサブルーチンとして、メソッドをいくつもの関数に分割する
3、クラスが実装できそうなレベルなら、関数の中身でクラス設計をしてみる
3番は小さなプログラムを作るに等しく、(元のメソッド=要求仕様。クラス分割=詳細設計、と考えられる)
労力も自由度も高すぎます
僕としては1番を正しく読める自信もないので避けたいところ
つまり僕のスキルレベルでは2番以外に選択肢がない訳で、文脈と意味単位で適当に分割します
こうすると、実際には1ヶ所からしか呼ばれない関数というものが、大量に出来ます
(経験上1つのメソッドから5、6個の関数が出来上がるのはよく在る)

こんなに、わさわさ関数が在るとうるさいので、これらを#Regionで囲ってしまうとすっきりします。
例えばこんな感じ
#Region "  Private Sub CalBodyValueAll() と その従属関数"
  Private Sub CalBodyValueAll()
    ...
  End Sub
  Private Sub CalBodyValue()
    ...
  End Sub
  Private Function CopyDatasetDataShow(ByVal rsFrom As DataSetHoge, _
ByVal rsTo As DataSetHoge, _
ByVal incomekbn As String)  As Boolean
    ...
  End Function
  ...
# End Region

シンプルですが、中々使いやすい方法です
独学でC#をやっていた頃は、サブルーチンになる部分を#regionで関数に見せかける書き方をしてました
(なお、VB.NETではメソッド内に#Regionはかけないのでこの方法は実践できません)
ですが、先に例に挙げた方法のほうが分かりやすいと思います
インデントをネストせずにローカル変数の局所化が出来るので。



2、PublicFunctionsなど、静的関数群クラス内の分類分け

これはもう、それ以上でもそれ以下でもなく。
基本的に同じ分類の汎用関数は予め名前の先頭部分をあわせたりしますが、関数の数が50、100となってくると探すだけで大変だったりするので、#Regionで括ります




で、結局?

正直なところ、#Regionのこの使い方は他の俺俺コーディングルールと密接に関わっているため、
万人向けかどうかは分かりません
とりあえず、一応、俺俺コーディングルールも載せておきます

俺俺コーディングルール

1、メンバの宣言順序は原則として次の順番で宣言する
また、各メンバ間は必ず1行空ける
但しプロパティの元となるフィールドは、プロパティの直前に空行を空けずに記述する
また、在る関数からのみ呼ばれる関数は、その関数のすぐ下に空行を空けずに記述する
 1、Public Shared(public static)
 2、private shared(priavte static)
 3、Public Property
 4、Public Method
 5、Private Property
 6、Overridesメンバ
 6、コンストラクタ、Form.Loadイベントハンドラ、Shownイベントハンドラ
 7、Private Method(イベントハンドラ)
 8、Private Method(非イベントハンドラ)
 
2、余計なコメントは基本的にかかない。関数名で役割を適切に体現する
 主に修正日付や修正内容などを簡潔に書くこととして使用する
 また、ドキュメントコメントはよほど複雑でない限り、使わない(折りたたむと読めないため)

3、自分は、Ctrl+M、Oを多用する

4、リファクタリングするときは、絶対に修正は行なわない
リファクタリング時はリファクタリングのみ行ない、チェックインする

補足、 Public/Private、Method/Propety、Static/instanceで分けない理由

経験上、余り効果的でないです
というよりも、意味が余りないです
なぜなら、少なくともPublicメンバは普通に記述していると頭に書くはずで、
PrivateメンバをPublicに書き換えた場合も、その時点で移動させる人がほとんどでしょう
つまりPublicメンバが上にいることは保障されています
そして、#Regionは、基本的に邪魔です
なぜなら1回開かないと中が見れません。面倒です
メソッドまで折りたたんでいた場合、2回開かないとコードを見れないことになります。
めんどいです。

そもそも各アクセサやメンバ種ごとに分けたいなら、
まず分けた上で境目に下記のように1行コメントを書けば十分で。
' ↑ Public  ↓ Private

Publicメンバが多すぎてPrivateメンバを見るのが面倒だというなら、
そもそもそんなにPublicメンバが多いことが問題なわけで。
(Publicプロパティが10個もいたら、ほとんどの場合クラス分割したほうが見通しがよくなります)
(但し構造体ライクなクラスを除く。しかし構造体ライクなクラスは単純な構造のはず)

まとめ

#Regionは基本的に自分以外で使ってるのをほとんど見たことがないです
が、ファットメソッドに対して関数分割をやる人は、積極的に使っていくといいかもしれません
それ以外の方法でもいい使い道があるなら、割と積極的に使っていける機能だと思います
但し、ソースを見るのが1手間余計にかかるため、へんな使い方はお勧めできません

結論:#Regionは、使い方を誤らなければ便利(なはず)
コメント
PAGETOPへ

コメント送信

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード

パスワードを入れておかないと、コメントの再編集ができません!

フリーエリア

takemori
Twitter : @takemori_kondo

1. Unityと戯れてます
2. Cake3は劣化じゃないRails

iOS
coming soon...

Windows
Html Editor - Nazuna
Managed DirectX サンプル集

beginning since
2006.08.17
renewaled on
2011.06.03

最新コメント

[2013/06/14 ミューネ]
[2012/08/30 ノートPC]