6大设计规则-迪米特法则

这篇具有很好参考价值的文章主要介绍了6大设计规则-迪米特法则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

相关规则:

推荐:体系化学习Java(Java面试专题)

1.6大设计规则-接口隔离原则
2.6大设计原则-里氏替换原则
3.6大设计规则-开闭原则
4.6大设计规则-单一职责原则
5.6大设计规则-依赖倒置原则

迪米特法则

《设计模式之禅》第5章介绍关于迪米特法则,总结真言:只和你关系好的朋友交流。
这个真言怎么理解呢?迪米特法则在书中有个英文解释:Only talk to your immedate friends,翻译过来就是至于你直系的朋友沟通。按我的理解就是**“各司其职”**。

在介绍例子之前,我官方的介绍一下它,迪米特法则,也称为最少知识原则,定义是这样的:一个对象应该对其他对象最少得了解。

一、关于迪米特法则的一个小例子

接下来我举个例子说明下:

场景:我们需要开发一个首页上展示用户注册数量的功能,我们需要给前端提供一个接口查询用户数量的。

很多同学肯定说,这我会啊,不就是controller、service、mapper的增删改查的那一套嘛,这熟悉的不能再熟悉了。但是你可不一定能写的规范,即使写规范了,你知道为什么要这么写吗?对于这个场景的实现有两种不规范的情况:

1、IndexController 里调用 IndexService,然后 IndexServiceImpl 里调用 UserMapper 查询用户数量,这种写法可能在很多大家做过的项目中非常常见,这种写法没有错,只是不符合单一职责原则,并且也不符合**“功能内聚”**的规范。

2、直接在 IndexController 里调用 UserMapper,其实这个就是不符合迪米特法则 ,Controller 很清楚的定义,就是请求的前置处理,处理一些接口参数校验,包括一些转换等,而 Service 的定义则是业务处理,如果要在 Controller 里查询,处理业务逻辑,本身功能不会出错,但是不符合规范,不符合迪米特法则 ,“没有各司其职,是一种越俎代庖的表现”

package com.pany.camp.design.principle.demeter;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

/**
 *
 * @description:  用户实现
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: panyong 
 * @version: 1.0.0 
 * @createTime: 2023-05-30 22:55
 */
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private UserMapper userMapper;

    @Override
    public Integer doSearchRegisterUserNum() {
        return userMapper.findActiveUserCount();
    }
}

package com.pany.camp.design.principle.demeter;

/**
 *
 * @description: 用户接口
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: panyong 
 * @version: 1.0.0 
 * @createTime: 2023-05-30 22:54
 */
public interface UserService {
    
    /**
     * 查询用户注册数量
     * 
     * @since 1.0.0
     * @param
     * @return: java.lang.Integer 
     * @author: panyong 
     * @version: 1.0.0 
     * @createTime: 2023-05-30 23:07 
     */  
    Integer doSearchRegisterUserNum();
}

package com.pany.camp.design.principle.demeter;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

/**
 *
 * @description:  用户实现
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: panyong 
 * @version: 1.0.0 
 * @createTime: 2023-05-30 22:55
 */
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private UserMapper userMapper;

    @Override
    public Integer doSearchRegisterUserNum() {
        return userMapper.findActiveUserCount();
    }
}

package com.pany.camp.design.principle.demeter;


/**
 *
 * @description:  用户持久层接口
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: panyong 
 * @version: 1.0.0 
 * @createTime: 2023-05-30 23:09
 */
public interface UserMapper {

    /**
     * 查询用户注册数量
     *
     * @since 1.0.0
     * @param
     * @return: java.lang.Integer
     * @author: panyong
     * @version: 1.0.0
     * @createTime: 2023-05-30 23:09
     */
    Integer findActiveUserCount();
}

二、为什么要使用迪米特法则

我们面向面试说下为什么要使用迪米特原则,因为面试官可能这样问你:“你知道哪些设计规则?” 、“为什么要用这个设计规则,有什么好处,有什么还出呢?”、“举一个使用这个规则的场景说明一下”等等。

1、“为什么要用这个设计规则,有什么好处,有什么还出呢?”

迪米特法则的核心观念就是:类之间解耦,弱耦合。耦合松了,类的复用性就提高了,以上这些事好处。如果面试还问到了坏处?你是不是要懵了,这TM的公认的设计规范,还有坏处?当然,很多东西它都是把双刃剑,解决了A问题,那么可能引起B问题。迪米特法则也不例外,它的坏处就是**类松耦合了,有可能会带来大量的中转调用,A要通过调用B,然后调用C,再调用D才能获取想要的结果。**这样调用的深度会让系统的复杂度提升,从而维护成本提升。成本提升了,老板就要暴怒了,TM的让你写个代码,你非要搞追求,搞情操,哈哈哈。
所以在遵循规范的同时,也要权衡可读性、维护性等因素,不可盲目炫技,为了实现而实现,搞得本末倒置。文章来源地址https://www.toymoban.com/news/detail-469266.html

到了这里,关于6大设计规则-迪米特法则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过简单的中介者模式模型了解迪米特法则(设计模式与开发实践 P14)

    虽然面向对象鼓励将行为分布到各个对象中,把对象划分成更小的粒度有利于对象可复用性,但有时对象之间联系太多又会反而降低可复用性 通过一个中介者对象封装 一组对象之间的交互 ,减少对象间直接耦合,对象之间的通信集中在中介者对象中,使得对象间交互更加简

    2024年02月07日
    浏览(37)
  • MySQL索引3——Explain关键字和索引使用规则(SQL提示、索引失效、最左前缀法则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(44)
  • 【如何确定自己作为程序员的职业发展方向?】

    优秀的程序员在选择自己的职业方向时,通常会考虑以下几个因素: 兴趣和热情:程序员应该选择对自己有兴趣并且热情的领域。兴趣可以保持你的工作动力,并且更容易取得成功。 技术发展潜力:选择一个技术发展潜力大的方向可以确保你的职业长期稳定发展。例如,人

    2024年02月09日
    浏览(49)
  • 作为程序员,你很有必要了解一下IVX

    iVX 是一个“零代码”的可视化编程平台,拥有方便的在线集成开发环境,不需要下载开发环境,打开浏览器即可随时随地进行项目编辑。iVX 还拥有“一站式”的云资源,通过这一套一站式服务,iVX 可以实现一站式研发、一站式部署、一站式维护。iVX相当于“一款零代码可视

    2024年02月15日
    浏览(55)
  • 作为一个程序员一定要掌握的算法之遗传算法

    目录 一、引言 1.1 目的 1.2 意义 二、遗传算法介绍 2.1 遗传算法的基本思想 2.2 遗传算法与其他算法的主要区别 2.3 基于Java的遗传算法设计思想 三、遗传算法的具体实现 3.1 系统功能模块图和说明 3.2 代码和说明 3.2.1 初始化 3.2.2 选择运算 3.2.3 交叉运算 3.2.4 变异运算 3.2.5 主函

    2024年02月15日
    浏览(61)
  • chatGPT4问世,作为一个程序员应当如何去理解?

    前几年 AI 发展也遇到过许多瓶颈,甚至很多AI投资者因为技术得不到突破而破产。但近几年AI技术飞速发展,特别是今天的主题chatGPT 第一次问世还只是一个帮学生写作业的工具,第二次迭代即可完成大部分市场业务,回答很多刁钻的问题。 有人测试过问chatGPT一些很难以回答

    2023年04月10日
    浏览(60)
  • 作为一名程序员,如何写出一手让同事膜拜的漂亮代码?

    整洁的代码 有意义的命名 函数命名 变量命名 函数的定义 注释的规范 代码的长度 代码的对齐 我写代码已经有好几年了,最近看了一本书叫做《代码整洁之道》。我发现这本书中介绍的一些内容对我来说非常有启发性。书中提到的一些方法和技巧让我重新审视了自己的代码

    2024年02月02日
    浏览(63)
  • 【作为程序员,你有什么让人眼前一亮的代码实现方式?】

    随着科技的不断发展,编程语言也在不断更新和改进。作为程序员,我们需要选取一种适合自己的高级编程语言来完成项目任务。下面将介绍常见的三种高级编程语言:Python、Java和C++。 Python Python是一种高级编程语言,具有简单易学、可读性强、效率高等特点。它广泛应用于

    2024年02月06日
    浏览(46)
  • 什么?作为程序员你还不知道人工智能搜索引擎?

    作者 :明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐 : (1)《人工智能时代,软件工程师们将会被取代?》 (2)

    2024年02月10日
    浏览(74)
  • 【Github】作为程序员不得不知道的几款Github加速神器

    众所周知,近几年国内用户在访问 Github 时,经常间歇性无法访问 Github 。 接下来推荐几款 作为程序员不得不知道的 Github加速神器 。 FastGithub 是一款 Github 加速神器,解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问题。 它支持多

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包