`
student_lp
  • 浏览: 432036 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

     迪米特法则又叫最少知识原则,就是说一个对象应当对其他对象有尽可能少的了解。

     下面看看迪米特法则的其他表述方法:①只与你直接的朋友通信;②不要与陌生人说话;③每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

一、狭义迪米特法则

     如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

     狭义迪米特法则的缺点:会在系统里造出大量的小方法,散落在系统的各个角落。这些方法仅仅是传递间接地调用,因此与系统的商务逻辑无关。当设计师试图从一张类图看出总体的架构时,这些小的方法会造成迷惑和困扰。

     遵循类之间的迪米特法则会使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,也会造成系统的不同模块之间的通信效率降低,也会是系统的不同模块之间不容易协调。

    与依赖倒转原则的互补使用:为了克服狭义的迪米特法则的缺点,可以使用依赖倒转原则,引入一个抽象的类型引用“抽象陌生人”对象,使“某人”依赖于“抽象陌生人”。换言之,就是将“抽象陌生人”变成朋友。

二、广义的迪米特法则

     其实,迪米特法则所谈论的,就是对对象之间的信息流量、流向以及信息的影响控制。在软件系统中,一个模块设计的好不好的最主要、最重要的标志,就是该模块在多大的程度上将自己的内部数据和其他与实现有关的细节隐藏起来。一个设计的好的模块可以将它所有的实现细节隐藏起来,彻底的将提供给外界的API和自己的实现分割开来。这样一来,模块与模块之间就可以仅仅通过彼此的API相互通信,而不理会模块内部的工作细节。这一概念就是“信息的隐藏”,或者叫做“封装”。

    信息的隐藏非常重要的原因在于,他可以使各个子系统之间解耦,从而允许他们独立的被开发、优化、使用、阅读以及修改。这种解耦可以有效的加快系统的开发过程,因为可以独立的同事开发各个模块。他可以使维护过程变得容易,因为所有的模块都容易读懂,特别是不必担心对其他模块的影响。

     虽然信息的隐藏本身并不能带来更好的性能,但是他可以使性能的有效调整变得容易。一旦确认某一个模块是性能的瓶颈时,设计人员可以针对这个模块本身进行优化,而不必担心影响到其他的模块。信息的隐藏还可以促进软件的复用。由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。一个系统的规模越大,信息的隐藏就越是重要,而信息隐藏的威力就越明显。

     迪米特法则的主要用意是控制信息的过载。在将迪米特法则运用到系统设计中时,要注意下面的几点:

     ①在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。一个处在弱耦合的类一旦被修改,不会对有关系的类造成波及。

     ②在类的结构设计上,每一个类都应当尽量降低访问成员的访问权限。换言之,一个类包装好各自的private状态。这样一来,想要了解其中的一个类的意义时,不需要了解很多特别的类的细节。一个类不应当public自己的属性,而应当提供取值和赋值方法让外界间接访问自己的属性。

     ③在类的设计上,只要有可能,一个类应当设计成不便类。

     ④对其他类的引用上,一个对象对其他对象的引用应当降低到最低。

三、广义迪米特法则在类设计中的体现

1、优先考虑将一个类设置成不变类

     一个对象与外界的通讯大体可以分成两种,一种是改变这个对象的状态的,另一种是不改变这个对象的状态的。如果一个对象的内部状态根本就是不可能改变的,那么他与外界的通信当然大大得了折扣。当涉及任何一个类的时候,都首先考虑这个类的状态是否需要改变。即便一个类必须是可改变类,在给他的属性设置赋值方法的时候,也要保持吝啬的态度。除非真的需要,否则不要为一个属性设置赋值方法。

2、尽量降低一个类的访问权限

    在满足一个系统对这个类的需求的同时,应当尽量降低这个类的访问权限。对于顶级的类来说,只有两个可能的访问性等级:

    ①package-private:这个默认访问权限。如果一个类是package-private的,那么他就只能从当前库访问。

     ②public:如果一个类是public的,那么这个类从当前库和其他库都可以访问。

     一个类具有package-private访问权限的好处是,一旦这个类发生变化,那么受影响的客户端必定都在这个库内部。由于一个软件包往往有他自己的库结构,因此一个访问权限为package-private的类是不会被客户应用程序使用的。这就意味着软件提供商可以自由的决定修改这个类,而不必担心对客户的承诺。

     相反,如果一个类被不恰当设置成public,那么客户程序就可能会使用这个类。一旦这个类在一个新版本中被删除,就有可能造成一些客户的程序停止运行的情况。因此,如果一个类可以被设置成package-private的,那么就不应当将他设置成public的。

3、谨慎使用serializable

     一个类如果实现了serializable接口的话,客户端就可以将这个类的实例串行化,然后在并行化。由于串行化和并行化涉及到类的内部结构,如果这个类的内部private结构在一个新版本中发生变化的话,那么客户端可能会根据新版本的结构试图将一个老版本的串行化结果并行化,这会导致失败。

     换言之,为防止这种情况发生,软件提供商一旦将一个类设置为serializable的,就不能再在新版本中修改这个类的内部结构,包括private的方法和句段。因此,除非绝对必要,不用使用serializable。

4、尽量降低成员的访问权限

    类的成员包括属性、方法、嵌套类、嵌套接口等,一个类的成员可以有四种不同的访问权限:private、default、protected、public。作为一条指导原则,在设计一个类的方法时,必须首先考虑将其设置为private,只有当发现当前库中还有别的类需要调用这个方法时,才可能将其访问权限改为default。

    对于一个public的类来说,将一个方法从default改为protected或者public,意味着他的访问权限有了巨大的变化。一旦一个方法设置为protected,这个方法就可以被位于另一个库中的子类访问;如果设置成public,那么就可以被任何的类访问。对于一个软件提供商,这就意味着会有客户程序使用这个方法,因此在所有以后的版本中就要承诺不改变这个方法的特征。因此,将private或default方法修改为protected或public,必须慎之又慎。

四、迪米特法则在代码层次上的实现

    虽然java语言允许一个变量在任何地方声明,但是一般只在需要一个变量的时候才声明它,这样可以有效的控制局域变量的有效范围。一个变量如果仅仅在块的内部使用的话,就应当将这个变量在块的内部使用的地方声明,而不是放到块的外部或者块的开头声明。这样有两个好处:

    ①程序员可以很容易读懂程序;②如果一个变量是在需要它的程序块的外部声明的,那么当这个块还没有被执行的时,这个变量就已经分配了内存;而在这个程序块已经执行完毕后,这个变量所占据的内存空间还没有被释放,这显然是不好的。

 

 

本文通过总结《java与模式》而来。

分享到:
评论

相关推荐

    第三十讲:基础五迪米特法则

    在编程和软件设计中,迪米特法则(Law of Demeter,简称LoD)是一个重要的设计原则,它属于面向对象设计中的一个最佳实践。迪米特法则得名于希腊神话中的先知迪米特,其核心思想是“只与你的直接朋友交谈”。这一...

    22丨理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”? 1

    依赖注入、接口隔离原则、基于接口而非实现编程以及迪米特法则都是为了实现松耦合而提出的。迪米特法则,又称最小知识原则,主张一个对象应该尽量减少对其他对象的了解,只与其直接相关的对象交互,避免通过第三方...

    迪米特法测

    迪米特法则(Law of Demeter,LoD)是软件设计模式中的一种,它源于对象导向编程领域,旨在降低类与类之间的耦合性,提高系统的可维护性和可扩展性。这一法则通常被称为“最少知识原则”,即一个对象应当对其他对象...

    设计模式6大法则

    5. 迪米特法则(Law of Demeter, LoD) 迪米特法则又称作最少知识原则,它提倡一个对象应尽可能少地了解其他对象的内部细节。通过限制对象之间的直接交互,降低耦合度,提高系统的可理解和可维护性。遵循LoD,我们...

    设计模式,软件开发者必读

    1.5.6 迪米特法则(LAW OF DEMETER LOD) 10 1.5.7 单一职责原则(SIMPLE RESPONSIBILITY PINCIPLE SRP) 10 创建型模式 11 2.1 SINGLETON单件模式 11 2.1.1 典型的SINGLETON类 11 2.1.2 多线程安全的SINGLETON类 12 ...

    软件设计模式(java版)习题答案.pdf

    6. 迪米特法则(LoD):它要求如果两个软件实体无须直接通信,就不应当直接相互调用,而通过第三方转发该调用。 7. 合成复用原则(CRP):它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才...

    韩顺平-设计模式1

    迪米特法则(LoD)又称最少知识原则,建议一个对象应该尽量减少对其他对象的了解,以降低对象间的相互依赖。 合成/聚合复用原则(CARP)推荐优先使用对象的组合/聚合,而不是继承,因为组合/聚合具有更高的灵活性和...

    《设计模式》Java版期末总结.pdf

    设计模式的六大原则是软件设计的基础,包括单一职责原则(SRP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口隔离原则(ISP)、迪米特法则(LoD)和开闭原则(OCP)。这些原则旨在提高代码的可读性、可维护性和...

    NET应用架构设计原则模式与实践源码

    - **迪米特法则(LoD)**:降低类之间的耦合度,只与直接朋友通信。 2. **设计模式**: - **工厂模式**:提供创建对象的接口,让子类决定实例化哪一个类,隔离了类的实例化过程。 - **单例模式**:确保一个类...

    设计模式相关资料

    1. **设计原则**:设计模式的基础是面向对象设计的七大原则,包括单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)、迪米特法则(LoD)和合成复用原则。...

    设计模式+六大原则pdf

    6. 迪米特法则(LoD):一个对象应该对其他对象有最少的了解,减少类之间的耦合。 书中的“2-教材各章实例代码”部分,很可能是通过实际的编程练习来演示这些模式和原则的应用。读者可以借此机会亲手实践,加深理解...

    23种设计模式,及设计模式的七种设计原则的文档和Java代码实现

    6. 迪米特法则(Law of Demeter, LoD):一个对象应当对其他对象有最少的了解,也称为最少知道原则。 7. 合成/聚合复用原则(Composition/Aggregation Reuse Principle, CARP):优先使用对象的组合/聚合,而不是...

    java 与模式

    - **迪米特法则(Law of Demeter, LoD)**:一个对象应该对其他对象有最少的了解,降低耦合度。 2. **设计模式**: - **创建型模式**: - 单例模式(Singleton):保证一个类只有一个实例,并提供全局访问点。 ...

    Java设计模式课件.rar

    这六大原则包括单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)以及迪米特法则(LoD)。这些原则是面向对象设计的核心,它们指导我们编写出更加灵活、可...

    《设计模式》Java版期末总结.docx

    5. 迪米特法则(LoD):尽量减少类之间的相互了解,降低耦合。 6. 开闭原则(OCP):软件实体应对扩展开放,对修改关闭,这是面向对象设计的核心目标。 这些原则指导开发者写出更高质量的代码,使得系统更易于理解...

    24种设计模式介绍与6大设计原则.rar

    6. 迪米特法则(Law of Demeter, LoD):一个对象应该对其他对象有最少的了解,减少类之间的耦合。 理解并熟练运用这些设计模式和原则,可以帮助开发者写出更高质量、更易于维护的代码,提升团队的开发效率和软件的...

    java课程设计 course-java-design

    - **迪米特法则(LoD)**:一个对象应该对其他对象有最少的了解,减少类之间的交互,提高系统的解耦性。 ### 2. 设计模式 设计模式是经过时间验证的解决方案,用于解决常见的软件设计问题。在"course-java-design...

    java设计模式刘伟源码

    6. 迪米特法则(Law of Demeter, LoD):一个对象应该对其他对象有最少的了解,只与直接的朋友交互。这减少了类之间的耦合。 7. 组合/聚合复用原则(Composite/Aggregation Reuse Principle, CARP):优先使用对象...

    24中設計模式和6中原則.rar_design patterns_设计模式

    6. **迪米特法则**(Law of Demeter, LoD):一个对象应该对其他对象有最少的了解,也称为最少知道原则。 这些设计模式和原则是软件设计的基础,它们帮助我们编写出可维护、可扩展和可复用的代码。通过理解和应用...

    6大设计原则

    这六大设计原则包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)以及迪米特法则(LoD)。接下来,我们将深入探讨这些原则的含义及其在实际编程中的应用。...

Global site tag (gtag.js) - Google Analytics