勘弁してください

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

勘弁してください

投稿記事 by バグ » 13年前

今、改造しているソフトにこんな風な書き方をしている箇所がありました。

CODE:

private button_Click(object sender, EventArgs e)
{
	Button button = (Button)(sender);
	switch(button.Name)
	{
		case "button1":
			textBox1.Text =  "Test1";
			break;
		case "button2":
			textBox2.Text =  "Test2";
			break;
		case "button3":
			textBox3.Text =  "Test3";
			break;
		case "button4":
			textBox4.Text =  "Test4";
			break;
	}
} 
ボタンクリック時のイベントハンドラなんですけど、いくつかのボタンが押された際の処理を1つのハンドラにまとめているんですね。これはサンプルですが、押されたボタンに対応したテキストボックスの中身を書き換えている訳です。

で、私が個人的に気に入らないのが、switch~caseでの分岐条件がsender(イベントを発生させたボタンのはず)のNameプロパティ・・・。そうなんです、これをやってしまうと、Buttonの名前を変更した際に、この条件部分も書き換えが必要になってしまいます。

ちなみに、私は下記のように修正しました。

CODE:

private button_Click(object sender, EventArgs e)
{
	Button[] button = { button1, button2, button3, button4 };
	TextBox[] textBox = { textBox1, textBox2, textBox3, textBox4 };
	for (int i = 0; i < button.Length; ++i)
	{
		if (((Button)sender) == button[i])
		{
			textBox[i].Text = string.Format("Test{0}", i  + 1);
		}
	}
}
VisualStudioで開発している人ならご存知だと思いますが、たとえオブジェクト名を変更しても、全ての参照先の名前を書き換えてくれる機能がありますので、修正箇所が最低限で済む訳です。

まぁ、この辺りは好みの問題もあるかもしれませんけが、私は前者の書き方はどうしても好きになれません。
最後に編集したユーザー バグ on 2011年11月02日(水) 11:09 [ 編集 1 回目 ]

アバター
沖 滉均
記事: 237
登録日時: 14年前

RE: 勘弁してください

投稿記事 by 沖 滉均 » 13年前

前者の書き方はC#を始めた当初に練習がてら書いたコードの中に出てきますねw
当時のコードはとてもじゃないが見たくない…
後者の方はチェックボックスの一括処理絡みで似たようなことをやってます。

とりあえず、前者は変更し忘れるとバグの原因になるうえに何が原因か発見しづらいですよね…

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

RE: 勘弁してください

投稿記事 by バグ » 13年前

そうなんですよね、「何かが起こったとき」に原因を特定しやすい書き方をしたいですよね。
そういうのって、結局は色々と書いているうちに、なんとなく身についてくるものかもしれません。

他にはusingを使ってほしいなぁ・・・とか。
この元のコードを書いた人はusingを使わない人なんですよね・・・便利なんだけどなぁ・・・(^_^;)

もちろん、私も昔のコードは見たくありませんねw