始终拥有最抽象的参数是否是一个原则?如果是,它有名称吗?
Is it a principle to always have the most abstract parameters and if so does it have a name?
例如,整数数组上可能有一个方法 max。
public static int Max(int[] ints)
{
var max = ints[0];
foreach(var i in ints)
{
if(i > max)
{
max = i;
}
}
return max;
}
但实际上我们并没有利用我们使用数组的事实,只是我们可以迭代它们,我们不需要整数,我们只需要一个知道如何比较自身的对象。所以一个更强大的方法可能是:
public static T MyMax<T>(IEnumerable<T> ts) where T : IComparable<T>
{
var max = ts.First();
foreach(var i in ts)
{
if(i.CompareTo(max) > 0)
{
max = i;
}
}
return max;
}
而且我猜上面的内容打折了 IEnumerable<T>
可能是无限的这一事实,这将导致它无限期地挂起,但是为什么你首先要尝试找到一个无限可迭代的 Max。
我想表达的观点是,第二种方法比前一种方法更强大,因为它根据需要对其参数做出最少的假设。这样的原则有名称吗?这甚至是一件事吗?
提前致谢。
我将此称为接口编程。
Programming to an Interface 的设计原则在声明变量的上下文中最常被提及,这就是著名的四人帮书籍介绍该原则的方式;但它同样适用于声明方法参数。
Don't declare variables to be instances of particular concrete classes. Instead, commit only to an interface defined by an abstract class. You will find this to be a common theme of design patterns...
这里所说的变量可以从广义上考虑,包括方法参数
例如,整数数组上可能有一个方法 max。
public static int Max(int[] ints)
{
var max = ints[0];
foreach(var i in ints)
{
if(i > max)
{
max = i;
}
}
return max;
}
但实际上我们并没有利用我们使用数组的事实,只是我们可以迭代它们,我们不需要整数,我们只需要一个知道如何比较自身的对象。所以一个更强大的方法可能是:
public static T MyMax<T>(IEnumerable<T> ts) where T : IComparable<T>
{
var max = ts.First();
foreach(var i in ts)
{
if(i.CompareTo(max) > 0)
{
max = i;
}
}
return max;
}
而且我猜上面的内容打折了 IEnumerable<T>
可能是无限的这一事实,这将导致它无限期地挂起,但是为什么你首先要尝试找到一个无限可迭代的 Max。
我想表达的观点是,第二种方法比前一种方法更强大,因为它根据需要对其参数做出最少的假设。这样的原则有名称吗?这甚至是一件事吗?
提前致谢。
我将此称为接口编程。
Programming to an Interface 的设计原则在声明变量的上下文中最常被提及,这就是著名的四人帮书籍介绍该原则的方式;但它同样适用于声明方法参数。
Don't declare variables to be instances of particular concrete classes. Instead, commit only to an interface defined by an abstract class. You will find this to be a common theme of design patterns...
这里所说的变量可以从广义上考虑,包括方法参数