【发布时间】:2010-12-31 08:03:34
【问题描述】:
不久前我开始了我的编程生涯。据说,如果你把数据和算法结合在一起,那么你就得到了一个程序。这正是我现在所做的,但我听到了这些理论:
- 为今天而构建,为明天而设计
- 在编码之前,让每个模块尽可能清晰
- 您的代码不应被少数人理解
-
为可预测的变化做好准备
总而言之,我没有遇到任何关于接口的理论。我想知道何时何地使用接口来满足良好的标准。
也许你知道很多。然后给我一些建议!例子太棒了!
【问题讨论】:
标签: interface
不久前我开始了我的编程生涯。据说,如果你把数据和算法结合在一起,那么你就得到了一个程序。这正是我现在所做的,但我听到了这些理论:
为可预测的变化做好准备
总而言之,我没有遇到任何关于接口的理论。我想知道何时何地使用接口来满足良好的标准。
也许你知道很多。然后给我一些建议!例子太棒了!
【问题讨论】:
标签: interface
对不起,如果答案很笼统,但它和问题一样笼统。
【讨论】:
在 Java 术语中,JDBC API 是接口强大功能的绝佳示例。 DB 供应商提供他们自己的 JDBC 驱动程序(它只是 JDBC API 的具体实现),您可以编写统一的 JDBC 代码,而不必担心与数十种不同数据库的兼容性。
【讨论】:
【讨论】:
当您将代码设计为高度可测试时,接口很有用。如果您引用的是接口而不是具体的类,那么测试它们会容易上百万倍。
当您定义跨应用程序或框架的标准行为时,接口也很有用。想想像 IDisposable 和 INamingContainer 这样的东西,它们在很多地方都有不同程度的用处。 IDispose.Dispose() 用于释放非托管资源。 “如何”取决于实现者,但它存在的事实对外部世界意味着什么。
【讨论】:
如果您已经阅读了所有这些行话,但还没有弄清楚它们的含义,那么您没有阅读所有正确的书籍。
试试:
我知道它帮助了我很多。
干杯
【讨论】:
当您学习驾驶时,您关心的是汽车的界面(踏板、制动器、方向盘),而不是其实现方式:盘式制动器和鼓式制动器是通过相同的界面(踏板)访问的。您不关心它们的性质,它们的驱动方式等……除非您是机械师。当您开车时,您只需通过它们的通用界面访问它们。性能可以不同,但行为不会。
编程时有两个控制问题,一个是技术问题,另一个是面向业务的
处理面向接口的编程是解决这两个问题的好方法。您越能将复杂性隐藏在定义明确的通用接口的漏斗后面,您的交互就越少(因为您现在将大量实体视为不再由子部分组成的单个、整体、复杂实体),并且您可以更好地并行开发任务,因为每个人都可以解决他擅长的问题,而不必搞乱他不擅长的领域。
【讨论】:
我尝试用一个实用的例子来简化:
////////////////////
//VERY(!) simplified, real forums are more complex.
public interface ForumActions{
/** @throws UserDisallowedException, email is not allowed to post. */
Thread startThread(String email, String threadName, String description)
throws UserDisallowedException;
/** @throws UserDisallowedException, email is not allowed to comment. */
void commentThread(String email, Thread thread, String comment)
throws UserDisallowedException;
}
///////////////////////////
//IMPLEMENTATION 1
public class StackOverflowForum implements ForumActions{
/**
* @param email Email of poster, which must have been registered before.
*
* @throws UserDisallowedException The mail address is not registered
*/
public Thread startThread(String email, String threadName, String description)
throws UserDisallowedException {
if(isNotRegistered(email))
throw new UserDisallowedException(...);
...
return thread;
}
}
...
}
///////////////////////////
//IMPLEMENTATION 2
public class JavaRanchForum implements ForumActions{
/**
* @param email Email of poster, which mustn't have exceeded a posting-limit per day.
* This way we protect against spammers.
*
* @throws UserDisallowedException, the mail was identified as a spamming origin.
* is mandatory for posting threads.
*/
public Thread startThread(String email, String threadName, String description)
throws UserDisallowedException {
if(isSpammer(email))
throw new UserDisallowedException(...);
...
return thread;
}
}
...
}
如你所见,接口本身就是一个合约,它是以下各项的组合:
上面的类是接口的实现,它们必须遵循它的契约。 因此,接口不应该对实现必须“如何”实现合同过于严格(在我的情况下:为什么不允许用户发布/评论 -> 垃圾邮件发送者与未注册)。
如前所述,非常简化的示例,到目前为止还不是接口的完整参考。
有关接口(和一般面向对象)的非常有趣和实用的示例,请查看head first design patterns。既适合新手也适合专业人士
【讨论】: