转换所有参数,返回类型,类定义以使用接口

时间:2009-12-25 20:55:05

标签: c# oop interface

我正在将所有参数,返回类型,类转换为所有使用接口,即。 IUser而不是User。

除了维持这个所需的额外代码之外,他们对这种方法有任何负面影响吗?

6 个答案:

答案 0 :(得分:3)

这不是一种不常见的方法,特别是如果你做了很多嘲笑;但它有问题:

  • 数据绑定支持(特别是在向表中添加行时)
  • xml序列化(包括通信WCF,asmx等)或基于合同的序列化

您需要弄清楚模拟等的优势是否超过这些问题。可能是您在大多数情况下使用IUser,但(例如)在通信层,使用原始DTO而不是接口可能更简单。

请注意,我将上述内容应用于课程。如果您涉及结构,那么请记住,在大多数情况下,这也将涉及拳击。

答案 1 :(得分:3)

总的来说,这将为您提供与松耦合相关的所有优势,因此总的来说,我认为这是一个巨大的胜利。但是,既然你问了一些不利因素,我可以想到一些小问题:

  • 还有更多代码,因为你有接口声明和至少一个实现(你已经提到过这个,所以我只是为了完整起见而包含它)。
  • 代码更难难以导航,因为您不能只是转到定义来查看另一种方法的作用(尽管我被告知Resharper有助于这方面)。
  • 在某些情况下,合同中可能存在的内容多于仅仅语义,并且界面无法捕获该内容。 BCL的典型示例是,如果您实现IList,则每次添加项目时必须递增Count属性。但是,作为开发人员,界面中的任何内容都不会强迫您执行此操作。在这种情况下,抽象基类可能值得考虑。
  • 添加新成员时,接口脆弱。您可以再次consider abstract base classes instead

答案 2 :(得分:2)

我曾经历过一个阶段,但实际上发现,对于贫血的数据对象(即POCO),不需要接口。

在实践中,使用接口来定义行为合约可能很有用,但不一定是属性。

一般情况下,我建议您让您的单元测试指导您。如果您的应用程序中有丰富的对象,那么您很可能需要接口。如果你有POCO,你很可能只需要它们用于控制器式的类。

答案 3 :(得分:1)

接口是非常好的,但将它们应用于所有工件是过度的。特别是在java中,你最终会得到两个不同的文件(接口+实现)。所以(一如既往),它真的取决于:)

关于'界面或非界面'

  • 我不会让域对象有接口(例如用户)。在我对代码理解的看法中,它相当令人困惑(对于域对象接口,通常会定义getter方法)。最近,实现单元测试并拥有域对象接口真的很痛苦。我不得不模仿所有这些getter并将测试数据放入域对象模拟中是相当麻烦的。
  • 粗粒度服务和api接口的情况正好相反。对于他们来说,我从一开始就总是有一个界面。
  • 在更多内部模块封装的场景中,我从没有接口开始,经过一些代码演变后,如果有必要做出反应并进行提取 - 接口重构。
接口工件名称的

'I'前缀

我还习惯使用Ixxx前缀,但我(很高兴)现在摆脱了它,原因如下:

  • 很难在不断发展的代码库中保持所有这些'I'命名约定,特别是如果你重构很多(extract-interface,collapse-interface等)。
  • 对于客户端代码,无论类型是接口还是基于类
  • ,它都应该是透明的
  • '我'可以让你懒得好的界面和类名。

答案 4 :(得分:1)

不是缺点而是警告。你会发现为了实现良好的组件去耦,你需要使用一个依赖注入框架(即如果你想保持理智并且知道你的接口映射到什么)。

往往会发生的是,非平凡的类有时会自然地转换为多个接口。当您使用公共静态方法(即User.CreateAdminUser)时尤其如此。您还会发现,获取状态AND 执行内容的界面更难。接口通常更自然是一个或另一个。

如果您陷入困境,请花一点时间研究一下您正在尝试实施的适当范例。有可能之前有人解决了这种特殊的设计模式。考虑到这是一项重要的重构工作,您可能需要花费额外的时间并正确地完成它。

答案 5 :(得分:-2)

避免使用ISuck前缀。

编辑ISuck约定是应用于类型名称的Systems Hungarian表示法的表现形式。