バグ の日記

勘弁してください

パーマリンク by バグ on 2011年11月02日(水) 10:16

今、改造しているソフトにこんな風な書き方をしている箇所がありました。
コード[C#]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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の名前を変更した際に、この条件部分も書き換えが必要になってしまいます。

ちなみに、私は下記のように修正しました。
コード[C#]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
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で開発している人ならご存知だと思いますが、たとえオブジェクト名を変更しても、全ての参照先の名前を書き換えてくれる機能がありますので、修正箇所が最低限で済む訳です。

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

コメント

RE: 勘弁してください

パーマリンク by 沖 滉均 on 2011年11月02日(水) 11:07

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

とりあえず、前者は変更し忘れるとバグの原因になるうえに何が原因か発見しづらいですよね…
There is no royal road to learning.
[code]タグで指定できる言語
沖の雑記帳

RE: 勘弁してください

パーマリンク by バグ on 2011年11月02日(水) 11:16

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

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

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