- PR -

メソッド内の変数定義位置

投稿者投稿内容
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-05-14 13:12
VB.NET(VS2003)でプログラムを書く場合について
質問です。

「一般的に変数定義は、
 メソッドの最初にまとめて行うべきものなのでしょうか?」

Public Sub メソッド名
 '変数定義
Dim 変数 As 型名
Dim 変数 As 型名
    :
    :
Dim 変数 As 型名

  〜数百行から数千行の処理内容〜

End Sub

というソースをよく見かけますが、
ある一部分でしか使用しない変数が冒頭部に集中して
何のための変数であるかわからなくなるため
わかりやすい変数名をつけ、さらにコメントで補うことが必要になってくると思います。


であるならば変数を冒頭で定義することにこだわらないほうが良いのではと思い、
私の場合、変数内全般で使用する変数以外は、極力冒頭で宣言せず、
必要になった際に初めて、変数の定義(+初期化)を行うようにしています。
また、
一箇所からしか呼び出されないロジックを
Privateなメソッドとして切り出すのもどうかと思い、
スコープ狭めるためだけに、
Try 〜 Catch で囲んで、
その中で変数を定義したりすることもあります。


正解はないのかもしれませんが、もっとも読みすくバグの出にくい
コーティング方法について、皆さんのご意見をお聞かせください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-14 13:23
引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:

「一般的に変数定義は、
 メソッドの最初にまとめて行うべきものなのでしょうか?」


特にプロジェクト内で規定がなければ、使う直前に宣言 && 初期化が良いされています。
それと、ブロックレベルのローカル変数についても調べてみる必要があると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-14 13:31
少し以前の言語ならば、先頭でしか宣言できなかったという事もあり、それに拘っている人もいるかもしれませんね。
今は新しい言語を使っているのですから、私も使う直前に宣言するほうが良いと思います。

引用:

一箇所からしか呼び出されないロジックを
Privateなメソッドとして切り出すのもどうかと思い、
スコープ狭めるためだけに、
Try 〜 Catch で囲んで、
その中で変数を定義したりすることもあります。


ん〜、意味なく Try Catch するのは変ですね。C# の場合はこういうときは、{} ブロックだけ書けるのですが…。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-14 13:48
引用:

囚人さんの書き込み (2006-05-14 13:31) より:

ん〜、意味なく Try Catch するのは変ですね。C# の場合はこういうときは、{} ブロックだけ書けるのですが…。


なるほど、ここはそういう意味だったのですね。
こちらのスレッドを思い出しました。

  VBのWithってC#でどう書くんですか? (>>9)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-05-14 13:59
引用:

じゃんぬねっとさんの書き込み (2006-05-14 13:23) より:
特にプロジェクト内で規定がなければ、使う直前に宣言 && 初期化が良いされています。
それと、ブロックレベルのローカル変数についても調べてみる必要があると思います。



やはり現在は使う直前の方が良いとされているのですね。
ちなみにそういった現在一般的に推奨的され
るコーティング規約のようなことが書かれている
HPをご存知でしたら教えていただけませんでしょうか?

開発メンバーの中には、未だにfor分のループカウンタ(i,j,k)ですらメソッド冒頭に
書いてくるような人間も多いので(^^:


[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2006-05-14 13:59 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-14 14:00
引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:

VB.NET(VS2003)でプログラムを書く場合について
質問です。

「一般的に変数定義は、
 メソッドの最初にまとめて行うべきものなのでしょうか?」



そんなことないと思いますよ?(^^)
僕は、昔から使用する直前で書いてましたし、じゃんぬねっとさんも、同様に書い
ていると仰っていました。

VB6以前なら、そういう書き方をしている例は何度か見かけました。
また、昔の関連書籍などのサンプルコードも、そのように書いているものも多かっ
たのです。
しかし、VB.NET からは、変数のスコープがブロック内のみになっていることから、
使用する直前で書く方が自然になってきているように思います。

引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:

Public Sub メソッド名
 '変数定義
Dim 変数 As 型名
Dim 変数 As 型名
    :
    :
Dim 変数 As 型名

  〜数百行から数千行の処理内容〜

End Sub


上記の例は、ちょっと凄いですね(^ー^;)
メソッドやプロパティは、1画面内に収めるように書くのが好きです。
大量に長くなる場合は、目的語とに別のメソッドに抽出したり、独立性が高ければ
クラスに分けるなどします。

引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:

ある一部分でしか使用しない変数が冒頭部に集中して
何のための変数であるかわからなくなるため
わかりやすい変数名をつけ、さらにコメントで補うことが必要になってくると思います。



そうしなくても良いように、長くなってもわかりやすい変数名を適所に配置するのが
よいですよね(^^)

引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:

一箇所からしか呼び出されないロジックを
Privateなメソッドとして切り出すのもどうかと思い、



切り出しちゃって良いと思いますよ?(^ー^;)
リファクタでもメソッドの切り出し機能が付いているように、1処理1メソッドに
する方法をお勧めします。
ただ、僕の場合は、一箇所からしか呼び出さないメソッドは、呼び出し元のメソッ
ドとともに、#regin で括っちゃいます。
こんな感じです。

コード:
#region "ある人の居場所を取得する"
public 場所 ある人の居場所を取得する(string 尋ね人氏名) {
    場所 居場所;
    
    居場所 = this.よく行く場所から探す(尋ね人氏名);
    if (居場所 != null) {
        return 居場所;
    }

    居場所 = this.友達の家に電話して聞く(尋ね人氏名);
    if (居場所 != null) {
        return 居場所;
    }

    居場所 = this.警察に電話する(尋ね人氏名);
    if (居場所 != null) {
        return 居場所;
    }

    return null;    
}

private 場所 よく行く場所から探す(string 尋ね人氏名) { ・・・}

private 場所 友達の家に電話して聞く(string 尋ね人氏名) { ・・・}

private 場所 警察に電話する(string 尋ね人氏名) { ・・・}

#endregion


こうして普段たたんでおくと他からは関係ない「ある人の居場所を取得する」ため
の手順などもまとめて1行にまとまるので全体を眺めるときに、とてもわかりやす
くて気に入っています。

また、メソッドを分けるメリットとしては、探す方法に「携帯電話に電話してみる」
が抜けていることや、この方法を、どの優先順位に含めるか?、などが一目瞭然に
なります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-14 14:05
引用:

ハニワ祭りさんの書き込み (2006-05-14 13:59) より:

ちなみにそういった現在一般的に推奨的され
るコーティング規約のようなことが書かれている
HPをご存知でしたら教えていただけませんでしょうか?


CodeComplete という評判の良い書籍を購入してみてください。
この書籍は、ブロック スコープのない VB6 ですらそのようにすべきだと書いています。

もっと検索すれば、Web サイトでもこういった記述を見つけることができると思いますが、
逆に、VB6 系のサイトは、先頭で宣言しているものが多かったりしますw

引用:

開発メンバーの中には、未だにfor分のループカウンタ(i,j,k)ですらメソッド冒頭に
書いてくるような人間も多いので(^^:wink:


ループカウンタとしてしか使わないような変数は、使用できる場所を限定した方が絶対に良いでしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-14 14:09
引用:

じゃんぬねっとさんの書き込み (2006-05-14 13:48) より:

なるほど、ここはそういう意味だったのですね。
こちらのスレッドを思い出しました。

  VBのWithってC#でどう書くんですか? (>>9)



おおっ、これは僕が CShaper に華麗に転身した直後に立てたスレで、相変わらずじ
ゃんぬねっとさんにお世話になっているところですね。

随分、懐かしいものを・・・( ̄  ̄;)

C# では、いきなり

コード:
string s = "aaa";
{
    string s = "bbb";
}



などと書けるんですよね。感動ものです。
先ほどは、生まれて初めて C# で do〜while っちゃった(≧▽≦)イエイ!

#明るく振舞っているけど仕事中・・・(T−T)

スキルアップ/キャリアアップ(JOB@IT)