Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS依赖性注射有什么好处?_Angularjs_Dependency Injection - Fatal编程技术网

AngularJS依赖性注射有什么好处?

AngularJS依赖性注射有什么好处?,angularjs,dependency-injection,Angularjs,Dependency Injection,我已经在angular上工作了一段时间,但我看不出它是如何比我以前的编码方式有所改进的 首先,我看不出用一个中心对象来保存项目有什么不对,毕竟,注入器是一个单体,它可以在中心位置查找依赖项,所以angular确实有一个中心对象,它只是隐藏的。如果操作正确,则间距不一定意味着耦合。即使完成了,您也不需要代码的每个对象都和其他对象松散耦合。此外,任何时候你创建一个独立的JS脚本,你都必须将它包装成angular,这样才能使它们一起很好地发挥作用 第二,每次声明所有依赖项都非常冗长(尤其是缩小),因此

我已经在angular上工作了一段时间,但我看不出它是如何比我以前的编码方式有所改进的

首先,我看不出用一个中心对象来保存项目有什么不对,毕竟,注入器是一个单体,它可以在中心位置查找依赖项,所以angular确实有一个中心对象,它只是隐藏的。如果操作正确,则间距不一定意味着耦合。即使完成了,您也不需要代码的每个对象都和其他对象松散耦合。此外,任何时候你创建一个独立的JS脚本,你都必须将它包装成angular,这样才能使它们一起很好地发挥作用

第二,每次声明所有依赖项都非常冗长(尤其是缩小),因此从可读性的角度来看,与适当的名称空间相比没有什么好处

第三,性能增益最小。它迫使我在任何地方都使用单例,但如果需要的话,我可以自己做,而且大多数时候我不会(网络和DOM操作是我的瓶颈,而不是JS对象)

最后,我喜欢“增强的”HTML和自动双向绑定,但我看不出注入如何比其他框架处理依赖性的方式更好,因为它甚至没有像require.js那样提供动态加载。我没有看到任何用例在编码时对自己说“哦,这比以前好多了,我明白了”

你能给我解释一下这个技术选择给项目带来了什么好处吗


我现在只能看到一个:公约和最佳做法执行。创建lib生态系统是一个巨大的挑战,但目前我在angular社区中还看不到它的成果。

对于我来说,angular的依赖注入在改善我的项目方面有几个方面,我将在这里列出。我希望这将向您展示其他人如何从中受益,但如果您是组织良好、经验丰富的JS开发人员,那么对您来说可能就不同了。我认为在某种程度上,这只是开发自己的工具和编码指南的问题

统一的声明性依赖项解析 JS是一种动态语言(这是新的,对吧?),它给了程序员很大的能力,甚至更多的责任。组件可以通过传递各种对象(常规对象、单例、函数等)以各种方式相互交互。它们甚至可以使用其他组件甚至没有提到的代码块

JS从来没有(也很可能永远不会)像其他语言(Java、C、C#)一样,有一种统一的方式来声明公共、私有或包(模块)作用域。当然也有封装逻辑的方法,但是如果问任何一个语言新手,他都不知道如何使用它

我喜欢DI(不仅在角度上,而且在一般情况下)的一点是,您可以列出组件的依赖项,并且您不必担心这个依赖项是如何构造的。这对我来说非常重要,尤其是Angular中的DI允许您解析这两种组件:来自框架本身的组件(如
$http
),或自定义组件(如我最喜欢的
eventBus
,我正在使用它在
事件处理程序上包装
$)

我经常看到一个服务的声明,我知道它是做什么的,以及它是如何做的,只是通过查看依赖关系

如果我要构建和/或使用组件本身深处的所有这些对象,那么我必须始终彻底分析实现,并从各个方面进行检查。如果我在依赖项列表中看到
localStorage
,我就知道我正在使用HTML5本地存储来保存一些数据。我不必在代码中查找它

组件的寿命 我们不需要再为某些组件的初始化顺序操心了。如果
A
依赖于
B
,则DI将确保
B
A
需要时准备就绪

单元测试 当您使用DI时,模拟组件会有很大帮助。例如,如果您有控制器:
函数Ctrl($scope,a,b,c,d)
,那么您立即知道它依赖于什么。您注入了适当的模拟,并确保所有与您的控制器交谈和倾听的各方都是隔离的。如果您在编写测试时遇到困难,那么您很可能弄乱了抽象层次,或者违反了设计原则(直径定律、封装等)

好习惯 是的,您很可能可以使用名称空间来正确管理对象的生命周期。在需要的地方定义singleton,并确保没有人会弄乱您的私人成员。 但是,老实说,如果框架可以为您做到这一点,您会需要它吗? 直到我学会了Angular,我才开始使用JS“正确的方式”。这并不是说我不在乎,我只是不必在意,因为我只是在使用JS进行一些UI,主要基于jquery

现在它不同了,我得到了一个很好的框架,它迫使我有点跟上良好的实践,但它也给了我强大的能力来扩展它,并利用JS的最佳特性

当然,即使是最好的工具,差劲的程序员也能做到收支平衡,但从我最近阅读D.Crockford的《JS的好部分》所学到的,人们用它做了很多肮脏的事情。多亏了jQuery、Angular等伟大的工具,我们现在有了一些很好的工具,可以帮助编写好的JS应用程序,并在编写过程中坚持最佳实践

结论 正如您所指出的,您可以通过至少做以下三件事来编写好的JS应用程序:

  • 名称空间-这避免了向全局名称空间添加内容,避免了潜在的冲突,并允许在需要时轻松解决适当的组件
  • 创建可重用组件/模块-按,fo