惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
小众软件
小众软件
The Cloudflare Blog
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
美团技术团队
WordPress大学
WordPress大学
罗磊的独立博客
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
Last Week in AI
Last Week in AI
月光博客
月光博客
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
GbyAI
GbyAI
B
Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗

博客园 - jadesun

【转载】Zachman框架 参加了IBM的架构师培训,总结了一些内容 数据仓库 - 事实表和维度表建立的方法论 Hadoop的学习历程 Hadoop手册_v0.3 MySQL_Cluster 的尝试及各种测试 Hadoop的学习历程 Hadoop手册_v0.2 尝试数据分片处理 和同事扯了一个理论模型出来,后面再验证是否合理。 依赖倒置原则 中国航油项目的一次数据库优化,关于Audit Logout的问题。 公文流转SQL优化日志七 公文流转SQL优化日志六 和同事们终于将Entity FrameWork整合进新的框架中了,发布第一个版本。 继续上篇实现的架构,有了新的进展。介绍一下格瑞趋势的产品 公文流转SQL优化日志五 工作日志,正在实现中的架构,针对SQL SERVER。参考了DZ的设计 公文流转SQL优化日志四 公文流转SQL优化日志三 公文流转SQL优化日志二
迪米特法则
jadesun · 2012-03-05 · via 博客园 - jadesun

迪米特法则(Law of Demeter,LoD)描述的是一个规则:一个对象应该对其它对象有最少的了解。迪米特法则的实际意义就是实现类内部的高内聚,类之间的低耦合。迪米特法则对类的低耦合提出明确的要求,其包含以下含义:

只和朋友类交流。

什么是直接的朋友类?每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖。朋友类的定义如下:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。案例:

 定义一个教师类,从迪米特法则来看,Teacher类中,GroupLeader是属于朋友类,因为它们通过方法的输入输出参数来成为朋友类的。

public class Teacher{
  public void commond(GroupLeader groupLeader){
    List<Gril> listGirls = new ArrayList();
    for (int i=0; i<20; i++){
      listGirls.add(new Gril());
    }
    groupLeader.countGrils(listGirls);
  }
}

而Gril这个类是出现在commond方法体内,因此不属于Teacher类的朋友类,这样就破坏了Teacher的健壮性。因为方法是类的一个行为,类竟然不知道自己的行为与其它类产生依赖关系,这是违反迪米特法则的。造成了Teacher和Girl两个类之间的高耦合。

public class GroupLeader{
  public void countGrils(List<Gril> listGirls){
    System.out.println("女生数量是:"+listGirls.size()); 
  }
}



将以上的代码进行修改,以符合迪米特法则。首先将Girl类从Teacher类的commond方法移除。

public class Teacher {
    public void commond(GroupLeader groupLeader){
        groupLeader.countGirls();
    }
}

修改GroupLeader类,将Gril类做为成员变量。

public class GroupLeader{
    private List<Gril> listGirls;
    public GroupLeader(List<Girl> _listGirls){
        this.listGirls = _listGirls;
    }
    public void countGirls(){
        System.out.println()("女生数量是:"+this.listGirls.size())
    }
}

把List<Girl>的初始化移动到场景类中,同时在GroupLeader中增加对Gril的注入,避开Teacher类对陌生类Gril的访问,降低系统之间的耦合。

public class Client{
    public static void main(String[] args){
        //产生一个女生群体
        List<Girl> listGirls = new ArrayList<Girl>();
        //初始化Gril的值
        for (int i=0; i<20;i++){
            listGirls.add(new Girl());
        }
        Teacher teacher = new Teacher();
        
        teacher.commond(new GroupLeader(listGirls));
    }
}