首先,您的单元测试应该已经捕获到了这一点。您可能需要重新访问为此方法编写的测试,以从中学习如何更全面地涵盖您的功能。
第二,你为什么要使用
String.Compare
而不是
String.Equals
?我认为以下内容更具可读性:
date.Equals("Today", StringComparison.InvariantCultureIgnoreCase);
我认为它能更清楚地读出正在发生的事情(尤其是当我们不必记住决赛的时候)
bool
参数表示输入
比较字符串
)
现在,来了解你问题的核心。您的方法非常好,并且非常清楚地表达了逻辑。不过,我会做一个小的重构:
public DateTime ParseInThisYearOrNextYear(string s, out DateTime dt)
{
if (!Parse(s, "dddd MM dd", out dt))
{
if (!Parse(s + " " + DateTime.Now.Year + 1, "dddd MM dd yyyy", out dt))
{
throw new FormatException();
}
}
return dt;
}
bool Parse(string s, string format, out DateTime dt)
{
return DateTime.TryParseExact(
s,
format,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt
);
}
这将您的方法分为两个不同的功能块,并防止重复您自己的操作。(
CultureInfo.InvariantCulture
和
DateTimeStyles.None
)使测试和维护更加容易。(您可能需要比
Parse
;我选择了一个简短的滚动条,以防止滚动条出现在此处的代码窗口中。)
最后一个警告是(不知道系统的详细信息),您可能还需要考虑检查上一年!想象一下以下情况:
-
输入为“12月31日星期四”(2009年有效)。
-
该系统将于1月1日跨越边界进入2010年。
-
代码执行并检查2010年和2011年,两者都失败。
只是一些需要考虑的事情,这取决于你的系统的性质。