勇哥谈下迪米特法则

勇哥注:

迪米特法则是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,
它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则


迪米特法则包含前后两个部分,如果我们把一个模块看作是一个人,

那么要实现“一个人应该对其他人有最少的了解”,应该做到这两点:

1、只和直接的朋友交流;

2、减少对朋友的了解。

接下来就详细说说如何做到这两点。

首先,我们来看一下,什么叫“朋友”

软件开发中的朋友:两个对象之间的耦合关系称之为“朋友”,通常有依赖、关联、聚合和组合等。

而直接朋友则通常表现为关联、聚合和组合关系,

即两个对象之间联系更为紧密,通常以成员变量,方法的参数和返回值的形式出现。



减少对朋友的了解


举个例子,明星与粉丝的互动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            名星 star = new 名星();
            star.和粉丝互动();
            Console.ReadKey();
        }
    }

    public class 粉丝
    {
        public void 握手()
        {
            Console.WriteLine($"与偶像握手");
        }

        public void 签名()
        {
            Console.WriteLine($"与偶像签名");
        }

        public void 合影()
        {
            Console.WriteLine($"与偶像合影");
        }

        public void 互动()
        {
            握手(); 签名(); 合影();
        }
    }

    public class 名星
    {
        private 粉丝 fs=new 粉丝();

        public void 和粉丝互动()
        {
            //由于粉丝类公布的公有方法太多,因此互动有下面的可能性

            //1. 
            fs.互动();

            //2.
            fs.握手();
            fs.签名();
            fs.合影();

            //3.
            fs.签名();
            fs.合影();
        }

        //问题:
        //粉丝做为明星的朋友,公开方法太多,使得明星对粉化了解过程。
        //明星就得花大精力去考虑以哪种方式跟粉丝互动


    }


}

问题:

    粉丝做为明星的朋友,公开方法太多,使得明星对粉丝了解过多。

    明星就得花大精力去考虑以哪种方式跟粉丝互动


修改后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            名星 star = new 名星();
            star.和粉丝互动();
            Console.ReadKey();
        }
    }

    public class 粉丝
    {
        private void 握手()
        {
            Console.WriteLine($"与偶像握手");
        }

        private void 签名()
        {
            Console.WriteLine($"与偶像签名");
        }

        private void 合影()
        {
            Console.WriteLine($"与偶像合影");
        }

        public void 互动()
        {
            握手(); 签名(); 合影();
        }
    }

    public class 名星
    {
        private 粉丝 fs=new 粉丝();

        public void 和粉丝互动()
        {

            fs.互动();

        }

    }

}


其实,明星由于全身心投入艺术,所以许多日常事务由经济人负责处理,

如粉丝见面会,和媒体公司的业务洽谈等。

这里的经纪人就是明星的直接朋友,粉丝和媒体公司是明星的间接朋友。


只和直接的朋友交流


现在,我们在刚才的场景中,加多一个经纪人类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            名星 star = new 名星();
            star.粉丝互动();
            Console.ReadKey();
        }
    }

    public class 粉丝
    {
        private void 握手()
        {
            Console.WriteLine($"与偶像握手");
        }

        private void 签名()
        {
            Console.WriteLine($"与偶像签名");
        }

        private void 合影()
        {
            Console.WriteLine($"与偶像合影");
        }

        public void 互动()
        {
            握手(); 签名(); 合影();
        }
    }

    public class 名星
    {
        private 经纪人 man = new 经纪人();
        
        public void 粉丝互动()
        {
            man.粉丝互动();
        }
    }

    public class 经纪人
    {
        private 粉丝 fs;
        private 商务洽谈 sw;

        public 经纪人()
        {
            fs = new 粉丝();
            sw = new 商务洽谈();
        }

        public void 粉丝互动()
        {
            fs.互动();
        }
    }


    public class 商务洽谈
    {

    }



}


明星的直接朋友只有一个,也就是他的经纪人,无需了解粉丝和公司。

这样做有一个好处,就是能够简化对象与对象之间的通信,

进而减轻依赖,提供更高的灵活性,当然也可以提供一定的安全性。


总结

不该有直接依赖关系的类之间,不要有依赖;

有依赖关系的类之间,尽量只依赖必要的接口(也就是定义中的“有限知识”)。




--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-11-13 16:09:24 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864