Refacto,算法/逻辑问题

时间:2014-05-15 14:08:20

标签: c# refactoring

我是我的代码重构的头,因为它是一团糟。 但是因为我从昨天开始,我的脑袋就像一块石头 - “ -

    #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种不同的DateTime。

            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”=>集合名称,data =>对象)

    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”方法。检查上次更新之间的时间,如果“if condition”为true,则更新“date variable”并返回true,否则返回false。

你可以猜到,这个开关盒或多或少有70条线。需要在整个开关柜上重新进行一次更改。丑陋吧?

我想摆脱这个switchcase并使其更易于维护。 我想将所有数据放在不同的列表中。 所以它看起来像:

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

并在DateTime集合上执行foreach,然后执行2次嵌套。 像这样的东西:

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)
        }
    }
}

我是否朝着正确的方向前进,你是否理解我想要的东西。因为读完之后,如果你的头与我的头部处于同一状态。对不起:O

2 个答案:

答案 0 :(得分:2)

序言

  1. 我会(事实上,我确实)使用Dictionary来解决这个问题。
  2. 我不是Tuple的忠实粉丝。因此,对于实际应用程序,我会创建一些struct / class。
  3. 对于答案,我认为需要使用格式字符串&#34; EUR / USD&#34;和&#34; eurusdm1&#34; (见方法GetInsertDataArgument())。
  4. 当然,我还没有对代码进行过测试:)但我觉得它已经足够了解这个想法。
  5. 我决定让所有成员都保持静态,因为原始代码中的日期时间是静态的。您可以轻松更改此内容。
  6. 代码

    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个词典:

    1. lastUpdateDateTimes存储每个货币对的日期时间和时间间隔。元组的第一个成员存储货币对(&#34; EUR / USD&#34;格式),第二个成员存储时间间隔名称(&#34; s5&#34;格式)。
    2. timeIntervals保留您的时间间隔。它填充了类的静态构造函数。
    3. Update方法是替换switch语句和CanUpdate方法。

答案 1 :(得分:0)

谢谢你。你的想法非常好。 正是我需要的特别是:

     Dictionnary<Tuple<string,string>,DateTime>

我想知道如何将所有这些数据关联起来。

我只需要删除

     if (timeIntervalName != "s5")

,因为    “result = result + timeIntervalName;”

每次调用GetArgumentName时都应该触发

需要制作

    TimeSpan timeElapsed = now - lastUpdateDateTimes[dateTimeKey];

因为它甚至在()之间的条件下也不起作用。不知道为什么,它应该。(?)

我还需要填充lastUpdateDateTimes Dictionnary。 (OFC)

所以,再次感谢你。像魅力一样工作。