迪米特法则

2021-09-29  本文已影响0人  攻城虱小马褂

软件开发一直在推崇一个概念-低耦合、高内聚。 那什么样的代码设计才算得上低耦合、高内聚的代码。本文通过迪米特法则来讲解一下如何进行低耦合的代码设计。

迪米特法则也叫最小知识原则(Least Knowledge Principle),即一个类应该对自己需要耦合和调用的类保持最少的认识。也就是一个类对自己依赖的类知道的越少越好。因而迪米特法则应该遵循一下的要义

  1. 被依赖者,只应该暴露应该暴露的方法
  2. 依赖者,只依赖应该依赖的对象

一个案例

David Bock根据迪米特法则给出了一个超市购物的案例。
三个关键信息:消费者、钱包、收银员
定义了三个类,分别是Customer、Wallet、PaperBoy

public class Customer {
    private String firstName;
    private String lastName;
    private Wallet myWallet;
    public String getFirstName(){
        return firstName;
    }
    public String getLastName(){
        return lastName;
    }
    public Wallet getWallet(){
        return myWallet;
    }
}
public class Wallet {
    private float value;
    public float getTotalMoney() {
        return value;
    }
    public void setTotalMoney(float newValue) {
        value = newValue;
    }
    public void addMoney(float deposit) {
        value += deposit;
    }
    public void subtractMoney(float debit) {
        value -= debit;
    }
}

public class Paperboy {
    public void charge(Customer myCustomer, double payment) {
        Wallet theWallet = myCustomer.getWallet();
        if (theWallet.getTotalMoney() > payment) {
            theWallet.subtractMoney(payment);
        } else {
            //money not enough
        }
    }
}

从这三个类可以看出, PaperBoy承担了大多数的功能实现。PaperBoy从消费者那里拿到了钱包,核点钱包的的金钱并自己从中拿去购物的费用。paperBoy既与Customer发生直接交互,又与Wallet发生间接交互,不符合最小知识原则(迪米特法则)。案例主要存在以下问题

如何进行修改

public class PaperBoy {
    private Customer customer;

    public PaperBoy(Customer customer){
        this.customer = customer;
    }

    public void charge(float payment){
        customer.pay(payment);
    }
}
public class Customer {
    private String firstName;
    private String lastName;
    private Wallet myWallet;

    public Customer(String firstName, String lastName, Wallet myWallet) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.myWallet = myWallet;
    }

    public String getFirstName(){
        return firstName;
    }
    public String getLastName(){
        return lastName;
    }

    public void pay(float payment){
        myWallet.pay(payment);
    }
}
public class Wallet {
    private float value;
    private float getTotalMoney() {
        return value;
    }
    public void setTotalMoney(float newValue) {
        value = newValue;
    }
    private void addMoney(float deposit) {
        value += deposit;
    }
    private void subtractMoney(float debit) {
        value -= debit;
    }

    public void pay(float payment){
        if(getTotalMoney()>payment){
            subtractMoney(payment);
        }else {

        }
    }
}

迪米特法则核心观念--- 类间解耦、弱耦合

上一篇 下一篇

猜你喜欢

热点阅读