2012-04-29 9 views
0

トラックを生成しているトラックビルダー(私の将来のレースゲーム用)を開発しています。構築後、トラックはゲームエンジンなどで処理されます。トラックは可能要素のコレクション、次のとおりです。長いストレート 従属要素の一連の工場

  • 遅い/中/高速のコーナー
  • 各要素は、トラックのを構築している間に生成されなければならないlengthプロパティを、持っている/

    • 短いです素子。要素は世代中の以前のものに依存しています(遅いものの後に速い角を持つのはちょっと奇妙です)。

      public class ElementType 
      { 
          ... 
          public double GenerateLength() 
          { 
           switch (m_TypeEnum) 
           { 
            case ElementTypeEnum.SlowSpeedCorner: 
             return Parameters.SlowCornerAvgLength+Generator.GetDeviation; 
            ... 
            case ElementTypeEnum.LongStraight: 
            default: 
             return Parameters.LongStraightAvgLength + Generator.GetDeviation(Parameters.LongStraightLengthMaxDeviation); 
           } 
          } 
          ... 
          public IList<ElementType> GetPossibleSuccessors() 
          { 
           switch (m_TypeEnum) 
           { 
            case ElementTypeEnum.SlowSpeedCorner: 
             return new List<ElementType>() { new ElementType(ElementTypeEnum.SlowSpeedCorner), new ElementType(ElementTypeEnum.ShortStraight), new ElementType(ElementTypeEnum.LongStraight) }; 
            ... 
            case ElementTypeEnum.LongStraight: 
            default: 
             return new List<ElementType>() { new ElementType(ElementTypeEnum.SlowSpeedCorner), new ElementType(ElementTypeEnum.MediumSpeedCorner), new ElementType(ElementTypeEnum.FastSpeedCorner) }; 
           } 
          } 
      } 
      
      public enum ElementTypeEnum : int 
      { 
          LongStraight = 1, 
          SlowSpeedCorner = 2, 
      } 
      

      と発電機がオンに基づかれた方法:私は「ifing」の解決のために行ってきました初めて

      public static TrackElement GenerateElement(TrackElement Predecessor) 
      { 
          ElementType type = SelectElementType(Predecessor); 
          double length = type.GenerateLength(); 
          return new TrackElement(type, length); 
      } 
      
      private static ElementType SelectElementType(TrackElement Predecessor) 
      { 
          IList<ElementType> successors = Predecessor.Type.GetPossibleSuccessors(); 
          int possibleSuccessors = successors.Count; 
          int selected = Generator.GetInt(possibleSuccessors); 
          return successors[selected]; 
      } 
      

      しかし、あなたが推測できるように、これはドラマですエンジンでそれを消費するとき - すべての財産の結果としてあまりにも多くの "ifing"。だから私は上基づか異なるクラスに要素を移動:

      public abstract class TrackElement 
      { 
          public TrackElement(double Length) 
          { 
           m_length = Length; 
          } 
          protected abstract static double GenerateLength(); 
      
          public sealed double Length 
          { 
           get 
           { 
            return m_length; 
           } 
          } 
      } 
      

      をしかし、今、私は提供されるクラスを使用して、建物のトラックに問題があります。もちろん

      public static TrackElement GenerateElement(TrackElement Predecessor) 
      { 
          ??? type = SelectElementType(Predecessor); 
          double length = type.GenerateLength(); 
          return new ???(length); 
      } 
      

      を私はGenerateLengthので、このように行うことができないことを知っています私は自分の問題を起草したかっただけです。どうすればこれを達成できますか?

    答えて

    0

    オーダートラックの論理を構成のロジックから分離します。完全なトラックを構築するエンティティに移動します。次に、あなたの工場に有益な名前をつけさせてください。

    public abstract class TrackElementFactory 
    { 
        public abstract TrackElement CreateFastCurve(); 
        public abstract TrackElement CreateLongStraight(); 
    } 
    
    public class TrackArranger 
    { 
        public Track CreateAwesomeTrack() 
        { 
          var factory = //get from somewhere 
          var track = new Track(); 
          track.Add(factory.CreateFastCurve()); 
          track.Add(factory.CreateLongStraight()); 
          .... 
          return track; 
        } 
    } 
    

    また、TrackElement抽象化の変更に伴い、さらに喜んでいる可能性があります。これにより、実装をよりきれいにすることができます。

    public abstract class TrackElement 
    { 
        public abstract double Length 
        { 
         get; 
        } 
    } 
    
    関連する問題