春の学習シリーズの(b)の十分な理解:制御の反転(IOC)と依存性注入(DI)

1.HelloWorldとモジュール化

いくつかの出力機能を実現するために、関数[A]のHelloWorldを入力します(ここでは、関数Aによって表されるが、もちろん、関数Aもすることができ、より複雑な機能):チームの開発において、我々はそのような情報が必要[Enter]をを持っています。

しかし、システムアプリケーションにおける単機能Aよりも確かに多くは、多くの場合、他の関数B、Cを持っている...一連の機能を備え、これらの異なる機能は、完全なビジネス・システムを構成します。

たとえば、HelloWorldのプログラムでは、我々だけでなく、出力のHelloWorldにしたい、我々はまたHelloJava、HelloSpringやその他の情報をエクスポートします。

この単一のプログラムでは、我々はこの集中型の開発モデルは問題ありません使用します。しかし、チームの開発に、このように複雑なシステムは、(低効率の深刻な、共同開発を結合するというように、柔軟ではない)非常に悪いことだろう。
今回は、それは、HelloWorldのアップグレードをカプセル化するために、(パッケージはオブジェクト指向言語の共通の特徴である)、それ自体がアーティファクトJavaパッケージを再配置する必要があります。(別のモジュールにパッケージ化等の機能A、機能B、機能C、)

「完了同僚をB'HelloJavaことで、このように、あなたとあなたの同僚はあなたの完了A'HelloWorldによって分業になります。単機能の変更は、メインプログラムを変更しない場合や、モジュール式の後、あなただけの対応する機能モジュールを変更することができます。

私たちの主なこんにちは(そのようにそれをヤードの農家を行い、組立ラインの効率MAX?)の生産を効率化することができ、コードを記述し、組立部門となりました。

今、私たちがパッケージを知っていること、そして、上記の手順は、それを変換したい場合があります。

機能A、機能Bが同じことをやっているのでもちろん、このような変換は、我々はパッケージを持っていました。モジュールは、異なる機能のために包装(隠蔽及びコードの独立性を増加させる)、これはパッケージされている場合は、同様の機能のために(コードの再利用性を向上させるため)。
概要:社会開発、ビジネスの変化、および需要が変化する、プログラマは思考のシリーズを学ばなければならない:カプセル化、モジュール式の組立ラインは、コードの堅牢性と拡張性を強化し、変更することは常に束縛のニーズに応えます。

2.クラスとクラス間の関係

万物皆对象,在Java中类是对 对象的描述(定义),类中的属性和方法就是对 对象的状态和行为的描述。

一个Java系统应用是由许多类组成的,那么这些类之间有什么样的关系呢?

 

 

类与类之间大体上有三种关系:

  • 继承关系(泛化)针对类或接口的子类的extends,针对抽象类或接口的实现类的implements。
  • 关联关系(依赖)依赖分为弱依赖(在方法/行为中发生依赖)和强依赖(在属性/状态中发生依赖),在依赖关系中我们更多的关注强依赖关系:包括聚合(has a,)和组合(contains a)两种形式(两者简单的区别是:聚合的依赖可以独立存在,而组合的依赖不能独立存在)。在开发中我们更多的使用聚合关系,例如JavaBean。
  • 独立关系(无关)两个类之间不发生交互。

更详细的资料可以查阅UML(统一建模语言)的相关知识,其中会对类图以及类关系作详细描述,也可参考《UML精粹》等书籍,这些对面向对象设计(OOD)很有帮助。 

我们在面向对象编程(OOP)中关注的问题是,如何处理类与类之间复杂的依赖关系。

 3.控制反转和依赖注入

在学习控制反转和依赖注入的过程中Martin Fowler的文章是必读的,描述的非常详细。这里是学习后的一个总结。

  • 对比模块化中的功能A和功能B,这些功能可以是远程的服务也可以是本地化的组件(介绍模块化的必要)。
  • 而文章中主要讨论的问题就是如何在Hello中调用这些功能HelloWorld,HelloJava(介绍类与类关系的必要)。
  • 在应用程序中控制的就是在当前的应用程序中new来控制插件的实例化。现在应用程序不在关注插件的实例化,交由框架(装配器)进行实例化(把控制权交出去了)这就是所说的控制反转。
  • 而框架在实例化的时候通常采用两种方式:依赖注入(将实例化的插件放入IOC容器中)和服务定位(通过服务定位器来获取实例化的插件,由内部的装配器负责实例化,服务定位器只负责获取),两者更清晰的区别可以对比原文的两种方式的图例。
  • 依赖注入的三种方式:接口方式,Setter方式,构造器方式。都是通过方法来注入实例化的依赖,不同的是方法的类别不同:接口方式的方法是实现接口中定义的方法来注入,Setter方式是通过属性的setter方法注入,构造器方式则是通过构造方法来注入。
  • 服务定位器的两种方式:静态的是将依赖定义为属性,动态的是将依赖放入定义的容器对象中。
  • 这些技术都能够达到控制反转的目的,根据不同的需要选择不同的方式实现即可。

简单来说,控制反转和依赖注入就是在描述一件事。
控制反转提出问题:我是应用程序,我不想关注我所依赖的对象是怎么创建的了。我把创建对象的控制权交出去了,具体怎么实现我不管,我只负责拿来用就可以了。
依赖注入解决问题:我是装配器(容器),我来负责创建对象,这件事我比较擅长(当然别人也可以做到比如说服务定位器,Service Locator)。而且我可以通过三种方式创建:接口,Setter,构造器。

4、总结
如果对一个问题表达的不清楚,只能说明理解的不够深入和透彻。当能够用自己的方式表达出正确的意思,那么应该算得上真正掌握吧。

おすすめ

転載: www.cnblogs.com/masting/p/11298423.html