- PR -

変数の宣言の場所について教えてください。

投稿者投稿内容
S_Tatsu
ベテラン
会議室デビュー日: 2005/05/13
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2005-10-25 21:33
mio様
じゃんぬねっと様
かつのり様
宣伝中止!様
たくさんのご解答ありがとうございます。
{}を単体で使えることを知らなかったので驚きました。
{
int j = 0;
}
このような書き方は初めてみました。
同じような処理をする変数を何個も使うときに名前を変えなく
ても{}で囲んでしまえば同じ名前でいけちゃうんですね。
宣言とは少し話しが違うと思うのですが、メソッドの処理の中
で別のメソッドを呼び出す際に必要な引数を呼び出し元のメソ
ッドの引数で同じ名前で定義するのは読みにくいでしょうか?
かなりわかりづらいかと思うのですがすいません。イメージ的
には次のような感じなのですが。。


public void hoge(String arg1,String arg2,String arg3)
{
・・・・・
・・・・・
・・・・・
int a = hogehoge(arg1,arg2,arg3);
・・・・・
・・・・・
・・・・・
}
private int hogehoge(String arg1,String arg2,String arg3)
{
・・・・・
 ・・・・・
 String str1 = hogehogehoge(arg1,arg2);
 String str2 = hogehogehogehoge(arg3);
 ・・・・・
int result = ○○○;
return result;
}

private String hogehogehoge(String arg1,String arg2)
{
・・・・・
 ・・・・・
 String result = "○○○";
return result;
}
private String hogehogehogehoge(String arg3)
{
・・・・・
 ・・・・・
 String result = "○○○";
return result;
}
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-10-25 21:40
引用:

宣言とは少し話しが違うと思うのですが、メソッドの処理の中
で別のメソッドを呼び出す際に必要な引数を呼び出し元のメソ
ッドの引数で同じ名前で定義するのは読みにくいでしょうか?


仮引数と実引数の名前が同じで問題ないか、ということですね。まったく問題ないというか、
よくあることです。
未記入
会議室デビュー日: 2005/08/28
投稿数: 6
投稿日時: 2005-10-25 23:47
横レスすみません。
Cユーザにしてみれば、JavaやC++で記述できる
メソッド途中の変数宣言は、かえって分かりづらいです。
データ入れ替え用や計算用の作業データ、forループやカウントに
使用しているものは除きますけど。。

↓こういう感じのあちゃーなコードを職場でよく遭遇します。
// 変更前
sample() {
subA();

int a = get();
int b = subB( a );

subC( b );
}


// 変更後1
sample() {

// 変数定義しなおし(汗)
int a = get();

subD( a );

subA();

// 上部に定義しなおした為、コメントアウト(汗)
//int a = get();
int b = subB( a );

subC( b );

}
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-10-26 00:03
引用:

かつのりさんの書き込み (2005-10-25 20:50) より:
メソッドの内での変数宣言とメソッドの外での変数宣言では、
目的も性格も全く違い、スコープ云々の話ではありません。

メソッドの外の変数はフィールドと呼ばれ、
インスタンスやクラスの状態を保持する目的で使用されます。
メソッドの中の変数はローカル変数と呼ばれます。


んん? コード の可読性とかの話もあがっているようですが、変数がどこに
属するべきかという視点で見ることが大事です。
かつのりさんの書き込み内容が本質を捕らえていると思いますので、
フィールド などのキーワードを元に掘り下げて行くことをお薦めします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-26 08:56
引用:

未記入さんの書き込み (2005-10-25 23:47) より:

Cユーザにしてみれば、JavaやC++で記述できる
メソッド途中の変数宣言は、かえって分かりづらいです。


初めは私もそうでした。

引用:

↓こういう感じのあちゃーなコードを職場でよく遭遇します。


私は、見かけたことがないッス。
この手のものはいちいちコメントで残したりしません。
(VSS の差分管理になってます)

「ブロック先頭で」という規約もよく耳にします。
ブロックの先頭でまとめてならば、この問題は起きないでしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2005-10-26 13:13
引用:

S_Tatsuさんの書き込み (2005-10-25 21:33) より:

{}を単体で使えることを知らなかったので驚きました。



私は、switch-case文を使う際はできるだけ各caseに{}を付けるようにしています。
文法上、case文には{}は要らないので、各caseで変数を共有することができますが、そうしてしまうとswitch-case文に慣れていない人はスコープを見誤ることがあるためです。
変数を共有したい場合は、switch文の前に宣言しています。
これも{}単体の使い方の一つだと思います。
※逆に慣れた人からすると煩わしいのかな。私の周りでは結構評判良いのですが。
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2005-10-26 14:51
引用:

S_Tatsuさんの書き込み (2005-10-25 21:33) より:
{}を単体で使えることを知らなかったので驚きました。



基本的にはそのとおりなのですが、メソッドの外に{}ブロックを作成すると『インスタンスイニシャライザ』という別の意味を持つブロックになるので注意してくださいね。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2005-10-26 15:02
>私は、switch-case文を使う際はできるだけ各caseに{}を付けるようにしています。
私は、switchの場合は、全部switchの前に宣言ですね。
switchがifの変形であることを考えれば、各caseへの{}でも良いとは思いますが、
なんーとなく違和感あります。個人的には。

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