- R・田中一郎
- ぬし
- 会議室デビュー日: 2005/11/03
- 投稿数: 979
|
投稿日時: 2005-12-31 15:37
以前、似たようなスレがありました。僕は、そのスレを読んだ日に初めて region を使ってみました。
新しく触れた概念です。その日から、戦いと迷いの連続です。
だって、便利なんだもの。
いろいろ使っては「いや、こうじゃない・・・」と独り言を繰り返し、結局たどり着いた答えは、クラスのアウトラインを開いたら、そのクラスが公開しているイベント・メソッド・プロパティの一覧と、非公開な方々を仕方なく括ったもので構成されている、と言うのが一番綺麗かな?と思ったのです。
しかし、実際のところ、皆さんはどのように使っていて、どのようなメリットやデメリットを感じているのかを改めて確認したいと思ったのです。
コード: |
|
public class 大晦日に何考えてるんだクラス
+ 雨が降った イベント
+ 雪が降った イベント
+ 除夜の鐘の回数 プロパティ
+ 年越し蕎麦の出前を頼むお店の名前 プロパティ
+ 初日の出を見る メソッド
+ 除夜の鐘を聞く メソッド
+ 年賀状を急いで書く メソッド
+ 非公開な方々
end class
|
ちなみに、公開メソッドの下請けメソッドは、そのメソッドの直下に括ってます。
コード: |
|
- #region " 除夜の鐘を聞く メソッド "
'****************************************************************************
' 除夜の鐘を聞く メソッド
'****************************************************************************
- public sub 除夜の鐘を聞く()
do
if (鳴り止んだ() then
exit do
end if
if (寒いからやめる()) then
exit do
end if
煩悩の削除()
loop
end sub
+ private function 鳴り止んだ() as boolean
+ private function 寒いからやめる() as boolean
End Region
|
ちなみに、「寒いからやめる()」が複数の公開メソッドから呼び出される場合は、「非公開な方々」に速やかに移動します。
非公開な方々には、イベントハンドラやフィールド変数なども含まれています。
コード: |
|
-#region " 非公開な方々 "
+ 年賀状を出す列挙
+ お年玉をあげる列挙
+ 出してない奴から年賀状が来た イベントハンドラ
+ お年玉を催促された イベントハンドラ
+ 寒いからやめる
#end region
|
こんな感じに落ち着いたんですが、やはり、皆さんはどうしているのだろうか?、と不安になる訳です。
まだ甘いとか、そこまで細かくやると生産性が悪いなど、いろいろなご意見を参考にさせていただけたらと思っています。
僕は、最初
コード: |
|
public class 大晦日に何考えてるんだクラス
+ フィールド変数
+ 発行するイベントの宣言
+ 公開プロパティ
+ 公開メソッド
+ イベントハンドラ
end class
|
このように書いてみたのですが、じゃんぬねっとさんのサンプルコードに
のような記述を見つけて、僕もすぐに真似しました。
その結果、少しずつ修正を加えて辿り着いたのが上の方法です。
ちなみに、
コード: |
|
- #region " 除夜の鐘を聞く メソッド "
'****************************************************************************
' 除夜の鐘を聞く メソッド
'****************************************************************************
|
このように region の下にコメントを3行入れるのは、アウトライン全開で編集している時や、色々なテキストエディタで編集した時に、読みやすくするためです。
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2005-12-31 16:21
とりあえず、前スレのリンクを載せておきます。
Region どう使えば便利なんでしょう??
とりあえず、私ならこんな感じですね。
(ほぼ同じであるところは省いています)
コード: |
|
using デスマーチ;
namespace デスマーチ.スペシャルな日 {
#region この名前空間で有効な列挙体
public enum やっちゃうぞ列挙体 {
仕事する,
休んじゃう,
なんなら無断欠勤だ,
辞職するぞ,
Baddayして暴れる
}
#endregion
#region 大晦日に何考えてるんだクラス
public class 大晦日に何考えてるんだクラス : System.ICloneable {
#region このクラスの定義
//ここにプライベートなメンバや定数を定義する
//列挙体 / 内部クラス・構造体 なんかもここに入れる
private readonly int Hoge;
private const string MUST_WORK = "仕事!!";
#endregion
#region 除夜の鐘の回数 プロパティ
// プロパティ変数とプロパティのアクセサは同一 region でまとめる
private int _除夜の鐘の回数;
public int 除夜の鐘の回数 {
get {
return this._除夜の鐘の回数;
}
}
#endregion
#region Clone メソッド (implements System.ICloneable.Clone)
private object Clone() {
return this.MemberwiseClone();
}
#endregion
}
#endregion
___________________________________________________________________________
#region ちょww正月まで出勤かよorzクラス
public class ちょww正月まで出勤かよorzクラス {
// 省略
}
#endregion
___________________________________________________________________________
#region クリスマスって何ですかクラス
public class クリスマスって何ですかクラス {
// 省略
}
#endregion
}
|
R・田中一郎 さんとの違いは、プライベートであっても列挙体などの定義は、
そのクラスの定義にあたるので、1 番上に持ってるということです。
括り方はほぼ一緒ですね。
メソッド、プロパティ、イベント、各メンバ...
プロパティはプロパティ変数とアクセサを同一 region で括ります。
フィールドはクラスの定義ということで先頭でまとめます。
デリゲート / イベントの定義 / 定数や読み取り専用のメンバの定義も同様です。
もちろん順番も大切にします。
たいてい、クラスの定義 -> コンストラクタ -> プロパティ -> メソッド -> イベント...
変数定義以外の静的なメンバ (static メソッドなど)は、
1 番後ろへ並べることにしています。
ただし、いわゆる静的コンストラクタ (イニシャライザ) は先頭です。
overrides や new、implements のあるメンバは #region の末尾にその旨を付けます。
今回の例ですと、Clone メソッドがそれにあたりますね。
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2005-12-31 16:38
あ、#region の末尾に付け足すで思い出しました。
オーバーロードの場合ですが、(+n) という表記を付け足します。
順番で思い出したことといえば、「アクセス修飾子」順でも並べるということですね。
もちろん、public -> internal protected -> internal -> protected -> private の順番。
面倒なので「折りたたんだイメージ」で書くと。
コード: |
|
public class TClass1 {
+ [ このクラスの定義 ] // ここに定数やフィールドを定義 (普通は少ないので)
+ [ 静的コンストラクタ ] // いわゆる、イニシャライザ
+ [ コンストラクタ (+3) ] // コンストラクタ + 3 つのオーバーロード
// public
+ [ Property1 プロパティ ] // 普通のプロパティ
+ [ Property2 プロパティ (+1) ] // プロパティ + 1 つのオーバーロード
+ [ Method1 メソッド ] // 普通のメソッド
+ [ Method2 メソッド (+2) ] // メソッド + 2 つのオーバーロード
+ [ Method3 メソッド (override) ] // オーバーライド修飾なメソッド
// protected
+ [ Dispose メソッド (implements System.IDisposable.Dispose) ]
// private
+ [ Method6 メソッド ] // 普通のメソッド
+ [ Event1 イベント ] // 普通のイベント
// static (Shared なメンバ)
:
:
}
|
こういう感じですね。
全部を書くと長文になるので、説明が難しい... (;_ _)
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- R・田中一郎
- ぬし
- 会議室デビュー日: 2005/11/03
- 投稿数: 979
|
投稿日時: 2005-12-31 17:25
いろいろ試行錯誤したり、じゃんぬねっとさんのサンプルコードから少しずつ修正してきた甲斐があって方向性は間違っていなかったようで胸を撫で下ろしています。
引用: |
|
じゃんぬねっとさんの書き込み (2005-12-31 16:21) より:
コード: |
|
#region 大晦日に何考えてるんだクラス
public class 大晦日に何考えてるんだクラス : System.ICloneable {
#region このクラスの定義
//ここにプライベートなメンバや定数を定義する
//列挙体 / 内部クラス・構造体 なんかもここに入れる
private readonly int Hoge;
|
|
C# って、こんなに綺麗に書けるんですね。
インデントができれば、3行コメントつけなくても読みやすいんですけどね。
いちから作るソフトは、C# にしようと思いました。
引用: |
|
じゃんぬねっとさんの書き込み (2005-12-31 16:21) より:
R・田中一郎 さんとの違いは、プライベートであっても列挙体などの定義は、
そのクラスの定義にあたるので、1 番上に持ってるということです。
|
順番は、あまり気にしていませんでしたが、確かに重要ですね。
それと、アウトラインを閉じた状態をコメントで分離するのも素敵です。
()の補足も、いただきです。
現時点で、どうして?、とか、こういう場合は?、と言う疑問は浮かびません。
全て、納得できますし、とても効率的だと思いました。
じゃんぬねっとさん、いつもありがとうございます。
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2005-12-31 18:16
引用: |
|
R・田中一郎さんの書き込み (2005-12-31 17:25) より:
C# って、こんなに綺麗に書けるんですね。
インデントができれば、3行コメントつけなくても読みやすいんですけどね。
いちから作るソフトは、C# にしようと思いました。
|
VB でもインデント付けられますからかなり見やすいと思いますよ。
言語は、C# の方が好きですが、見易さで言えば VB の方が好きです。
#Region サンプル コード
VB では #Region で半角スペースのインデントが有効ですが、C# は無効なんですよね。
(おそらく、C# は二重引用符で括らないから)
コード: |
|
#Region " VB はこう書ける "
#region C# はこうしか書けない
|
なので、C# も VB も全角スペースでインデントをつけて見た目を綺麗にします。
コード: |
|
#Region " VB はこう書く "
#region _C# はこう書く_ ("_" の部分は全角スペース)
|
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- lalupin4
- 大ベテラン
- 会議室デビュー日: 2004/07/26
- 投稿数: 163
|
投稿日時: 2005-12-31 23:05
あー。もーなんつうかよ。
メンバメソッドの中で#regionカマすのは構造化がなってない可能性が高いわけで、
Visual Studio .NETコードエディタの一画面に収まらないときに初めて検討したいわけなんだけどよ、ただ、大抵の場合は///コメントで済むわけで。
えーと、非public, すなわちpublic, internal以外のprotected, private全体を:
コード: |
|
#region Protected members...
プロパティ
プロパティ
メソッド()
メソッド()
メソッド()
#endregion
|
コード: |
|
#region Private members...
プロパティ
プロパティ
メソッド()
メソッド()
メソッド()
#endregion
|
とかまあそんなカンジなわけで。
こうするとオブジェクト指向プログラミングの一要素、「カプセル化(情報の隠蔽)」が意識できるわけで。
で、重要なのがさぁ…ぐはっ(以下血中アルコール度数がぁっっ)
俺はもうダメだ…みなさんよいお年を。
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2005-12-31 23:37
引用: |
|
lalupin4さんの書き込み (2005-12-31 23:05) より:
メンバメソッドの中で#regionカマすのは構造化がなってない可能性が高いわけで、
|
メソッドの "中" でならばそうなんでしょうけど、
(#region が必要な部分は、メソッド外へ Extract できるはず)
今はメソッドの中の話をしておりませんよね?
「メソッド毎に」と仰りたかったのだと解釈しています。
引用: |
|
Visual Studio .NETコードエディタの一画面に収まらないときに初めて検討したいわけなんだけどよ、ただ、大抵の場合は///コメントで済むわけで。
|
私の場合は、エディタ 1 画面に収まってない時点で、
構造化されていないことを疑いたくなります。
長い長い処理の中で、きっとメソッド外へ Extract できる部分があるはずです。
(後でリファクタするのであれば、問題はないと思います)
引用: |
|
こうするとオブジェクト指向プログラミングの一要素、「カプセル化(情報の隠蔽)」が意識できるわけで。
|
それは、#region ディレクティブでなくとも出来る話だと思いますよ。
もちろん、#region ディレクティブをアクセス修飾子に対して適用するのも手ですが。
#region ディレクティブの使い方は人それぞれの好みがあると思います。
私も昔は、アクセス修飾子ごとに区切ってましたが、
カプセル化がしっかりできていれば、膨大なクラスでさえ必要ないと思うようになりました。
今はただの「しおり代わり」にしかなっていません。
そういう意味では、クラス ビューでも良いような気がしますけど、
作業の都合上、あるプロシージャと関係のあるプロシージャだけ見たい、
という場合がグループ開発では多々あるので、そうしています。
大切なのはポリシを守ることだと思います。
#region ディレクティブの使い方が間違い、というのはあまりないと思ってます。
# 私は、そろそろ年越しそば作ります。(^^;)
# 0 時までヒマだったので訪れちゃいました。
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2006-01-03 22:05
すっかり明けちゃいました。
私は、
フィールド
イベント宣言
コンストラクタ
仮想メソッド
プロパティ
メソッド
イベントハンドラ | 上位の実装
をくくって、この順で、
private
protected
public
の順で並べます。
|