2014-05-15 14 views
0

저는 엉망이기 때문에 제 코드의 리팩토에 머리를 쓰고 있습니다. 어제부터에있어 이후 하지만, 내 머리는 돌 -_- "Refacto, algo/logic issues

#region DateTime foreach Currencies 
    static DateTime eurusd = DateTime.Now.AddHours(-1); 
    static DateTime eurgbp = DateTime.Now.AddHours(-1); 
    static DateTime eurjpy = DateTime.Now.AddHours(-1); 
    static DateTime usdjpy = DateTime.Now.AddHours(-1); 
    static DateTime gbpjpy = DateTime.Now.AddHours(-1); 
    static DateTime gbpusd = DateTime.Now.AddHours(-1); 


    static DateTime eurusdm1 = DateTime.Now.AddHours(-1); 
    static DateTime eurgbpm1 = DateTime.Now.AddHours(-1); 
    static DateTime eurjpym1 = DateTime.Now.AddHours(-1); 
    static DateTime usdjpym1 = DateTime.Now.AddHours(-1); 
    static DateTime gbpjpym1 = DateTime.Now.AddHours(-1); 
    static DateTime gbpusdm1 = DateTime.Now.AddHours(-1); 

    static DateTime eurusdh1 = DateTime.Now.AddHours(-1); 
    static DateTime eurgbph1 = DateTime.Now.AddHours(-1); 
    static DateTime eurjpyh1 = DateTime.Now.AddHours(-1); 
    static DateTime usdjpyh1 = DateTime.Now.AddHours(-1); 
    static DateTime gbpjpyh1 = DateTime.Now.AddHours(-1); 
    static DateTime gbpusdh1 = DateTime.Now.AddHours(-1); 

    static DateTime eurusdd1 = DateTime.Now.AddHours(-1); 
    static DateTime eurgbpd1 = DateTime.Now.AddHours(-1); 
    static DateTime eurjpyd1 = DateTime.Now.AddHours(-1); 
    static DateTime usdjpyd1 = DateTime.Now.AddHours(-1); 
    static DateTime gbpjpyd1 = DateTime.Now.AddHours(-1); 
    static DateTime gbpusdd1 = DateTime.Now.AddHours(-1); 
    #endregion 

24 다른 날짜 시간이있다처럼 보인다.

  switch (data.Instrument) 
      { 

       case "EUR/USD": 
        if (CanUpdate(ref eurusd, "s5")) 
        { InsertData("eurusd", data); } 
        if (CanUpdate(ref eurusdm1, "m1")) 
        { InsertData("eurusdm1", data);} 
        if (CanUpdate(ref eurusdh1, "h1")) 
        { InsertData("eurusdh1", data);} 
        if (CanUpdate(ref eurusdd1, "d1")) 
        { InsertData("eurusdd1", data);} 
      } 

스위치 케이스 6 케이스 (등 위의 하나) 은 (InsertData 그냥 컬렉션의 일부 개체를 넣어. "X"=> 컬렉션 이름, 데이터 => 객체)

private bool CanUpdate(ref DateTime date, string timer) 
    { 
     TimeSpan result = DateTime.Now - date; 

     if (timer == "s5") 
     { 
      int difSeconds = result.Seconds; 
      if (difSeconds >= 5) 
      { 
       date = DateTime.Now; 
       return true; 
      } 
     } 
     if (timer == "m1") 
     { 
      int difMinutes = result.Minutes; 
      if (difMinutes >= 1) 
      { 
       date = DateTime.Now; 
       return true; 
      } 
     } 
     if (timer == "h1") 
     { 
      int difHour = result.Hours; 
      if (difHour >= 1) 
      { 
       date = DateTime.Now; 
       return true; 
      } 
     } 
     if (timer == "d1") 
     { 
      int difDays = result.Days; 
      if (difDays >= 1) 
      { 
       date = DateTime.Now; 
       return true; 
      } 
     } 
     return false; 
    } 

내 "CanUpdate"방법. 패 사이의 시간을 확인 ast 업데이트 및 "if 조건"이 참이면 "날짜 변수"를 업데이트하고 true를 반환하고 그렇지 않으면 false를 반환합니다.

짐작할 수 있듯이이 스위치 케이스에는 70 줄 정도의 선이 있습니다. 하나의 변경 사항은 전체 스위치 케이스에서 재확인해야합니다. 못생긴가?

이 스위치 케이스를 제거하고 유지 관리하기 쉽도록하고 싶습니다. 나는 모든 데이터를 다른 목록에 넣는 것을 생각해 보았다. 다음에 대한 중첩 된 2 할

List<String> collectionName; 
    List<DateTime> dateTime; 
    List<String> timeFrame; 

과 날짜 시간 컬렉션 foreach 문을 수행 은 그래서 같이 표시됩니다. 뭔가를해야만처럼 :

foreach (DateTime dt in dateTime) 
{ 
    for(i=0; i <= collectionName.Lenght; i++) 
    { 
     for(j=0; j <= timeFrame.Lenght; j++) 
     { 
      CanUpdate(ref dt, timeFrame[j]) 
      InsertData(collectionName[i].ToString(), data) 
     } 
    } 
} 

올바른 방향으로 I를 오전 당신도 내가 좋아하는 것이 무엇인지 이해한다. 왜냐하면 당신 머리가 이걸 읽은 후 내 상태와 같은 상태에 있기 때문입니다. 죄송합니다 : O

답변

2

서문

  1. 내가 (사실, 내가 한 등) 것이 문제를 해결하기 위해 사전을 사용합니다.
  2. 나는 Tuple을 좋아하지 않습니다. 그래서, 진짜 응용 프로그램에 대한 대신 일부 구조체/클래스를 만들 것입니다.
  3. 답변을 위해서는 "EUR/USD"및 "eurusdm1"형식의 문자열로 작업해야한다고 가정합니다 (방법 GetInsertDataArgument() 참조).
  4. 물론 코드를 테스트하지는 못했습니다.하지만 아이디어를 얻는 데 충분하다고 생각합니다.
  5. 원본 코드에서 귀하의 datetimes가 정적 이었기 때문에 모든 멤버를 정적으로 만들기로 결정했습니다. 이것을 쉽게 변경할 수 있습니다. 각 통화 쌍과 시간 간격에 대한

    1. lastUpdateDateTimes 저장 날짜 시간 :

    에 무슨 코드

    class MyClass 
    { 
        private static readonly Dictionary<Tuple<string, string>, DateTime> lastUpdateDateTimes = new Dictionary<Tuple<string, string>, DateTime>(); 
        private static readonly Dictionary<string, TimeSpan> timeIntervals = new Dictionary<string, TimeSpan>(); 
    
        static MyClass() 
        { 
         timeIntervals.Add("s5", TimeSpan.FromSeconds(5)); 
         timeIntervals.Add("m1", TimeSpan.FromMinutes(1)); 
         timeIntervals.Add("h1", TimeSpan.FromHours(1)); 
         timeIntervals.Add("d1", TimeSpan.FromDays(1)); 
        } 
    
        private static string GetInsertDataArgument(string instrument, string timeIntervalName) 
        { 
         string result = instrument.Replace("/", "").ToLower(); 
         if (timeIntervalName != "s5") 
          result = result + timeIntervalName; 
         return result; 
        } 
    
        private static void Update(string instrument) 
        { 
         DateTime now = DateTime.Now; 
         foreach (var timeInterval in timeIntervals) 
         { 
          var dateTimeKey = new Tuple<string, string>(instrument, timeInterval.Key); 
          if (now - lastUpdateDateTimes[dateTimeKey] < timeInterval.Value) 
           continue; 
          lastUpdateDateTimes[dateTimeKey] = now; 
          InsertData(GetInsertDataArgument(instrument, timeInterval.Key), data); 
         } 
        } 
    } 
    

    2 개 사전이 있습니다. 튜플의 첫 멤버는 통화 쌍 (EUR/USD 형식)을 저장하고 두 번째 멤버는 시간 간격 이름 ("s5"형식)을 저장합니다.

  6. timeIntervals은 시간 간격을 유지합니다. 그것은 클래스의 정적 생성자에 채워집니다.

Update 메서드는 switch 문과 CanUpdate 메서드를 대체합니다.

0

감사합니다. 당신의 생각은 정말 좋습니다. 내가 특히 필요 정확히 : 나는 모든 데이터 관계를 만드는 방법을 궁금

 Dictionnary<Tuple<string,string>,DateTime> 

.

난 그냥

 if (timeIntervalName != "s5") 

때문에 삭제하는 데 필요한

"결과 = 결과 + timeIntervalName을;"

은 GetArgumentName이 호출 될 때마다 트리거되어야합니다. 심지어 사이의 조건에서 작동하지 않았기 때문에

Neded)는 (A

TimeSpan timeElapsed = now - lastUpdateDateTimes[dateTimeKey]; 

를 확인합니다. 이유를 모르겠다. (?)

그리고 lastUpdateDateTimes Dictionnary도 채워야했습니다. (ofc)

다시 한 번 감사드립니다. 매력처럼 작동하십시오.

+1

당신은 환영합니다 :) –