Java 实际上,我为什么要使用duck类型或控制反转?

Java 实际上,我为什么要使用duck类型或控制反转?,java,c++,inversion-of-control,Java,C++,Inversion Of Control,我刚刚开始学习鸭子打字和控制反转 在实际的例子中,我为什么要将这些概念纳入我的代码中?在IoC主题中引用这一点: 使用面向对象的设计原则和特性,如接口、继承和多态性,IoC模式可以实现更好的软件设计,从而促进软件组件的重用、松散耦合和轻松测试 (强调矿山) 这些对我来说似乎是很好的理由。你在找更多吗 至于Duck类型,在我看来,这个问题还没有定论。它在某些情况下有一些不错的好处,但会导致更多的运行时错误可能性。据我所知,依赖注入是一种设计模式,它是通过控制反转实现的,这更接近软件设计中的原则 依

我刚刚开始学习鸭子打字和控制反转

在实际的例子中,我为什么要将这些概念纳入我的代码中?

在IoC主题中引用这一点:

使用面向对象的设计原则和特性,如接口、继承和多态性,IoC模式可以实现更好的软件设计,从而促进软件组件的重用、松散耦合和轻松测试

(强调矿山)

这些对我来说似乎是很好的理由。你在找更多吗


至于Duck类型,在我看来,这个问题还没有定论。它在某些情况下有一些不错的好处,但会导致更多的运行时错误可能性。

据我所知,依赖注入是一种设计模式,它是通过控制反转实现的,这更接近软件设计中的原则

依赖注入的一个例子是将汽车和发动机分离为两个独立的类。这辆汽车需要一个发动机才能运转,并且可以与任何发动机一起运转。然后发动机被注入汽车


IoC/依赖性的一个好处是类及其用途的明确分离。一个类可以被另一个类替换,而无需中断代码。依赖项注入可以在运行时完成,这样可以方便地重新配置您的软件。

对接口进行编码有很多好处,即使您没有如评论中所暗示的那样“为其他开发人员开发代码”。讨论这些好处是一个有价值的练习,但由于问题要求提供真实世界的示例/用例,下面是:

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

请注意我是如何尝试的,并仅提供带有非常清晰用例的示例。请注意,使用IoC和相关概念还有许多其他原因(例如,帮助制作模块化设计,提高可读性……),但这些原因/优势更微妙,更不客观,但同样重要

最近的一次经历告诉我,使用IoC时,生活变得多么轻松。在最近的一项工作中,我必须清理用户提交的html。该项目的许多地方都使用了相同的清洁服务。但以前的正则表达式清理器在某些特定情况下不起作用。我刚刚用
JSoup
库编写了一个新的实现,并将它链接到需要的地方。使用SpringIOC切换变得非常简单:)

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

依赖注入和依赖抽取是两种不同形式的IoC

看看这个

java world Spring框架中的一个侧重点甚至允许引入新方法


不确定DuckType。

IoC被宣传为“制作组件,让用户决定如何插入”类型的交易,不是吗?是的,但我通常不会为其他开发人员开发代码。如果我在设计一个API或者其他什么的话,我会用这个吗。。。我在想象一个场景,相同的代码将为不同类型的客户端提供服务,比如智能手机应用程序、网站和桌面应用程序。。。你写一次,合并三次。对一个人来说,听起来像是一个大项目。以我的经验,设计界面首先会让你想到涵盖完整的功能。Aflac也会江湖郎中,但它不是鸭子。+1-有点愤世嫉俗,但也是真的:)哈哈,是的+1让我笑了,你把它变成了一个严肃的回答。“一个伟大的笑话在今天消失了。”@B战神和其他人。是的,我没有忘记这个笑话。。。我不得不应付当地的干扰,因此一开始我的反应就缩短了。当评论指出这一点时,我大笑了一声,但幽默不是故意的。我想我应该完成这个答案,因为IoC应该得到更好的待遇。没错,在处理大型项目时,用这种方式编辑代码似乎更容易。+1真正的价值来自于松散耦合的服务components@CodinglsAwesome看我的回答好的是的这些都是很好的理由,但是我的老板可以对我的代码的创造性少加指责。很不幸,这与创造力无关,与全面的可测量的改进有关。促进重用意味着您不必花费时间、金钱等来一次又一次地重新实现几乎相同但不完全相同的代码(+测试成本)。松散耦合意味着,如果您的需求发生了变化,您就不必改变其他一切(也意味着更容易制作新东西)。E