- PR -

複数フォームで同じコードを書いてあるのですが。

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-06-11 10:15
引用:

NAL-6295さんの書き込み (2007-06-08 23:45) より:

引用:

Jittaさんの書き込み (2007-06-08 21:50) より:
 そういうデータで初期化する、ComboBox を継承したコントロールを作る。
こんな感じで OK かと。
コード:
public class MyComboBox : ComboBox
{
    public MyComboBox() : base() {
        this.Items.Add("指定しない");
        this.Items.Add("内容1");
        this.Items.Add("内容2");
        this.DropDownStyle = ComboBoxStyle.DropDownList;
        this.SelectedIndex = 0;
    }
}






これをやっちゃうとデータの種類分だけ作成する必要があって、現実的な解では無いのでは?


あれ?
僕も、よく使う方法だったりしますが・・・現実的では無いのかな?^^;

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-06-11 10:51
引用:

NAL-6295さんの書き込み (2007-06-08 23:45) より:
引用:

Jittaさんの書き込み (2007-06-08 21:50) より:
 そういうデータで初期化する、ComboBox を継承したコントロールを作る。
こんな感じで OK かと。
コード:
public class MyComboBox : ComboBox
{
    public MyComboBox() : base() {
        this.Items.Add("指定しない");
        this.Items.Add("内容1");
        this.Items.Add("内容2");
        this.DropDownStyle = ComboBoxStyle.DropDownList;
        this.SelectedIndex = 0;
    }
}





これをやっちゃうとデータの種類分だけ作成する必要があって、現実的な解では無いのでは?



拡張性を持たせたいのであれば、以下のようなりファクタリングを施してはいかがでしょうか。
少々冗長な気はしますが。

コード:
public class MyComboBox : ComboBox
{
    public MyComboBox() : this(new DefaultComboBoxInitializer()) {
    }
    
    public MyComboBox(ComboBoxInitializer inInitializer) {
        inInitializer.Initialize(this);
    }
    
    // ....
}

public interface ComboBoxInitializer {
    void Initialize(ComboBox inComboBox);
}

public class DefaultComboBoxInitializer : ComboBoxInitializer {
    public void Initialize(ComboBox inComboBox) {
        inComboBox.Items.Add("指定しない");
        inComboBox.Items.Add("内容1");
        inComboBox.Items.Add("内容2");
        inComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
        inComboBox.SelectedIndex = 0;
    }
}



えらい人が、このようなオブジェクト抽出に対して、Storategyのパターンという名前をつけています。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-06-11 12:38
引用:

えらい人が、このようなオブジェクト抽出に対して、Storategyのパターンという名前をつけています。


それはパターン魔じゃないでしょうか。
内部データが違うというだけで継承だとかデザインパターンを持ち出すのはやりすぎだと思います。


コード:
private void set_combobox() {
    combobox1.Items.Add("指定しない");
    combobox1.Items.Add("内容1");
    combobox1.Items.Add("内容2");
    combobox1.DropDownStyle = ComboBoxStyle.DropDownList;
    combobox1.SelectedIndex = 0;
}


この程度の事ならそれぞれに書いて重複してもいいんじゃない?という気すらします。
私なら、やったとしても「指定しない・内容1・内容2」をリソース(コード上の定数・リソース・DBなど)に持っておいて、それぞれのフォームで Add のループか AddRange です。

_________________
囚人のジレンマな日々
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-06-11 12:59
NAL-6295です。

引用:

囚人さんの書き込み (2007-06-11 12:38) より:
コード:

private void set_combobox() {
combobox1.Items.Add("指定しない");
combobox1.Items.Add("内容1");
combobox1.Items.Add("内容2");
combobox1.DropDownStyle = ComboBoxStyle.DropDownList;
combobox1.SelectedIndex = 0;
}


この程度の事ならそれぞれに書いて重複してもいいんじゃない?という気すらします。
私なら、やったとしても「指定しない・内容1・内容2」をリソース(コード上の定数・リソース・DBなど)に持っておいて、それぞれのフォームで Add のループか AddRange です。



私も、同じような感じです。
ただ、ComboBoxとリソースをバインドするためのメソッドは各フォーム固有のもの意外は共通のクラスにstaticメソッドとして定義したりします。

ちなみに、

ComboBoxをデータ毎に継承したカスタムコントロールにする案を現実的じゃないのでは?

と感じたのは単純に、

・カスタムコントロールが増えすぎて後で管理が大変そうだ。
・ツールバーがComboBoxのカスタムコントロールでいっぱいになったらめんどくさそうだな。
・そのカスタムコントロールに内包してしまったデータは、他のところで使わないの?

といった単純な理由からです。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2007-06-11 13:01 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-11 15:02
引用:

R・田中一郎さんの書き込み (2007-06-11 10:15) より:

あれ?
僕も、よく使う方法だったりしますが・・・現実的では無いのかな?^^;


データを共有したいという目的で、コントロールを共用しているのでおかしいと思います。データに特化した拡張でしかないカスタム コントロールを使うのは目的として誤っていると思います。そもそも、コントロールの本来の役割は何でしょうか? データを持つことが本来の役割だったのでしょうか?

前のレスに少しだけ書いておきましたが、この "ComboBox 内で解決されたデータを扱う" ということ自体が現実あまりないお話です。ComboBox で選択されたデータ (または内部的な値) を更新時などに扱うでしょう。

データを共有化したいのであれば、それはコントロールと無縁なところに用意することで共有化すれば良いです。そしてそれを吸い上げる機能だけを共通化すれば良いです。

カスタム コントロールで考えた場合、そのデータを他で扱いたい場合にどうやって取得すれば良いでしょうか? '結果的に' コントロールとして扱うデータは共有化できたのかもしれませんが、吸い上げる作業を共通化することができません。拡張 ComboBox 内で static メソッドを書くのでしょうか? それこそコントロールの世界から見れば、汎用性に乏しいデータ依存の実装になりますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-06-11 15:19
引用:

囚人さんの書き込み (2007-06-11 12:38) より:
それはパターン魔じゃないでしょうか。
内部データが違うというだけで継承だとかデザインパターンを持ち出すのはやりすぎだと思います。



確かに、パターンまで持ち出したのは行き過ぎたかもしれません。
しかし、具象クラスの継承するというのであれば、むしろStrategyの適用したほうがいいのでは、とは思っています。

引用:

この程度の事ならそれぞれに書いて重複してもいいんじゃない?という気すらします。
私なら、やったとしても「指定しない・内容1・内容2」をリソース(コード上の定数・リソース・DBなど)に持っておいて、それぞれのフォームで Add のループか AddRange です。



人はちょっとした事で、間違いを犯します。
そして間違った場合に、修正する範囲を小さくするため、そのスコープを小さくすべきであると考えています。
そのため、たとえその規模が小さくても、「重複してもいいんじゃない」とは思わないです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-06-11 21:55
反応が鈍くてすみません。

 私は、データがただ単に「内容1」「内容2」で終わるわけではなく、また、複数のセットがあると思っています。
 また、自分の経験から、UI に対しても「このセットはこういうことがしたい。しかし、こっちのセットはこうしたい」という要望があると思いました。
つまり、「データを共有化したい」のではなく、「データと、それを選択したことに起因するイベント処理を共有したい」のではないかと思いました。

 そんなこんなをここに書こうと思ったけれど、元の質問から外れていくなぁ...と思ってブログに書いた。→ http://blogs.wankuma.com/jitta/archive/2007/06/11/80362.aspx
_________________
えムナウ
会議室デビュー日: 2006/07/25
投稿数: 4
投稿日時: 2007-06-13 12:08
久々の書き込みでしかもToo Lateなんですが、

視点がひとつ抜けています。
ビジネスロジックであるか否かです。

>combobox1.Items.Add("指定しない");
>combobox1.Items.Add("内容1");
>combobox1.Items.Add("内容2");

指定しないは指定しない意味を持つんでしょうし、
内容1・内容2は何らかの意味を持つんであれば、
内容1・内容2を選択されたときに何らかの計算や、
どこかのコントロールを設定する可能性があります。
ビジネスロジックが存在する場合もあります。

そうであれば、コンボボックスを継承した、
コントロールを作ったりビジネスロジックを、
インプリメントするクラスを作ったりするのは、
自然なことではないでしょうか?

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