2012-02-24 6 views
0

私は現時点では少し複雑に見えるドメインをモデル化しようとしています。ドメインをモデル化しようとしています

基本的に、我々はノードいる:Aノードは、ノード名と階層構造の数

  • Aノードが親ノード
  • を持っていますそして、私たちは毎日、毎週、のレートを持っている

    • を持っています

      • 実際のレート
      • を:持っている年次月次、四半期、 0
      • 目標レート
      • コンピューレート

      その後、我々は与えられた・ビジネスの日に、意味・ビジネスの一日を持っている: 私はノードを見つけて、すなわち毎日与えられたパラメータに対して料金を返す、毎週する必要があります。

      .etc私は

      class Node 
      { 
      //Pls note that this is pseudo code. 
      int Id; 
      int HierarchyId; 
      string Name; 
      Node Parent; 
      Rate dailyRate; 
      Rate monthlyRate; 
      //for all the daily, weekly,monthly,quarterly,yearly rep.. 
      .. 
      .. 
      .. 
      } 
      public class Rate 
      { 
      DateTime BuisinessDay; 
      public decimal actual; 
      public decimal targeted; 
      public decimal computed; 
      } 
      

      を次のようにこれをモデル化しようとした私のモデルを表すのより良い方法はありますか?

      注:これは、RESTful WCFサービスで公開されている必要があります。

      おかげで、 -Mike

    +0

    メンバーとして、それを次のように使用します。毎週の料金など? – ndtreviv

    +2

    子要素内でParentNodeを使用することは避けたいと考えていますが、その関係は間違いなくParentNode.Children です。 "Rate"と同じですが、これはIRateインターフェイスを実装する単純な構造体を使って定義する方が良いかもしれません、DailyRate:IRate {enum Interval ...}、DailyRate.Interval = Daily – Lloyd

    +0

    @ndtreviv:これは私がやっていることです瞬間。編集を参照してください。問題は、これが営業日の前後にピボットすることです。 – Mike

    答えて

    1

    この例では、本当にラフなカットです。しかし、基本的な "事"は、営業日、週、月、年、四半期、十年などがすべて同じことであるということです。 「トップレベル抽象ノード」というものはありません。

    与えられた「サイクル」にアクセスする方法を本当に考えなければなりません。一度やり直すと、たとえば、CalculateRateという呼び出しが階層の最下部に伝播し、その「サイクル」の正解を得ることがわかります。

    など

    はおそらくない別のクラスを作成し、あなたがBusinessCycleType列挙を定義することができた構造おそらく

    を横断し、指定されたオブジェクトが日、週、年であれば、今、あなたは知っていますナビゲーション。私はあなたが実際に、ターゲットと計算値と料金のオブジェクトを作成しない理由はどのような理由をなどBusinessCycleType、または特定のBusinessCycleTypeてオブジェクトを取得するための方法、またはBusinessCycleTypesの範囲を、想像してなど

    public abstract class BusinessCycle { 
    
        double rate = 0; 
    
        // an enum that can make traversing the BusinessCycle structure easier. 
        BusinessCycleType whatAmI; 
    
        public double AcutalRate {get; set;} 
        public double TargetedRate {get; set;} 
        public double ComputedRate { 
         get { return CalculateRate(); } 
        } 
    
        // a week has a List of days, a month a list of weeks ... 
        protected List<BusinessCycle> businessCycleLentgh = new List<BusinessCycle>; 
    
        protected double CalculateRate() { 
         if (businessCycleLength == null) return rate; 
    
         rate = 0; 
         foreach (BusinessCycle cycleLength in businessCycleLength) { 
          rate += cycleLength.CalculateRate(); 
         } 
    
         return rate; 
        } 
    } // BusinessCycle class 
    
    public class BusinessDay : BusinessCycle { 
        public BusinessDay() { 
         this.businessCycleLength.Add(this);  // so we don't need a special CalcuateRate() - a BusinessDay has no "sub components" 
        } 
    } 
    
    public class BusinessWeek : BusinessCycle {} 
    
    public class BusinessMonth : BusinessCycle {} 
    
    public enum BusinessCycleType { 
        Day, Week, Month, Quarter, Year 
    } 
    
    関連する問題