编程到接口意味着什么?
我一直在大多数与编程相关的网站上听到这样的声明:
编程到接口而不是实现
但是我不明白其中的含义?
举例说明会有所帮助。
编辑:我收到了很多很好的答案,所以你可以用一些代码片段来补充它,以便更好地理解这个主题。谢谢!
我一直在大多数与编程相关的网站上听到这样的声明:
编程到接口而不是实现
但是我不明白其中的含义?
举例说明会有所帮助。
编辑:我收到了很多很好的答案,所以你可以用一些代码片段来补充它,以便更好地理解这个主题。谢谢!
您可能正在寻找类似这样的东西:
public static void main(String... args) {
// do this - declare the variable to be of type Set, which is an interface
Set buddies = new HashSet();
// don't do this - you declare the variable to have a fixed type
HashSet buddies2 = new HashSet();
}
为什么第一种方式被认为是好的?假设稍后您决定需要使用不同的数据结构,例如LinkedHashSet,以便利用LinkedHashSet的功能。代码必须像这样更改:
public static void main(String... args) {
// do this - declare the variable to be of type Set, which is an interface
Set buddies = new LinkedHashSet(); // <- change the constructor call
// don't do this - you declare the variable to have a fixed type
// this you have to change both the variable type and the constructor call
// HashSet buddies2 = new HashSet(); // old version
LinkedHashSet buddies2 = new LinkedHashSet();
}
这似乎并不那么糟糕,对吧?但是,如果你以同样的方式写getters呢?
public HashSet getBuddies() {
return buddies;
}
这也必须改变!
public LinkedHashSet getBuddies() {
return buddies;
}
希望你看到,即使有这样的小程序,你也会对你声明变量的类型产生深远的影响。由于对象来回移动得如此之多,如果您只是依赖于将变量声明为接口,而不是该接口的特定实现(在这种情况下,将其声明为Set,而不是LinkedHashSet或其他任何东西),那么它肯定会有助于使程序更容易编码和维护。它可以是这样的:
public Set getBuddies() {
return buddies;
}
还有另一个好处,因为(至少对我来说是这样)这种差异可以帮助我更好地设计程序。但希望我的例子能给你一些想法...希望它有帮助。
有一天,一位初级程序员被他的老板指示编写一个应用程序来分析业务数据,并将其全部压缩到带有指标,图形和所有内容的漂亮报告中。老板给了他一个XML文件,上面写着“这里有一些示例业务数据”。
程序员开始编码。几周后,他觉得这些指标、图表和其他东西已经足够让老板满意了,于是他展示了自己的作品。“那太好了,”老板说,“但是它能不能也显示我们所拥有的这个SQL数据库中的业务数据呢?
程序员又回到了编码。在他的应用程序中散布着从 XML 读取业务数据的代码。他重写了所有这些片段,用“if”条件包装它们:
if (dataType == "XML")
{
... read a piece of XML data ...
}
else
{
.. query something from the SQL database ...
}
当看到软件的新迭代时,老板回答说:“这很好,但它也可以报告来自这个Web服务的业务数据吗?想起所有那些乏味的陈述,如果他必须再次重写,程序员变得愤怒。“首先是 xml,然后是 SQL,现在是 Web 服务!业务数据的真正来源是什么?
老板回答说:“任何能提供的东西”
那一刻,程序员开悟了。