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

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
H
Help Net Security
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
I
InfoQ
SecWiki News
SecWiki News
T
Tailwind CSS Blog
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
M
MIT News - Artificial intelligence
S
Schneier on Security
T
Threat Research - Cisco Blogs
F
Fortinet All Blogs
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The Cloudflare Blog
Recent Announcements
Recent Announcements
Security Latest
Security Latest
G
GRAHAM CLULEY
IT之家
IT之家
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
Google DeepMind News
Google DeepMind News
V
V2EX
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
B
Blog RSS Feed
S
SegmentFault 最新的问题
博客园 - 叶小钗
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Project Zero
Project Zero
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure

博客园 - 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));
    }
}