Странный расчет даты и тест - PullRequest
1 голос
/ 21 августа 2009

Может кто-нибудь объяснить, что проверяет следующий код? Я не могу этого понять, но не хочу оставлять это из своего переписывания просто из-за невежества. Полный код вычисляет дисперсию между сейчас и detailLastDate, т.е. Days(detailLastDate) - Days(Now). Для этого случая detailLastDate имеет значение '090722':

int num3 = 0;
num3 = int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(4, 1) 
    + int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(5, 1);
if (num3 == 0)
{
    detailLastDate = "991231";
}

ДОБАВЛЕНО: Что меня удивляет, так это то, что он анализирует символы 0–3 дважды.

Ответы [ 4 ]

5 голосов
/ 21 августа 2009

Ну, не удивительно, что вы не можете понять это, потому что это не имеет смысла:)

Прежде всего, похоже, что целью является проверка, является ли переданная дата «000000». Он также проверяет, все ли цифры на самом деле числовые. Было бы исключение, если бы они не были. Также будет исключение, если длина строки будет меньше 6.

Если дата «000000», по умолчанию будет «991231».

Это должно быть в основном эквивалентом, при условии, что num3 не используется для других странных сравнений:

int num3;
if (detailLastDate.Length != 6 || !Int32.TryParse(detailLastDate, out num3))
    throw new FormatException("Invalid date");

if (num3 == 0)
    detailLastDate = "991231";

Это также приведет к ошибке в слишком длинной строке (в отличие от вашего фрагмента кода), но я считаю, что это хорошо. Лично я бы избавился от целочисленного анализа вообще, но я думаю, что это работает:)

Если вы хотите провести рефакторинг надлежащим образом, взгляните на ответ CMS. Просто убедитесь, что окружающий код не основан на описанных мной побочных эффектах.

2 голосов
/ 21 августа 2009

Вы можете проанализировать дату в соответствии с форматом yyMMdd и посмотреть, удалось ли преобразование с использованием метода DateTime.TryParseExact .

Пример:

//...
string detailLastDate = "090722";
DateTime lastDate;

if (!DateTime.TryParseExact(detailLastDate, "yyMMdd",
                CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDate))
{
    // input doesn't match the format
    lastDate = new DateTime(1999, 12, 31); // default value 991231
}
//...
return (lastDate - DateTime.Today).Days;
1 голос
/ 21 августа 2009

Ну, во-первых, код не компилируется, так как скобки не совпадают. Как выглядит оригинальный код?

Если вы добавите скобки, код по-прежнему не имеет особого смысла. Он анализирует символ за раз и большинство символов более одного раза, когда вместо этого он может просто проанализировать всю строку.

Если вы знаете, что строка всегда состоит из шести символов и всегда содержит цифры, вам не требуется дополнительная проверка, которую код дает путем анализа строки, и вы можете просто заменить ее на:

if (detailLastDate == "000000") detailLastDate = "991231";
1 голос
/ 21 августа 2009

Похоже, что проверка проверяет, все ли даты равны нулю, и если это так, по умолчанию используется значение 991231 (31 декабря 1999 года?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...