首页 > 其他分享 >迪米特原则(设计默斯和)

迪米特原则(设计默斯和)

时间:2024-02-28 14:35:56浏览次数:22  
标签:米特 默斯 原则 url 代码 NetworkTransporter html Document public

定义

 高内聚低耦合是一个非常重要的设计思想,能够很好的提高代码的可读性和可维护性,缩小功能改动导致导致代码改动范围,实际上,在前面的章节中,我们已经多次提到了这个设计思想。很多设计原则都是以代码的高内聚低耦合为目的的,比如单一原则,基于接口而非编程实现

实际上,高内部松耦合,是一个比较通用的设计思路,可以用来指导不同粒度的设计于开发,比如系统,模块,类,甚至函数。也亦可以应用到不同的开发场景中,比如微服务,框架组件,类库等。为了方便讲解,我们以类作为这个设计思想的应用对象来展开讲解。其他的应用场景你可以自行类比。 

高内聚

它说的是讲相近的功能放到同一个类中,不相近的功能放在不同的类中,相近的功能往往被同时修改,代码的维护比较容易,实际上,我们前边讲解的单一原则,是高内聚非常有效的原则,

松耦合

所谓松耦合,在代码中,类鱼类之间的依赖关系简单清晰。即使两个类有依赖关系,一个类的改动不会后者很多好导致依赖类的代码的改动。实际上我们之前的依赖注入,基于接口而非实现,以及今天讲的迪米特原则都是为了实现代码的松耦合。 

内聚合耦合之间的关系

高内聚有助于实现松耦合,同理低耦合也会导致紧耦合。 关于这一点,下边的一张对比如来解释。

左边部分的代码的设计中,类的粒度比较小,每个类的职责比较单一,行进的功能都放在一个类中,不相近的功能放在了多个类中。这样类更加独立,代码的内聚性更高。 右边的代码的设计中,类的粒度比较大,低内聚,功能大而全,不相近的功能放到了一个类中。这就导致了很多其他类都依赖这个类。当我们修改这个类的某一个功能代码的时候,会影响依赖它的多个类。 我们需要测试这三个依赖类。是否正常工作。这就是所谓的牵一发而动全身。 

除此之外,从图中我们可以看出,高内聚低耦合的代码更加的简单,清晰,响应的在可维护和可读性上确实高了很多。 

迪米特原则: 

每个模块直应该了解那些于它关系密切的模块的有限知识。或者说,每个模块只能和自己的朋友说话,不要和陌生人说话。 

具体实战

public class NetworkTransporter {
    // 省略属性和其他方法...
    public Byte[] send(HtmlRequest htmlRequest) {
//...
    }
}
public class HtmlDownloader {
    private NetworkTransporter transporter;// 通过构造函数或 IOC 注入
    public Html downloadHtml(String url) {
        Byte[] rawHtml = transporter.send(new HtmlRequest(url));
        return new Html(rawHtml);
    }
}
public class Document {
    private Html html;
    private String url;

    public Document(String url) {
        this.url = url;
        HtmlDownloader downloader = new HtmlDownloader();
        this.html = downloader.downloadHtml(url);
    }
}

  

我们来看NetworkTransporter类,作为一个底层网络通信类,我们希望它尽可能的通用,而不知服务于下载html ,所以我们不应该直接依赖太具体的发送对象HtmlRequest。从这一点上讲,NetworkTransporter类的设计违背了迪米特原则,依赖不该直接依赖的关系的HtmlRequest类。 

我们应该如何重构,让NetworkTransporter 类满足迪米特法则呢? 我这里有一个形象的比喻,加入你线程需要去商店买东西,你看到你定不会直接把浅包给收银员。让收银员从你的钱包力拿钱。而是你从钱包力把钱拿出来交给收银员。 这里的HtmlRequest 就相当于钱包,HtmlRequest 里边的address 和context 对象就相当于钱。我们应该把address 和context 交割NetworkTransporter ,而不死把HtmlRequest 交给NetworkTransporter 。根据这个思路。NetworkTransporter 重构之后的代码如下: 

public class NetworkTransporter {
  // 省略属性和其他方法...
  public Byte[] send(String address, Byte[] data) {
    //...
  }
}

  

最后我们来看Document 类。这个类。主要有三点,1.构造函数的downloader.downloadHtml() 逻辑复杂,耗时长,不应该放到构造函数中,会影响代码的可测试性。HtmlDownloader对象在构造函数中通过new 来创建的,违反了基于接口而非编程的设计思想。 也会影响代码的可测试性。从业务上,Document 网页文档没必要依赖HtmDownloader 类,违背了迪米特原则

public class Document {
    private Html html;
    private String url;
    public Document(String url, Html html) {
        this.html = html;
        this.url = url;
    }
//...
}
// 通过一个工厂方法来创建 Document
public class DocumentFactory {
    private HtmlDownloader downloader;
    public DocumentFactory(HtmlDownloader downloader) {
        this.downloader = downloader;
    }
    public Document createDocument(String url) {
        Html html = downloader.downloadHtml(url);
        return new Document(url, html);
    }
}

  

现在,我们再来看以下这条原则的后半部分,有依赖关系的类之间,尽量只依赖必要的接口。 

 

标签:米特,默斯,原则,url,代码,NetworkTransporter,html,Document,public
From: https://www.cnblogs.com/dousil/p/18040284

相关文章

  • KISS 原则 (设计模式)
    KISS定义kiss原则的英文描述又几个版本,计较下边的这几个keepitsimpleandstupid.keepitshortandsimplekeepitsimpleandstraightforward不过仔细看你会发现,他们表达的意思其实差不多,尽量保持简单。它是一个万金油的设计原则,可以在很多场景中,它不仅仅经常用来指......
  • 接口隔离原则(设计模式)
    定义“Clientsshouldnotbeforcedtodependuponinterfacesthattheydonotuse”个人认为接口隔离原则,和单一原则有点像。一个接口实现一个功能。 不过,你应该已经发现,接口隔离原则跟单一职责原则有点类似,不过稍微还是有点区别。单一职责原则针对的是模块、类、接口......
  • 里斯替换原则 (设计模式)
    定义IfSisasubtypeofT,thenobjectsoftypeTmaybereplacedwithobjectsoftypeS,withoutbreakingtheprogram。Functionsthatusepointersofreferencestobaseclassesmustbeabletouseobjectsofderivedclasseswithoutknowingit。子类能够替......
  • ImageList1控件的使用原则
    ImageList1的功能是设计时候,保存好一系列的图片。在设计加载后,绑定好使用控件,这里我们以TrayIcon1控件为例子 要更改 TrayIcon1控件的图标属性,  不能通过修改ImageList1,  要通过更改 TrayIcon1控件的相关属性,     TrayIcon1.IconIndex:=1;Imag......
  • 提升数据安全的五大原则
    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。随着企业不断利用各类结构化和非结构化数据,包括快速流动、核心、边缘、人工生成、机器生成和机器人生成的数据,大多数企业继续构建信息孤岛。除......
  • 刘铁猛C#学习笔记19 抽象类、接口与SOLID五大原则
    接口与抽象类是所有高阶面向对象的起点,是学习设计模式的前置条件必须有实践基础之后,才能真正掌握算法、设计模式 设计模式的基础solid五大设计原则(待续)1.单一职责原则singleresponsibilityprinciple2.开放-关闭原则Open-closeprinciple,简称为开闭原则“封装确定的,......
  • design pattern 7 原则
    ///-----------------23个设计模式对对7个原则的具体形式,7原则是23个模式的凝练------------------//////-----------------target:高内聚、低耦合------------------///单一职责原则(SingleResponsibilityPrinciple-SRP):一个类应该只有一个引起变化的原因。换句话说,一......
  • IT解决方案设计的4个重要原则
    我们知道,无论是互联网相关专业,还是其他各个行业,好的方案在设计思路上都具备相同的设计思路和原则。在这些原则的基础上做设计,基本上都OK。安全性与可靠性安全性是整个项目建设中的重中之重,要通过各种技术确保系统应用的安全性。同时,也要具备系统的高度可靠性,这样才能保证网络客......
  • 违反这些设计原则,系统就等着“腐烂”
    分享是最有效的学习方式。博客:https://blog.ktdaddy.com/老猫的设计模式专栏已经偷偷发车了。不甘愿做crudboy?看了好几遍的设计模式还记不住?那就不要刻意记了,跟上老猫的步伐,在一个个有趣的职场故事中领悟设计模式的精髓吧。还等什么?赶紧上车吧故事这段时间以来,小猫按照之前......
  • Prompt原则 - 强调行动指令而非限制
    在与语言模型(LLM)的交流中,明确指导(告诉它做什么)往往比单纯指出禁止行为(告诉它不做什么)更加有效。这种方法的优点在于能够更直接、更精确地引导模型的回答方向,减少模型需要考虑的可能性范围,从而提高获取期望答案的几率。OpenAI的官方文档https://help.openai.com/en/articles/66......