是否所有的对象都有一个接口?
我对我正在开发的应用程序中过度使用接口有一些担忧。这是一个报告应用程序,它只是执行SQL语句并分析一些存储列属性的XML。是否所有的对象都有一个接口?
我已经结束了为每个类创建接口,所以我可以换出实现。我们都看到某种形式的以下内容:
interface IFoo
{
IBar GetBar();
}
class FooA : IFoo
{
IBar GetBar()
{
return new BarA();
}
}
class FooB : IFoo
{
IBar GetBar()
{
return new BarB();
}
}
我理解的优势,以发展这种方式包含具体的实施细则类,而应这种模式应遵循的在我的应用程序的每个类?
这里是我的应用程序(简体)例如:
interface IColumnDefinition
{
int Ordinal { get; }
string HeaderColor { get; }
}
class ColumnDefinition : IColumnDefinition
{
private readonly int _ordinal;
private readonly string _headerColor;
public int Ordinal { get { return _ordinal; } }
public string HeaderColor { get { return _headerColor; } }
public ColumnDefinition(int ordinal, string headerColor)
{
_ordinal = ordinal;
_headerColor = headerColor;
}
}
如果我只是分配一个以后可以使用只读属性值,什么是真正创造这个单独IColumnDefinition接口的地步?
微软不在他们的System.Data.DataColumn
或他们的System.Windows.Forms.DataGridViewColumn
中使用接口,对我来说是否合理使用它,为什么? PS:请不要把我钉死在十字架上,因为微软不做任何事情,我也不应该 - 这些只是广泛使用的类似对象的两个例子,由知道更多的人创建关于编程比我
提取接口从什么是基本数据传输对象是在典型情况确实矫枉过正(所有的东西,有是例外)。你想代码到接口的表达逻辑类,你希望有灵活的替换原因或其他(例如,单元测试!)的逻辑。但是,如果您正在更换的类只保存数据,则只需使用该类。如果后来你发现你需要注入有意义的逻辑,那么在这个时候继续并提取接口,如果它可以帮助你的话。
要清楚,我不希望ColumnDefinition
,因为你已经定义它,实现一个接口,没有比我更期待与接口,而不是string
,int
,或DateTime
(*)的工作。代码作用于ColumnDefinition
的实例将是我可能期望找到接口实现的地方,特别是当我想要摆脱那个特定逻辑时(当我测试其他代码依赖于它时,或者如果其他代码应该可以扩展等)。
*我有时发现需要更换DateTIme.Now
,但是,这并不需要在DateTime
类型的接口明确。
对我来说,除非你打算在这种特殊情况下使用多态,否则没有理由为每个对象都有一个接口。
接口对于多态性有很大的用处,或者当你在团队中有更多的开发人员时,所以你可以使用接口作为开发人员之间的“契约”。
请注意,给定的考虑是只为你的具体情况(接口有比我指定的人更多用法)
快速的思想实验:如果你的应用程序,它的整个生命周期过程中,将永远不会有一个以上的执行界面(不包括单元测试代码),那么你浪费了你创建界面的时间。
诀窍是如何知道您的应用程序在其整个生命周期内永远不会有多个接口的实现(不包括单元测试代码)。
当然,如果你不能知道,那么一个受过教育的猜测将不得不这样做。
的选择,当然,是在创建之前,要等到你需要接口。一般来说,我宁愿等到我需要什么东西才能创建它。
有人会争辩所有对象做有一个接口 - 无论它们是否使用可共享定义interface
或不。一个类的非私有方法/属性可以被认为是它的“接口”。
原因之一(据推测)为什么DataColumn
没有定义interface
是因为它是为一个目的而设计的 - 定义一个DataTable
的列。 DataTable
类的设计者可能没有看到取消定义和允许使用多个实现的价值。
使用interface
小号他们有意义 - 你希望能够存根或模拟的单元测试,当一个类的多个实现将是有价值的任何时候(如IDataReader
)等。如果有一个接口提供没有价值,那么不要打扰。像Resharper这样的工具提供了一种简单的机制,可以将类中的公共方法/属性提取到接口中,稍后需要。
拥有每个班级的interface
很可能矫枉过正。
请参阅[只是我或接口过度使用?](http://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused) – Romoku 2013-03-28 02:10:59