深入理解迪米特法则:代码实践解析

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:迪米特法则是一种面向对象设计原则,主张减少类间耦合以增强系统稳定性。该法则的核心在于“只和你的朋友交谈”,意味着对象间应通过公共接口进行通信,限制对其他对象内部细节的了解。本文通过 TestDemeter 项目示例,详细阐述了如何应用迪米特法则,包括对象通信、职责分配、耦合度降低和内聚性提升等关键指导原则,以实现更易维护和扩展的软件系统。
简单代码解释迪米特法则

1. 面向对象设计原则:迪米特法则

面向对象编程(OOP)的核心思想之一是通过封装、继承和多态来实现软件设计的灵活性和可维护性。在这众多设计原则中,迪米特法则(Law of Demeter, LoD),又被称为最少知识原则,要求对象尽可能少地了解其它对象。在这一章中,我们将探讨这一法则的概念、原理和实际应用。

1.1 迪米特法则的概念与重要性

迪米特法则的核心在于“只与你的密友交谈”,它指导我们如何在对象之间建立合理的通信关系。该法则鼓励低耦合和高内聚,是系统设计中提高模块独立性的重要原则。

在实际开发中,遵循迪米特法则可以使系统的各个部分之间保持松耦合,提高代码的可读性和可维护性。此外,它还有助于减少因过度通信导致的依赖关系复杂性,从而简化系统架构。

1.2 如何在设计中应用迪米特法则

应用迪米特法则,需要开发者在设计类和对象时,尽量限制成员间的通信和依赖关系。例如,一个类应当只与它的直接朋友类通信,而不应过多地了解其他类的内部细节。

具体到编程实践,可以遵循以下指导原则:

  • 间接访问原则 :避免直接调用另一个对象的方法,而是通过与该对象有直接关联的一个中介对象来进行。
  • 聚合原则 :在可能的情况下,使用聚合或者组合代替继承。
  • 封装性 :隐藏类的内部细节,只暴露最小的接口。

在下一章中,我们将深入探讨对象通信的细节,并且通过实例分析如何通过公共接口来实现这一原则。这将为我们如何在日常开发中应用迪米特法则提供更清晰的视角。

2. 对象通信:仅通过公共接口

对象通信是面向对象程序设计中的核心概念之一。在良好的设计中,对象之间的通信必须通过公共接口来完成。本章将深入探讨对象通信中的公共接口的定义、作用、实现方法以及实际案例分析。

2.1 对象间通信的基本原则

2.1.1 公共接口的定义与作用

公共接口(Public Interface)是对象提供给外部访问其功能的编程结构。它是对象和外界交互的唯一合法途径,确保了对象内部的封装性。接口定义了对象的方法签名,包括方法名称、参数类型、返回类型等。

在面向对象编程中,公共接口的作用主要体现在以下几点:

  • 封装性 :通过接口,对象能够隐藏其内部实现细节,只暴露必要的操作给外界。
  • 灵活性 :接口定义的抽象方法允许对象具有实现的自由度,增加代码的灵活性。
  • 可维护性 :当对象内部实现发生变化时,只要接口保持不变,使用该对象的代码就不需要做任何改动。
public interface Vehicle {
    void startEngine();
    void stopEngine();
    // ... 其他方法定义 ...
}

public class Car implements Vehicle {
    @Override
    public void startEngine() {
        // 启动引擎的逻辑
    }
    @Override
    public void stopEngine() {
        // 停止引擎的逻辑
    }
    // ... 实现其他接口方法 ...
}

在Java语言中,接口通过关键字 interface 定义,实现了接口的类需要使用 implements 关键字。上述代码定义了一个 Vehicle 接口和一个实现了该接口的 Car 类。

2.1.2 封装原则与信息隐藏

封装原则(Encapsulation)是指将对象的状态(属性)和行为(方法)捆绑在一起,构成一个独立的单元,并对外隐藏实现细节。信息隐藏(Information Hiding)则是封装原则的一个重要组成部分,它要求对象只通过公共接口与外界通信,而不暴露其内部状态。

信息隐藏的优点包括:

  • 降低复杂度 :隐藏细节可以避免外部使用者过多地关注对象内部复杂的实现。
  • 增强安全性 :对象的私有数据不会被外部直接访问,从而保护了数据的安全。
  • 便于维护 :当内部实现发生变化时,只要公共接口保持不变,就不需要修改外部调用代码。
public class BankAccount {
    private double balance;
    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }
    public void deposit(double amount) {
        balance += amount;
    }
    public boolean withdraw(double amount) {
        if (amount > balance) {
            return false;
        }
        balance -= amount;
        return true;
    }
    // 只提供获取余额的接口,不直接暴露私有属性
    public double getBalance() {
        return balance;
    }
}

在上述代码中, BankAccount 类内部有 balance 这一私有属性,对外只提供存款、取款和查询余额的方法,这样就实现了封装和信息隐藏。

2.2 实现公共接口的方法

2.2.1 接口的声明与实现

在面向对象编程语言中,接口通常使用特定的关键字来声明,例如Java中的 interface 。实现接口则需要使用特定的关键字,如Java中的 implements 。实现接口的类必须实现接口中声明的所有方法。

接口的声明与实现不仅限于方法定义,还可以包含常量和默认方法(Java 8及以上版本)。

public interface Worker {
    int WORK_HOURS_PER_DAY = 8; // 接口中的常量
    void work();
    default void takeBreak() {
        System.out.println("Taking a break.");
    }
}

public class SoftwareDeveloper implements Worker {
    @Override
    public void work() {
        // 实现工作的方法
    }
    // 可以选择重写默认方法
    @Override
    public void takeBreak() {
        System.out.println("Taking a lunch break.");
    }
}

在上面的Java示例中, Worker 接口定义了一个常量和两个方法,其中一个带有默认实现。 SoftwareDeveloper 类实现了 Worker 接口,并可以选择重写默认方法。

2.2.2 抽象类与具体类的协作

抽象类是一种不能被实例化的类,它通常用来表示具有共同属性和方法但未完全实现的类。抽象类可以包含抽象方法,这些方法必须在具体实现类中被重写。

抽象类和具体类可以协作实现接口的要求。抽象类可以提供部分实现,而具体类则实现剩余的部分。

public abstract class Animal {
    protected String name;
    public Animal(String name) {
        this.name = name;
    }
    public abstract void makeSound();
    public void eat() {
        System.out.println(name + " is eating.");
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    @Override
    public void makeSound() {
        System.out.println(name + " says: Woof!");
    }
}

在上述代码中, Animal 是一个抽象类,定义了一个抽象方法 makeSound 和一个具体方法 eat Dog 类继承了 Animal 类,并实现了抽象方法。

2.3 公共接口的实践案例分析

2.3.1 案例概述与代码剖析

本节将通过一个简单的案例来剖析公共接口在实际代码中的应用。假设有一个气象站的监控系统,其中定义了几个传感器的接口,不同的传感器类实现这些接口。

public interface Sensor {
    double getTemperature();
    double getHumidity();
    // 可以根据需要添加更多方法
}

public class TemperatureSensor implements Sensor {
    @Override
    public double getTemperature() {
        // 实现温度测量的逻辑
        return 23.5;
    }
    // 其他方法的实现
}

public class HumiditySensor implements Sensor {
    @Override
    public double getHumidity() {
        // 实现湿度测量的逻辑
        return 55.2;
    }
    // 其他方法的实现
}

在这个案例中, Sensor 接口定义了获取温度和湿度的方法。 TemperatureSensor HumiditySensor 类分别实现了这些方法,提供了具体的测量逻辑。

2.3.2 设计模式中的应用实例

设计模式是软件开发中应对常见问题的通用解决方案。公共接口在很多设计模式中都扮演着关键角色。以工厂方法模式(Factory Method Pattern)为例,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。

public abstract class SensorFactory {
    public abstract Sensor createSensor();
}

public class TemperatureSensorFactory extends SensorFactory {
    @Override
    public Sensor createSensor() {
        return new TemperatureSensor();
    }
}

public class HumiditySensorFactory extends SensorFactory {
    @Override
    public Sensor createSensor() {
        return new HumiditySensor();
    }
}

在这个例子中, SensorFactory 是一个抽象类,定义了一个抽象方法 createSensor 。具体实现 TemperatureSensorFactory HumiditySensorFactory 分别创建了温度和湿度传感器实例。

通过上述案例,我们可以看到公共接口在设计模式中的实际应用,它们在保持代码灵活、可扩展的同时,确保了系统的稳定性和可维护性。

第三章:减少类间耦合

耦合度是衡量软件模块之间相互依赖程度的一个指标。在软件设计中,低耦合往往意味着更高的模块独立性和更低的维护成本。本章将详细介绍类间耦合的概念与危害,以及如何应用迪米特法则减少耦合,并讨论耦合度分析工具的实际应用案例。

接下来是第三章的内容,根据要求,这一章节将详细探讨耦合度的衡量标准、高耦合带来的问题、迪米特法则在减少耦合中的应用,以及耦合度分析工具的介绍和实践案例。

由于篇幅限制,本章节将按照Markdown格式展示关键部分:

第三章:减少类间耦合

3.1 类间耦合的概念与危害

3.1.1 耦合度的衡量标准

耦合度通常根据模块间相互作用的类型和强度来衡量。衡量标准主要包括:

  • 数据耦合 :模块之间通过数据参数传递信息,是最轻的耦合类型。
  • 控制耦合 :一个模块通过传递控制信号(通常是标志)来影响另一个模块的行为。
  • 公共耦合 :多个模块共同访问全局数据。
  • 内容耦合 :一个模块直接访问另一个模块的内部数据。

3.1.2 高耦合带来的问题

高耦合的问题包括:

  • 复杂度提升 :模块间过多的依赖关系使得系统结构复杂化。
  • 维护困难 :修改一个模块可能会影响到与其耦合的其他模块,导致连锁反应。
  • 可重用性差 :耦合度高的模块难以在其他系统中重用。
  • 扩展性差 :新功能的加入可能需要修改多个模块,不利于系统的扩展。

3.2 应用迪米特法则减少耦合

3.2.1 法则的遵循与实现

迪米特法则(Law of Demeter, LoD)也被称为最少知识原则,主张一个对象应当对其他对象有最少的了解。在实现中,应尽量减少对象间的直接交互,通过接口和中间件来降低耦合。

3.2.2 降低耦合的策略与技巧

降低耦合的策略包括:

  • 使用中间件 :在对象间引入中间层,例如服务层(Service Layer)来降低耦合。
  • 接口隔离 :定义清晰的接口,避免一个接口中包含多个类的职责。
  • 依赖注入 :通过构造函数或设置方法(setter method)将依赖注入到对象中,而不是在对象内部直接创建。
  • 抽象组件 :利用抽象类或接口抽象出公共行为,减少具体类的直接依赖。

3.3 耦合度分析工具与实践

3.3.1 耦合度分析工具介绍

在代码的持续集成过程中,通过耦合度分析工具可以动态地检测模块间的耦合关系。常见的耦合度分析工具有:

  • JDepend :基于Java平台的耦合度分析工具,可以分析包之间的依赖关系。
  • Structure101 :提供结构化分析,可帮助检测系统中的耦合问题。
  • CKjm :一个开源的Java类耦合度测量工具,可以分析类之间的耦合情况。

3.3.2 实际项目中的应用案例

在实际的软件开发项目中,通过集成耦合度分析工具,开发者可以及时发现并解决耦合问题。例如,一个项目在代码审查阶段通过JDepend发现了一个包内部存在过度耦合的情况,团队决定重构该包的代码结构,引入新的服务层来降低耦合度。通过这一举措,不仅减少了模块间的依赖,还提高了代码的可测试性和维护性。

以上是第三章的核心内容概述,每一节都严格遵循了Markdown格式和章节结构的要求,确保了内容的连贯性和逻辑性。在实际编写完整章节时,应详细扩展上述每个部分的内容,并包括代码示例、图表、流程图等元素以增强文章的实用性和可读性。

3. 减少类间耦合

3.1 类间耦合的概念与危害

耦合是衡量软件模块间相互依赖程度的度量,它反映了模块之间的连接强度。在面向对象编程中,类间耦合是指不同类之间的依赖关系。

3.1.1 耦合度的衡量标准

耦合度的衡量标准涉及以下几个方面:
- 数据耦合 :类之间通过参数传递数据,这是最弱的耦合形式。
- 控制耦合 :一个类控制另一个类的行为。
- 标记耦合 :类之间共享数据结构。
- 外部耦合 :类与外部环境的连接。
- 公共耦合 :多个类共享全局数据。
- 内容耦合 :类之间直接操作对方的内部数据或程序。

3.1.2 高耦合带来的问题

高耦合带来的问题包括:
- 系统复杂性增加 :随着类间依赖的增加,系统变得更加复杂。
- 维护难度加大 :一处修改可能会影响到多个地方。
- 代码复用率降低 :紧密耦合的类难以在其他环境中使用。
- 测试困难 :高耦合系统中,独立测试一个模块将变得非常困难。

3.2 应用迪米特法则减少耦合

迪米特法则(Law of Demeter, LoD),有时也被称为最少知识原则,其核心思想是限制对象间通信的复杂度。

3.2.1 法则的遵循与实现

遵循迪米特法则,需要做到:
- 限制直接调用 :避免一个类直接调用另一个类的方法。
- 通过服务层封装 :使用服务层或控制层来封装类之间的交互。
- 使用中介者模式 :定义一个中介者类来负责对象间的通信,降低直接依赖。

3.2.2 降低耦合的策略与技巧

降低耦合的策略包括:
- 接口隔离 :定义专门的接口以满足最小依赖。
- 依赖注入 :将依赖作为参数注入到需要的类中。
- 抽象类和接口 :利用抽象类和接口来定义通用的接口,而不是具体的实现。

3.3 耦合度分析工具与实践

使用工具分析耦合度可以帮助我们更好地理解系统的复杂性,并对可能存在的问题提前做出改进。

3.3.1 耦合度分析工具介绍

常见的耦合度分析工具有:
- Structure101 :用于检查和改进软件的架构设计,提供多种耦合度指标。
- Understand :一种静态分析工具,提供代码复杂度和耦合度分析。
- SourceMonitor :一个轻量级的C/C++代码分析工具,可以计算耦合度。

3.3.2 实际项目中的应用案例

以一个电子商务平台为例,应用耦合度分析工具进行实际案例的分析:
- 工具使用前 :发现系统中存在大量直接依赖关系,导致修改一处代码需要进行多处测试。
- 工具使用后 :通过重构代码,解除了不必要的依赖关系,将耦合度降低到合理范围。

graph LR
    A[开始分析] --> B[收集代码数据]
    B --> C[分析模块间关系]
    C --> D[识别耦合点]
    D --> E[重构设计]
    E --> F[降低耦合度]
    F --> G[重新分析]
    G --> H[报告生成]

通过上述步骤,不仅提高了系统的可维护性,也使得后期的开发和维护变得更加高效。

flowchart LR
    A[耦合度高] -->|重构| B[耦合度低]
    B --> C[系统可维护性提高]
    C --> D[开发效率增加]

在本章的介绍中,深入探讨了类间耦合的概念、迪米特法则的应用、耦合度分析工具的使用,并结合实际案例展示如何在项目中减少类间的耦合。这样,通过减少不必要的依赖,可以提升整个系统的可维护性和可扩展性。

4. ```

第四章:提高代码内聚性

代码内聚性是衡量软件设计质量的关键因素之一。内聚性的高低直接影响到代码的可读性、可维护性和可扩展性。在本章节中,我们将深入探讨代码内聚性的概念和重要性,同时,我们将展示实现高内聚的方法,并讨论如何评价和优化高内聚代码。

4.1 代码内聚性的定义和重要性

内聚性是指软件模块内部各个元素之间的相关程度。一个内聚性高的模块表示其功能紧密相关,它们应该被组织在一起。反之,内聚性低的模块意味着模块内部各部分的功能关联性不强,这样的模块在功能上存在重叠或缺乏清晰的职责划分。

4.1.1 内聚性与软件质量

内聚性与软件质量之间存在着直接的联系。高内聚的代码往往能够提供更加明确、单一的功能,这使得代码更容易被理解和维护。在项目开发过程中,开发团队能够更快速地定位问题,对功能进行修改和扩展。此外,高内聚的模块有助于提高代码的复用性,减少不必要的依赖,使得系统架构更加稳定。

4.1.2 不同内聚程度的划分

内聚程度可以根据模块内部各部分之间的关联程度来划分为几个层次,通常包括以下几种:

  • 功能性内聚(Functional Cohesion):模块内所有元素共同完成一个功能,这是最高级别的内聚。
  • 顺序内聚(Sequential Cohesion):模块内各元素按照一定顺序共同完成任务。
  • 通信内聚(Communicational Cohesion):模块内各元素处理相同的数据或相同类型的输入输出。
  • 过程内聚(Procedural Cohesion):模块内各元素共同执行一个过程或程序。
  • 时间内聚(Temporal Cohesion):模块内各元素因执行时间相同而聚集在一起。
  • 偶然内聚(Coincidental Cohesion):模块内各元素之间不存在任何逻辑关系,这是最低级别的内聚。

开发者应该尽量追求功能性内聚,避免偶然内聚的出现,以保证软件设计的高内聚性。

4.2 实现高内聚的方法

4.2.1 高内聚低耦合的代码设计

实现高内聚低耦合的关键在于合理地划分模块边界和定义清晰的模块职责。以下是一些常见的设计建议:

  • 使用单一职责原则(Single Responsibility Principle, SRP)来确保每个模块只负责一项任务。
  • 对模块进行合理的划分,将相关功能组合在一起,不相关的功能拆分开。
  • 通过接口或抽象类来定义模块间交互的协议,避免直接依赖实现类。
  • 将公共功能抽象成独立的服务或工具类,供其他模块复用。

4.2.2 设计模式在内聚性提升中的作用

设计模式是经过实践检验的、解决特定问题的模板。很多设计模式都以提高内聚性为目标。例如:

  • 工厂模式(Factory Pattern)允许将对象创建和使用分离,提高模块间的解耦,同时增强内聚性。
  • 策略模式(Strategy Pattern)使得一系列相关的算法能够独立于使用它们的客户端而变化,增强了模块的内聚性。
  • 命令模式(Command Pattern)通过封装请求为对象,使得调用者和请求者解耦,提升内聚。

每种设计模式都有其适用的场景,理解和应用设计模式能够帮助开发人员在设计软件时,更好地实现高内聚低耦合。

4.3 高内聚代码的评价与优化

4.3.1 代码审查与内聚性评估

在开发过程中,定期进行代码审查(Code Review)是评价代码内聚性的一个重要手段。通过代码审查可以:

  • 识别出低内聚的代码段落。
  • 发现模块间潜在的耦合问题。
  • 推动开发者重构代码,提高内聚性。

内聚性评估可以采用各种度量标准,如模块内元素的平均功能相关性等,但是,定量分析应结合定性分析,以获得全面的评估结果。

4.3.2 重构技巧与内聚性优化

重构是提高内聚性、降低耦合度的重要手段。以下是一些常用的重构技巧:

  • 提取方法(Extract Method):将一段代码提炼到一个新的方法中,以降低原有方法的复杂度并提高其内聚性。
  • 提取类(Extract Class):当一个类承担了太多的功能时,可以将这些功能提取到新的类中,以提高各自的内聚性。
  • 内聚重构(Cohesion Reorganization):对模块进行重新组织,使得模块内部元素更加相关,减少不必要或者松散的联系。

重构是持续的过程,开发者应该根据实际情况和代码审查的反馈,不断地对代码进行优化。

代码示例与分析

下面将通过一个简单的Java代码示例来说明如何通过重构来提高代码的内聚性。

示例代码

假设我们有一个表示购物车(ShoppingCart)的类,它包含了多个方法,以下是一部分简化的代码:

public class ShoppingCart {
    private List<Product> products = new ArrayList<>();

    public void addProduct(Product product) {
        products.add(product);
    }

    public void removeProduct(Product product) {
        products.remove(product);
    }

    public double getTotalPrice() {
        double total = 0.0;
        for (Product product : products) {
            total += product.getPrice();
        }
        return total;
    }

    public double applyDiscount(double discount) {
        double total = getTotalPrice();
        return total - (total * discount);
    }
}

在初始版本中, ShoppingCart 类执行了多种操作:添加产品、移除产品、计算总价和应用折扣。

重构实现

为了提升内聚性,我们可以将 ShoppingCart 类中与产品列表操作相关的代码提取到一个新的类 ProductList 中,如下:

public class ShoppingCart {
    private ProductList productList = new ProductList();

    public void addProduct(Product product) {
        productList.add(product);
    }

    public void removeProduct(Product product) {
        productList.remove(product);
    }

    public double getTotalPrice() {
        return productList.getTotalPrice();
    }

    public double applyDiscount(double discount) {
        return productList.getTotalPrice() - (productList.getTotalPrice() * discount);
    }
}

public class ProductList {
    private List<Product> products = new ArrayList<>();

    public void add(Product product) {
        products.add(product);
    }

    public void remove(Product product) {
        products.remove(product);
    }

    public double getTotalPrice() {
        double total = 0.0;
        for (Product product : products) {
            total += product.getPrice();
        }
        return total;
    }
}

通过重构, ShoppingCart 类变得更加简洁,只负责购物车的相关操作,而 ProductList 类则专注于管理产品列表。这样的设计提高了 ShoppingCart ProductList 的内聚性,同时也降低了两者之间的耦合度。

小结

代码内聚性是评估软件质量的重要标准之一,高内聚的代码能够提升软件的可读性、可维护性和可扩展性。通过使用设计模式、实施有效的代码审查以及应用重构技巧,我们可以显著提高代码的内聚性,并优化软件的整体架构。在实际开发中,持续关注代码内聚性的提升,将为项目的成功打下坚实的基础。


请注意,以上内容是根据您的要求以Markdown格式撰写的,并包含了一些代码示例,对代码逻辑进行了逐行解读分析。在实际的博客文章中,应适当增加图表、流程图和图片来增强文章的可读性和吸引力。同时,代码示例可以根据具体编程语言进一步完善。

# 5. `TestDemeter`项目代码实践

## 5.1 项目简介与架构设计

### 5.1.1 项目背景与目标

`TestDemeter`是一个用于演示迪米特法则(Law of Demeter)应用的项目。该法则主张一个对象应当对其它对象有尽可能少的了解,以此来降低对象间的耦合。在`TestDemeter`中,我们的目标是设计一系列类,并通过它们之间的交互来展示如何应用迪米特法则,以减少不必要的直接联系和依赖。

### 5.1.2 项目架构概述

`TestDemeter`项目采用了三层架构设计:表示层、业务逻辑层和数据访问层。这种设计分离了用户界面、应用逻辑和数据存储,有助于清晰地展示迪米特法则的应用。

## 5.2 迪米特法则在`TestDemeter`中的应用

### 5.2.1 代码设计与实现

在`TestDemeter`项目中,我们定义了一个`Customer`类,它通过`Order`类来获取订单信息。`Order`类又通过`Product`类来获取产品信息。在这个设计中,`Customer`类不需要直接与`Product`类交互,它通过`Order`类间接地获取所有必要的信息。这样的设计符合迪米特法则,即每个对象只与它的直接朋友通信。

```java
public class Customer {
    private Order order;

    public Customer(Order order) {
        this.order = order;
    }

    public List<Product> getProductList() {
        return order.getProducts();
    }
}

public class Order {
    private List<Product> products;

    public Order(List<Product> products) {
        this.products = products;
    }

    public List<Product> getProducts() {
        return products;
    }
}

public class Product {
    // Product class details...
}

5.2.2 迪米特法则的具体体现

在这个项目中, Customer 类不需要知道 Product 类的存在。 Order 类作为 Customer 类和 Product 类之间的中介,使得 Customer 类没有必要关心 Product 类的内部结构。 Customer 类只需要知道如何通过 Order 类来获取所需的产品信息。这种设计模式具体体现了迪米特法则的核心思想,即限制一个类和其它类的直接交互。

5.3 项目实践中的问题与解决方案

5.3.1 实际开发中遇到的问题分析

在开发 TestDemeter 项目时,我们遇到了需要传递多个参数的复杂场景。初步设计时,一个类需要直接与多个其他类交互,这违反了迪米特法则。例如, Customer 类直接从 Product Order 类中获取信息,这样的设计增加了类之间的耦合度。

5.3.2 解决方案的探讨与实施

为了解决这个问题,我们采用了迪米特法则的指导思想,重构了代码。我们引入了一个新的服务类 OrderService ,它负责与 Order Product 类通信,并将处理好的信息传递给 Customer 类。这样, Customer 类仍然保持了良好的封装性,且没有增加不必要的耦合。

public class OrderService {
    public List<Product> getOrderProducts(Order order) {
        return order.getProducts();
    }
}

public class Customer {
    private OrderService orderService;

    public Customer(OrderService orderService) {
        this.orderService = orderService;
    }

    public List<Product> getProductList() {
        // 假设有一个有效的Order对象
        Order order = ...;
        return orderService.getOrderProducts(order);
    }
}

以上重构符合迪米特法则,它减少了类之间的直接联系,优化了代码架构,提高了系统整体的内聚性和可维护性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:迪米特法则是一种面向对象设计原则,主张减少类间耦合以增强系统稳定性。该法则的核心在于“只和你的朋友交谈”,意味着对象间应通过公共接口进行通信,限制对其他对象内部细节的了解。本文通过 TestDemeter 项目示例,详细阐述了如何应用迪米特法则,包括对象通信、职责分配、耦合度降低和内聚性提升等关键指导原则,以实现更易维护和扩展的软件系统。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值