`
json20080301
  • 浏览: 165704 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

软件设计原则

 
阅读更多

Inversion of Control Containers and the Dependency Injection pattern

一,为什么要IOC

IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已经讲解的非常精彩了,这里实在不敢班门弄斧,只好简单地解释几句。我们使用抽象接口来隔离使用者和具体实现之间的依赖关系,但是不管再怎么抽象,最终还是要创建具体实现类的实例,这种创建具体实现类的实例对象就会造成对于具体实现的依赖,为了消除这种创建依赖性,需要把依赖移出到程序的外部(比如配置文件)。使用依赖注入后,这些类完全是基于抽象接口编写而成的,所以可以最大限度地适应需求的变化。依赖注入的形式有三种,分别为构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。

 

三个概念:服务,组件,自动装配

服务是一个个接口,接口约定了服务,从而使随意替换服务的实现对使用接口服务的代码没有任何影响;

 

组件是一个可重用的程序单元,它实现了某个接口;组件是某个接口的实现类;

 

自动装配是指由容器自动管理组件之间的依赖关系;

 

分离关注:SEPARATION  OF CONCERNS SOC 是IOC 和AOP产生的原动力,关注点可以是组件components 方面aspects 或者 服务 services!

 

一些软件设计的原则:

Hollywood Principle – 好莱坞原则

好莱坞原则就是一句话——“don’t call us, we’ll call you.”。意思是,好莱坞的经纪人们不希望你去联系他们,而是他们会在需要的时候来联系你。也就是说,所有的组件都是被动的,所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。

简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:

  1. 不创建对象,而是描述创建对象的方式。
  2. 在代码中,对象与服务没有直接联系,而是容器负责将这些联系在一起。

控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

好莱坞原则就是IoC(Inversion of Control)或DI(Dependency Injection )的基础原则。这个原则很像依赖倒置原则,依赖接口,而不是实例,但是这个原则要解决的是怎么把这个实例传入调用类中?你可能把其声明成成员,你可以通过构造函数,你可以通过函数参数。但是 IoC可以让你通过配置文件,一个由Service Container 读取的配置文件来产生实际配置的类。但是程序也有可能变得不易读了,程序的性能也有可能还会下降。

参考

High Cohesion & Low/Loose coupling & – 高内聚, 低耦合

这个原则是UNIX操作系统设计的经典原则,把模块间的耦合降到最低,而努力让一个模块做到精益求精。

  • 内聚:一个模块内各个元素彼此结合的紧密程度
  • 耦合:一个软件结构内不同模块之间互连程度的度量

内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身。

参考

Convention over Configuration(CoC)– 惯例优于配置原则

简单点说,就是将一些公认的配置方式和信息作为内部缺省的规则来使用。例如,Hibernate的映射文件,如果约定字段名和类属性一致的话,基本上就可以不要这个配置文件了。你的应用只需要指定不convention的信息即可,从而减少了大量convention而又不得不花时间和精力啰里啰嗦的东东。配置文件很多时候相当的影响开发效率。

Rails 中很少有配置文件(但不是没有,数据库连接就是一个配置文件),Rails 的fans号称期开发效率是 java 开发的 10 倍,估计就是这个原因。Maven也使用了CoC原则,当你执行mvn -compile命令的时候,不需要指源文件放在什么地方,而编译以后的class文件放置在什么地方也没有指定,这就是CoC原则。

SPRING 2.5以后利用Annotation CONFIG 减少了配置文件,同时SPRING MVC也开始支持COC原则的配置

参考http://en.wikipedia.org/wiki/Convention_over_Configuration

Separation of Concerns (SoC) – 关注点分离

SoC 是计算机科学中最重要的努力目标之一。这个原则,就是在软件开发中,通过各种手段,将问题的各个关注点分开。如果一个问题能分解为独立且较小的问题,就是相对较易解决的。问题太过于复杂,要解决问题需要关注的点太多,而程序员的能力是有限的,不能同时关注于问题的各个方面。正如程序员的记忆力相对于计算机知识来说那么有限一样,程序员解决问题的能力相对于要解决的问题的复杂性也是一样的非常有限。在我们分析问题的时候,如果我们把所有的东西混在一起讨论,那么就只会有一个结果——乱。

我记得在上一家公司有一个项目,讨论就讨论了1年多,项目本来不复杂,但是没有使用SoC,全部的东西混为一谈,再加上一堆程序员注入了各种不同的观点和想法,整个项目一下子就失控了。最后,本来一个1年的项目做了3年。

实现关注点分离的方法主要有两种,一种是标准化,另一种是抽象与包装。标准化就是制定一套标准,让使用者都遵守它,将人们的行为统一起来,这样使用标准的人就不用担心别人会有很多种不同的实现,使自己的程序不能和别人的配合。Java EE就是一个标准的大集合。每个开发者只需要关注于标准本身和他所在做的事情就行了。就像是开发镙丝钉的人只专注于开发镙丝钉就行了,而不用关注镙帽是怎么生产的,反正镙帽和镙丝钉按标来就一定能合得上。不断地把程序的某些部分抽像差包装起来,也是实现关注点分离的好方法。一旦一个函数被抽像出来并实现了,那么使用函数的人就不用关心这个函数是如何实现的,同样的,一旦一个类被抽像并实现了,类的使用者也不用再关注于这个类的内部是如何实现的。诸如组件,分层,面向服务,等等这些概念都是在不同的层次上做抽像和包装,以使得使用者不用关心它的内部实现细节。

说白了还是“高内聚,低耦合”。

 

------------

注释配置相对于 XML 配置具有很多的优势:

  • 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。
  • 注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 XML 配置的功能。

注释配置相对于 XML 配置具有很多的优势:

  • 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。
  • 注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 XML 配置的功能。

分享到:
评论

相关推荐

    软件设计原则与实践

    总结来说,软件设计原则在嵌入式领域的应用,要求开发者在设计和实现时考虑系统的可维护性、可扩展性和复用性。通过合理应用开闭原则、单一职责原则、模块化、依赖倒置原则、设计模式以及代码结构的继承和抽象,可以...

    一些软件设计的原则一些软件设计的原则

    【软件设计原则详解】 在软件开发领域,遵循一系列设计原则对于构建高质量、可维护和易于扩展的系统至关重要。以下是一些关键的软件设计原则,它们不仅适用于编程,还能应用于更广泛的生产活动和生活。 1. **Don’...

    软件设计原则-面向对象设计七大原则.zip

    软件设计原则-面向对象设计七大原则.zip 面向对象和C语言完全不是一种思考问题的方式,面向对象是种哲学思想,只有明白了其核心思想,才能以不变应万变 只有吃透面向对象的七大设计原则,比如:依赖倒置原则,迪米特法则等...

    设计模式——6大软件设计原则(demo案例实现,附带解析,快速掌握软件设计原则的精髓)

    该包下的所有demo都是一个个的软件设计原则的案例实现 包含有: 1、开闭原则 2、里氏代换原则 3、依赖倒转原则 4、接口隔离原则 5、迪米特法则 6、合成复用原则 使用了一个个的demo案例,以通俗易懂的生活...

    软件工程中的软件设计原则与设计模式.pptx

    ### 软件工程中的软件设计原则与设计模式 #### 第一章:软件设计原则与设计模式简介 **软件设计原则介绍** 软件设计原则是指在软件开发过程中遵循的一系列基本规则和准则,这些原则旨在帮助开发者设计出结构良好...

    软件工程中的软件设计原则与模式教程1.pptx

    ### 软件工程中的软件设计原则与模式 #### 第一章:软件设计原则的重要性 在软件工程领域,软件设计原则对于构建高质量、高效率的软件系统至关重要。本章节将重点介绍软件设计原则的重要意义,并深入探讨几种核心...

    02-软件设计原则 模式深度解析和案例分析

    ### 软件设计原则与模式深度解析及案例分析 #### 一、软件设计原则的重要性与深度解析 软件设计原则是构建高质量软件的基础。遵循良好的设计原则可以帮助开发者编写出易于维护、扩展性强、且具有良好性能的软件...

    软件设计原则.pptx

    软件设计原则是软件开发中的核心指导思想,它们旨在提高代码的可读性、可维护性和可扩展性。在本文中,我们将深入探讨这六大设计原则,包括它们的定义、应用场景以及如何通过遵循这些原则来优化软件开发过程。 首先...

    软件工程中的软件设计原则与模式.pptx

    ### 软件工程中的软件设计原则与模式 #### 第1章 软件设计原则与模式概述 **软件设计原则介绍** 软件设计原则是指在软件开发过程中为提高软件的质量和可维护性而遵循的一系列设计准则。这些原则主要包括: 1. **...

    软件工程中的软件设计原则与模式教程.pptx

    ### 软件工程中的软件设计原则与模式教程 #### 第1章 软件设计原则的重要性 在软件工程领域,软件设计原则是构建高质量软件系统的基础。这些原则旨在指导开发者设计出健壮、可维护且易于扩展的系统。本章节重点...

    软件工程中的软件设计原则与模式1.pptx

    ### 软件工程中的软件设计原则与模式 #### 第一章:软件设计原则与模式概述 ##### 软件设计原则介绍 软件设计原则是在软件开发过程中为提高软件的质量和可维护性而遵循的一系列设计准则。这些原则旨在帮助开发...

    软件工程中的软件设计原则与模式讲解详评.pptx

    ### 软件工程中的软件设计原则与模式详解 #### 第一章:软件工程概述 **1.1 软件工程简介** 软件工程是一门跨学科领域,它结合了计算机科学、工程学以及管理学等多个领域的知识和技术,旨在解决软件开发过程中...

    各软件设计原则在本项目中的应用1

    在本项目中,软件设计原则的应用对于代码的结构和可维护性起到了关键作用。以下是各个原则的具体体现: 1. **单一职责原则**:遵循这一原则,项目中的`controller`类被设计为各自拥有一个明确的职责。例如,`...

    软件设计原则与设计模式.pptx

    软件设计原则与设计模式.pptx

    读书笔记:软件设计原则与设计模式 Java实现.zip

    读书笔记:软件设计原则与设计模式 Java实现

    软件工程与软件系统设计原则.pptx

    #### 第三章:软件设计原则 **设计原则的重要性:** 良好的设计原则对于构建高质量、可维护的软件至关重要。它们帮助开发者: - **优化软件架构:**确保系统结构合理,易于理解和扩展。 - **提高代码质量:**促进...

    1. 软件设计原则(1).md

    1. 软件设计原则(1).md

Global site tag (gtag.js) - Google Analytics