资讯专栏INFORMATION COLUMN

迪米特法则

OnlyMyRailgun / 1984人阅读

摘要:个人博客原文迪米特法则设计模式六大原则之五迪米特法则。老师便给同学们讲解了这个例子,让学生感受一番迪米特法则。总结迪米特法则主要讲述的观点是高内聚低耦合。

个人博客原文:
迪米特法则

设计模式六大原则之五:迪米特法则。
简介

姓名:迪米特法则

英文名:Law of Demeter

小名:最少知识原则

小名英文名:Least Knowledge Principle

价值观:妈妈说不和陌生人说话

个人介绍

Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. (每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元)

Each unit should only talk to its friends; don"t talk to strangers. (每个单元只能和它的朋友交谈:不能和陌生单元交谈)

Only talk to your immediate friends. (只和自己直接的朋友交谈)

(来自维基百科)

还是脑洞大开来个小故事。这故事还是比较现实一些,其实也不算是故事,就是咱们经常经历的事情,现在知识付费已经广受欢迎,18 年底更是快速猛涨,各种各样的培训、读书、音频学习软件如雨后春笋一般涌现出来。我们就拿一个读书的例子。

有一天,设计模式老师讲解了迪米特法则,同学们听得云里雾里的,老师怕同学们没掌握这个知识点,就给同学们布置了一个作业,需要同学们按迪米特法则实现。

作业是这样子的:平常在零碎的时间里,喜欢看一些书籍,一般都是电子书,现在我们看书的操作是这样的:唤醒手机,打开阅读软件,选择书籍,然后阅读。总共 3 个步骤,涉及了 3 样东西:手机、软件、书籍。同学们用代码实现这个过程。

第二天上课,同学们纷纷交了作业,老师随手一番,就看到了 2 个鲜明的例子,很明显,就是一好一坏。老师便给同学们讲解了这 2 个例子,让学生感受一番迪米特法则。

错误例子
public class LODErrorTest {

    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.readBook();
    }

}


/**
 * 错误的示范
 */
class Phone {
    App app = new App();
    Book book = new Book("设计模式");
    public void readBook() {
        app.read(book);
    }

}


class App {
    
    public void read(Book book) {
        System.out.println(book.getTitle());
    }

}

class Book {

    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

代码:
LODErrorTest

代码是完成了读书这个过程,看样子是功能实现了,细看会发现代码的逻辑不对。哪里不对呢?书籍和应用对象都在手机上,现实是我们唤醒手机,这时手机是没有书籍的,只有当我们打开阅读软件,才有书籍可以看,没有阅读软件,书籍是看不了的。因此,手机和书籍没有一毛钱关系,书籍不应该在手机里面。正常的设计是:手机里面有阅读软件,阅读软件里面有书籍,这才符合迪米特法则,按定义来说:手机和阅读软件是朋友,阅读软件和书籍是朋友,可是朋友的朋友不是朋友,也就是手机和书籍不是朋友,所以它们不应该有交集,应该离得远远的。

思考一下现实:工作中如果缺少代码复核这个步骤,就会出现这样子,后果是怎么样呢?会给后人挖坑,而且是大坑,因为和现实中的逻辑是对不上的,况且后人不知道当时的业务背景,只能看代码去熟悉,就会一步错、步步错,所以要好好把控代码质量这一关,因为代码千人千面,没法要求代码风格全部一致,但至少需要实现逻辑是清晰易懂的。

正确例子
public class LODRightTest {

    public static void main(String[] args) {
        Phone2 phone2 = new Phone2();
        phone2.readBook();
    }

}

/**
 * 正确的示范
 */
class Phone2 {

    private App2 app2 = new App2();

    public void readBook() {
        app2.read();
    }

}


class App2 {
    private Book2 book2 = new Book2("设计模式");

    public void read() {
        System.out.println(book2.getTitle());
    }

}

class Book2 {

    private String title;

    public Book2(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

代码:
LODRightTest

这段代码就符合迪米特法则,手机中有阅读软件,阅读软件中有书籍,手机没有书籍任何影子。正确代码不用细讲,用心去感受就可以体会到。

总结

迪米特法则主要讲述的观点是高内聚、低耦合。我理解为:是你的,就别给别人;不是你的,就别拿。上面定义的朋友也是这个意思。

参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》

写到这,第五个原则了,六大原则就剩下最后一个开闭原则,凑齐 6 把大刀就可以准备去大干 23 个大汉啦。。。想想都激动。

希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号,第一时间获取文章推送阅读,也可以一起交流,交个朋友。

公众号之设计模式系列文章

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72834.html

相关文章

  • Java设计模式七大原则

    摘要:单一职责原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则组合聚合复用原则单一职责原则高内聚低耦合定义不要存在多于一个导致类变更的原因。建议接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。使用继承时遵循里氏替换原则。 单一职责原则 开闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 组合/聚合复用原则 单一职责原则(Single Responsi...

    Olivia 评论0 收藏0
  • 设计模式六大原则(PHP)

    摘要:常用的六大设计模式有单一职责原则,里氏替换原则,依赖倒转原则,接口隔离原则,迪米特法则,开闭原则。这六大原则是最虚,最抽象的,很难理解。这就是接口隔离原则。当我们遵循前面介绍的五大原则,以及使用种设计模式的目的就是遵循开闭原则。   设计模式的目的是为了更好的代码重用性,可读性,可靠性和可维护性。常用的六大设计模式有:单一职责原则(SRP),里氏替换原则(LSP),依赖倒转原则(DIP...

    bluesky 评论0 收藏0
  • Java设计模式-六大原则

    摘要:依赖倒置原则是个设计原则中最难以实现的原则,它是实现开闭原则的重要途径,依赖倒置原则没有实现,就别想实现对扩展开放,对修改关闭。 1、单一职能原则(Single Responsibility Principle, SRP) 定义 There should never be more than one reason for a class to change.应该有且仅有一个原因引起类的...

    molyzzx 评论0 收藏0
  • 面向对象基本原则(3)- 最少知道原则与开闭原则

    摘要:六开闭原则开闭原则简介开闭原则的英文名称是,简称。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立一个稳定灵活的软件系统。 面向对象基本原则(3)- 最少知道原则与开闭原则 面向对象基本原则(1)- 单一职责原则与接口隔离原则面向对象基本原则(2)- 里式代换原则与依赖倒置原则面向对象基本原则(3)- 最少知道原则与开闭原则 五、最少知道原则【迪米特法则】 1. 最少知道...

    HackerShell 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<