实际上为什么我会使用鸭子打字或反转控制?

时间:2011-04-18 04:19:53

标签: java c++ inversion-of-control

我刚开始学习鸭子打字和控制倒置。

在实际的现实世界中,为什么我要将这些概念合并到我的代码中?

5 个答案:

答案 0 :(得分:7)

编码到接口有许多好处,即使您没有像评论中暗示的那样“为其他开发人员开发代码”。讨论这些好处是值得的,但是由于这个问题需要现实世界的例子/用例,这里有:

  • 进行测试。 IoC可以很容易地引入模拟和其他简化/测试类,这些类允许测试特定单元而无需将项目的所有依赖项纳入其中。
  • 在某些依赖项可用之前实现应用程序的特定部分。 (类似于测试案例)
  • 为不同用户提供不同的功能集。您可以拥有给定模块的多个“版本”,并将适当的模块提供给不同类型的客户:评估版,标准版,高级版甚至Beta测试版。只要模块的API得到遵守,应用程序的其余部分就可以正常运行,而不必担心使用模块的特殊性质。
  • 使用特定框架。这个例子可能被视为循环引用:“为什么这些框架首先使用IoC?”,但事实是IoC模式在几个本身非常有用的库和框架中无所不在。
  • 创建拦截器。虽然拦截器是一种有用的调试设备,但它们也可以用于很多目的。

请注意我是如何尝试并仅提供带有非常明确用例的示例 。请注意,使用IoC和相关概念还有许多其他原因(例如,为了帮助生成模块化设计,提高可读性......)但是这样的原因/优点更加微妙,不那么客观,但也可能只是如此重要!

答案 1 :(得分:2)

据我所知,依赖注入是一种设计模式,它由Inversion of Control实现,更接近于软件设计的原则。

依赖注入的一个例子可能是将Car和Engine分成两个独立的类。汽车需要一个发动机才能运转,并且可以使用任何发动机运行。然后引擎依赖注入汽车。

IoC / Dependency的一个好处是明确分离类及其用途。在不制动代码的情况下,可以用另一个类替换一个类。依赖注入可以在运行时完成,这样可以轻松地重新配置软件。

答案 2 :(得分:1)

最近的一次经历告诉我,在使用IoC时,生活变得多么容易。在最近的一项工作中,我不得不清理用户提交的html。在项目的许多地方使用相同的清洁服务。但是之前的正则表达式清洁工并不适用于某些特定情况。我刚刚用JSoup库编写了一个新实现,并在需要的地方进行了链接。使用Spring IoC切换变得如此简单:)

答案 3 :(得分:0)

就IoC主题引用此article

  

使用面向对象的设计原则和功能(如接口,继承和多态),IoC模式可以实现更好的软件设计,以便促进重用松散耦合和< em>轻松测试软件组件。

强调我的

这听起来像是我很好的理由。你在寻找更多吗?

至于Duck Typing,陪审团仍然没有,IMO。它在某些情况下有一些很好的好处,但会导致更多的运行时错误。

答案 4 :(得分:0)

IoC基本上可以帮助您在开发时将实例化与代码分离。因此,运行时对象可以被一些称为容器的外部代理注入(而不是代码实例化它们) - 只要它们遵守接口即可。程序到界面是设计模式书中的第一个原则。而且优势很大。在IoC中,它有助于解耦代码。

依赖注入和依赖性拉取是IoC的两种不同形式。

看看这个link

一个侧面点 - 在java世界中,Spring框架甚至允许引入新方法。

不确定DuckTyping。