面向对象设计-迪米特法则

概述

迪米特法则(Low of Demeter,LoD)指设计一个对象时,尽可能少的与其它对象发生相互作用,尽可能少的了解或依赖其它对象,降低耦合度。它主要强调:不要和陌生人讲话,只和朋友交流。出现在成员变量、方法的输入、输出参数中的类都可以称为成员朋友类,而出现在方法体内部的类不属于朋友类。

代码示例

比如,以项目经理和老板汇报手头上负责的项目进度为例。

// 1.项目
public class Project {
}

// 2.项目经理
public class ProjectManager {
    // 检查并汇报项目进度
    public int[] checkProgress(List projects){
        // 每个项目的进度
        int[] rates  =  new int[projects.size()];
        for (int i = 0; i < rates.length; i++){
            // 查看每个项目的进度,这里使用100以内的随机数模拟
            rates[i] = new Random().nextInt(101);
        }
        return rates;
    }
}

// 3.老板,CEO
public class Ceo {
    public void checkProgress(ProjectManager projectManager){
        // Ceo从某处检索或找到项目经理负责的项目,假设有5个项目
        // projects相当于陌生人对象
        List projects = new ArrayList<>();
        for (int i = 0; i < 5; i++){
            projects.add(new Project());
        }

        // 听项目经理汇报
        projectManager.checkProgress(projects);
    }
}

上面的代码中,功能已经实现。根据迪米特法则,Ceo只想听结果,不关心或应由项目经理整理自己负责的项目。下面根据迪米特法则进行重构,项目整理由项目经理负责。

// 1.项目
public class Project {
}

// 2.项目经理
public class ProjectManager {
    // 负责的项目:这里不演示如何创建或检索项目
    private List projects;

    // 检查并汇报项目进度
    public int[] checkProgress(){
        // 每个项目的进度
        int[] rates  =  new int[projects.size()];
        for (int i = 0; i < rates.length; i++){
            // 查看每个项目的进度,这里使用100以内的随机数模拟
            rates[i] = new Random().nextInt(101);
        }
        return rates;
    }
}

// 3.老板,CEO
public class Ceo {
    public void checkProgress(ProjectManager projectManager){
        // 听项目经理汇报
        projectManager.checkProgress();
    }
}

重构完成后,项目经理和老板都是各自与朋友对象打交道。

总结

所有的设计原则都已经介绍完毕。学习设计原则是学习设计模式的基础。实际开发过程中,并不是所有的代码都完全遵循设计原则,要从项目自身的人力、时间、成本等各方面综合考量,需要不断积累经验,在适当的场景遵循使用设计原则,可以帮助我们设计编写处更优雅的代码结构,同时可以提供代码的可复用性、扩展性以及可维护性。

你可能感兴趣的:(面向对象设计-迪米特法则)