Rails 为 Ruby 引入了一些核心扩展,例如3.days.from_now
它会返回,正如您期望的三天后的日期一样。使用 C# 中的扩展方法,我们现在可以执行类似的操作:
static class Extensions
{
public static TimeSpan Days(this int i)
{
return new TimeSpan(i, 0, 0, 0, 0);
}
public static DateTime FromNow(this TimeSpan ts)
{
return DateTime.Now.Add(ts);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
3.Days().FromNow()
);
}
}
或者怎么样:
static class Extensions
{
public static IEnumerable<int> To(this int from, int to)
{
return Enumerable.Range(from, to - from + 1);
}
}
class Program
{
static void Main(string[] args)
{
foreach (var i in 10.To(20))
{
Console.WriteLine(i);
}
}
}
这是从根本上错误的,还是有时这是一个好主意,就像在 Rails 这样的框架中?
我非常喜欢扩展方法,但我确实觉得当它们在 LINQ 之外使用时,它们会以牺牲可维护性为代价来提高可读性。
Take 3.Days().FromNow()
举个例子。这非常具有表现力,任何人都可以阅读这段代码并准确地告诉您它的作用。这真是一件美丽的事情。作为编码员,我们很高兴编写具有自我描述性和表现力的代码,这样它几乎不需要注释并且阅读起来很愉快。这段代码在这方面至关重要。
然而,作为编码员,我们也对后代负责,而我们之后的人将花费大部分时间试图理解这段代码是如何工作的。我们必须小心,不要太具有表现力,以至于调试我们的代码需要在无数的扩展方法之间跳跃。
扩展方法掩盖了“如何”,以更好地表达“什么”。我想这使得它们成为一把双刃剑,最好适度使用(就像所有东西一样)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)