- 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を選択されたときに何らかの計算や、
どこかのコントロールを設定する可能性があります。
ビジネスロジックが存在する場合もあります。
そうであれば、コンボボックスを継承した、
コントロールを作ったりビジネスロジックを、
インプリメントするクラスを作ったりするのは、
自然なことではないでしょうか?
|