2009-09-02 9 views
0

私が構築しているクラスモデルを改善できるかどうかを判断する際に助けが必要です。私が構築しているクラスは、いくつかの属性を持つ単純なProductクラスです。ネストされたクラスを持つ商品クラスの開発.Net

class clsProducts 
{ 
    private string _name; 
    private double _productionRate;   

    //Constructor 
    public clsProducts() 
    { 
     _name = "null"; 
     _productionRate = 0.0;   
    } 

    public clsProducts(string name, double productionRate) 
    { 
     _name = name; 
     _productionRate = productionRate;   
    } 

    //Properties 
    public string Name 
    { 
     get { return _name; }   
    } 

    public double ProductionRate 
    { 
     get { return _productionRate; }   
    } 

} 

私が追加したいのは、クラス内の各製品の月ごとの予測値を持つ機能です。私はこれを行うには、次のように追加することができます

private double _janValue; 
private double _febValue; 

など、これは乱雑です。私はまた、しかし、私はこのアイデアもうまくいくことを確認していないように

class clsProducts 
{ 
...code here.... 

    protected class ForecastValues 
    { 
     private string name; 
     private double forecastValue; 

     ...other code..... 
    } 
} 

としてForecastValuesと呼ばれる入れ子になったクラスを作成すると考えます。私はこれをきれいに処理する方法を提案することができますか?

あなたは

答えて

5

ここにはいくつかのものがあります。

  1. クラス名からclsハンガリー語接頭辞を削除することをおすすめします。
  2. 「ForecastValues」の正確な内容に応じてあなたはリストである "Product"クラス、または場合によっては辞書であるプロパティを作ることができます。私の推測では、あなたが簡単に辞書のルートに行くことができるかもしれないということです。
+0

これは2009年です...名前でクラスであることを知る必要はないと思います。 Visual Studioには構文が強調表示されています:) –

+0

2009年、わたしはどれくらいの期間眠っていましたか? –

0

私は、ネストされたクラスは素晴らしいアイデアだと思いませんありがとうございました。私が行うことは、追加のクラス 'ForecastValues'を作成することですが、 '内部保護された'とマークします。こうすることで、アセンブリ内で使用できるようになりますが、コードのユーザーは値を含むときにのみ参照できます。

-haun

0

これは私がちょうどアレイとインデクサーを使用することをお勧めします、私はどうなるのか

class ClsProducts 
{ 
    //Constructor 
    public ClsProducts() 
    { 
     Name = "null"; 
     ProductionRate = 0.0; 
    } 

    public ClsProducts(string name, double productionRate) 
    { 
     Name = name; 
     ProductionRate = productionRate; 
    } 

    //Automatic properties with private setters 
    public string Name { get; private set; } 
    public double ProductionRate { get; private set; } 

    //since you basically have key value pair, why not use one? 
    public KeyValuePair<String,Double> Forcast{ get; set; } 
} 
+0

彼は毎月の予測を望んでいると思います。ただ1つではないので、KeyValuePairだけでなく、Dictionary が必要です。 – CSharpAtl

+0

申し訳ありませんが、それだけが気になっていますので、公開されているはずです。Dictionary Forcast {get;セット; } –

1

です。 month - Month.JanuaryInt32への明示的なキャストが必要な場合

public enum Month 
{ 
    January = 1, February = 2, March  = 3, 
    April = 4, May  = 5, June  = 6, 
    July = 7, August = 8, September = 9, 
    October = 10, November = 11, December = 12 
} 

public class Product 
{ 
    private readonly String name = null; 
    private readonly Double productionRate = 0.0; 
    private readonly Double[] productionRateForcast = new Double[12]; 

    public Product(String name, Double productionRate) 
    { 
     this.name = name; 
     this.productionRate = productionRate;   
    } 

    public String Name { get { return this.name; } } 
    public Double ProductionRate { get { return this.productionRate; } } 

    public Double this[Month month] 
    { 
     get { return this.productionRateForcast[month - Month.January]; } 
     set { this.productionRateForcast[month - Month.January] = value; } 
    } 
} 

は私はわかりません。代わりに、January = 0で始めることもできますが、これはちょっと変わっているようです。

コードを変更しました。 Productインスタンスでは「初期化されていない」フィールドがあり、後でそれらを変更する可能性がないため、デフォルトコンストラクタを削除しました。その結果、私はフィールドを読み上げ専用にしました。 Finaly Hungarion表記の接頭辞を削除しました。これはかなり旧式のコーディングスタイルです。ProductsProductになりました。これは製品のコレクションではない1つの製品を表すためです。辞書アイデアを追いつくために

UPDATE

....私はちょうど必要な変更を行います。

private readonly IDictionary<Month, Double> productionRateForcast = 
    new Dictionary<Month, Double>(); 

public Double this[Month month] 
{ 
    get { return this.productionRateForcast[month]; } 
    set { this.productionRateForcast[month] = value; } 
} 

これは、配列を使用するより洗練されたソリューションです。インデクサーを持つ代わりにプロパティを使って辞書を公開することもできますが、インデクサーは実装の詳細が隠されているため、より洗練されたソリューションと考えています。

public IDictionary<Month, Double> ProductionRateForcast 
{ 
    return this.productionForecast; 
} 

いずれの場合も、以下のようになります。

Product myProduct = new Product("Great Product", 0.8); 

myProduct[Month.August] = 0.7; 

これはかなり奇妙に見えます。一つは、インデクサにIndexerNameAttributeを追加してみてください可能性があり、これはインデクサーをサポートしている言語で

myProduct.ProductionValueForcast[Month.August] = 0.7; 

を書き込むことができるようになるかどうかはわかりません。だから私は最終的に私の心を変える傾向があり、IndexerNameAttributeが助けにならない場合には、プロパティで辞書を公開する方が好きです。

関連する問題