首页 > 其他分享 >设计原则 (6) 迪米特法则

设计原则 (6) 迪米特法则

时间:2024-02-29 17:00:37浏览次数:22  
标签:engine wheel 米特 法则 原则 Car Wheel Engine public

简介

迪米特法则(Law of Demeter,LoD),也称为最少知识原则(Principle of Least Knowledge),是面向对象设计中的一个重要原则。它强调了一个对象应该对其他对象有尽可能少的了解,也就是说,一个对象不应该直接与其它对象进行过多的交互。简而言之,一个对象应该对其他对象保持最少的了解。

主要思想

  1. 减少对象之间的依赖关系:迪米特法则要求对象之间尽可能地减少相互之间的交互,降低彼此之间的依赖关系,使得系统更加灵活、可维护和可扩展。

  2. 降低耦合性:通过减少对象之间的直接交互,可以降低系统各个模块之间的耦合性,使得系统更容易理解、修改和扩展。

案例

不遵守迪米特法则的案例

假设有一个汽车制造工厂,其中包含汽车(Car)、引擎(Engine)和轮胎(Wheel)三个类。汽车需要获取引擎和轮胎的信息以及安装它们。

using System;

// 车轮类
public class Wheel
{
    public string Brand { get; set; }
}

// 引擎类
public class Engine
{
    public string Model { get; set; }
}

// 汽车类
public class Car
{
    private Engine engine;
    private Wheel wheel;

    public Car()
    {
        this.engine = new Engine();
        this.wheel = new Wheel();
    }

    // 安装引擎和轮胎
    public void InstallEngineAndWheel()
    {
        Console.WriteLine($"Installing engine model: {engine.Model}");
        Console.WriteLine($"Installing wheel brand: {wheel.Brand}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        car.InstallEngineAndWheel();
    }
}

在这个例子中,汽车类直接创建了引擎和轮胎对象,并在自己的方法中直接使用它们。这样做导致了汽车类对引擎和轮胎的具体实现细节有了过多的了解,违反了迪米特法则。

遵守迪米特法则的案例

对比上面的例子,我们可以通过引入中间的装配者(Assembler)类来遵守迪米特法则。

using System;

// 装配者类
public class Assembler
{
    private Engine engine;
    private Wheel wheel;

    public Assembler(Engine engine, Wheel wheel)
    {
        this.engine = engine;
        this.wheel = wheel;
    }

    // 安装引擎和轮胎
    public void AssembleEngineAndWheel()
    {
        Console.WriteLine($"Assembling engine model: {engine.Model}");
        Console.WriteLine($"Assembling wheel brand: {wheel.Brand}");
    }
}

// 车轮类
public class Wheel
{
    public string Brand { get; set; }
}

// 引擎类
public class Engine
{
    public string Model { get; set; }
}

// 汽车类
public class Car
{
    private Assembler assembler;

    public Car(Assembler assembler)
    {
        this.assembler = assembler;
    }

    // 安装引擎和轮胎
    public void Assemble()
    {
        assembler.AssembleEngineAndWheel();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Engine engine = new Engine { Model = "V6" };
        Wheel wheel = new Wheel { Brand = "Michelin" };
        Assembler assembler = new Assembler(engine, wheel);

        Car car = new Car(assembler);
        car.Assemble();
    }
}

在这个案例中,汽车类不再直接创建引擎和轮胎对象,而是通过装配者类来接收引擎和轮胎对象,然后调用装配者类的方法来安装引擎和轮胎。这样做遵守了迪米特法则,汽车类不再直接与引擎和轮胎交互,而是通过装配者类来进行间接的交互,降低了类之间的耦合度,提高了系统的灵活性和可维护性。

优点

  1. 降低耦合度:降低系统中各个模块之间的耦合度,因为对象之间的直接依赖关系较少,对象之间的交互更加简单明了。
  2. 提高模块的独立性:提高系统各个模块的独立性,每个模块只需要关注自己的核心功能,不需要关心其他模块的具体实现细节,从而降低了模块之间的耦合度。
  3. 易于测试和调试:因为对象之间的依赖关系较少,模块之间的关系更加清晰明了,因此系统更易于测试和调试,能够快速定位和解决问题。
  4. 增强可维护性和可扩展性:系统更加易于理解和维护,对象之间的依赖关系更加清晰,模块之间的关系更加简单明。每个模块都比较独立,易于修改和扩展,能够快速响应需求变化。

缺点

  1. 引入中间层:可能需要引入额外的类或者中间层,例如委托一个中间对象来处理各个模块之间的通信,这可能会增加一些额外的设计和开发成本。
  2. 可能造成过度设计:可能会导致过度设计,引入了不必要的类或者中间层,增加了系统的复杂度。需要在设计时进行权衡,避免过度设计。

标签:engine,wheel,米特,法则,原则,Car,Wheel,Engine,public
From: https://www.cnblogs.com/mchao/p/18044775

相关文章

  • 设计原则 (5) 依赖倒置原则
    简介依赖倒置原则(DependencyInversionPrinciple,DIP)是面向对象设计中的一个重要原则,它强调了高层模块不应该依赖于低层模块,二者都应该依赖于抽象;而且抽象不应该依赖于具体实现细节,具体实现细节应该依赖于抽象。简而言之,高层模块和低层模块都应该依赖于抽象,而不是依赖于具体的实......
  • 设计原则 (3) 里氏替换原则
    简介里氏替换原则(LiskovSubstitutionPrinciple,LSP)是面向对象设计中的一个重要原则,由芭芭拉·利斯科夫(BarbaraLiskov)在1987年提出。它是继承原则的一种深化和发展,强调子类必须能够替换掉父类并且不影响程序的正确性。里氏替换原则的定义为:“如果对每一个类型为S的对象o1,都......
  • 迪米特原则(设计默斯和)
    定义 高内聚低耦合是一个非常重要的设计思想,能够很好的提高代码的可读性和可维护性,缩小功能改动导致导致代码改动范围,实际上,在前面的章节中,我们已经多次提到了这个设计思想。很多设计原则都是以代码的高内聚低耦合为目的的,比如单一原则,基于接口而非编程实现实际上,高内部松耦合,......
  • 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):一个类应该只有一个引起变化的原因。换句话说,一......