tip: 作為程序員一定學(xué)習(xí)編程之道,一定要對(duì)代碼的編寫有追求,不能實(shí)現(xiàn)就完事了。我們應(yīng)該讓自己寫的代碼更加優(yōu)雅,即使這會(huì)費(fèi)時(shí)費(fèi)力。
相關(guān)規(guī)則:
推薦:體系化學(xué)習(xí)Java(Java面試專題)
1.6大設(shè)計(jì)規(guī)則-接口隔離原則
2.6大設(shè)計(jì)原則-里氏替換原則
3.6大設(shè)計(jì)規(guī)則-開(kāi)閉原則
4.6大設(shè)計(jì)規(guī)則-單一職責(zé)原則
5.6大設(shè)計(jì)規(guī)則-依賴倒置原則
迪米特法則
《設(shè)計(jì)模式之禪》第5章介紹關(guān)于迪米特法則,總結(jié)真言:只和你關(guān)系好的朋友交流。
這個(gè)真言怎么理解呢?迪米特法則在書中有個(gè)英文解釋:Only talk to your immedate friends,翻譯過(guò)來(lái)就是至于你直系的朋友溝通。按我的理解就是**“各司其職”**。
在介紹例子之前,我官方的介紹一下它,迪米特法則,也稱為最少知識(shí)原則,定義是這樣的:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象最少得了解。
一、關(guān)于迪米特法則的一個(gè)小例子
接下來(lái)我舉個(gè)例子說(shuō)明下:
場(chǎng)景:我們需要開(kāi)發(fā)一個(gè)首頁(yè)上展示用戶注冊(cè)數(shù)量的功能,我們需要給前端提供一個(gè)接口查詢用戶數(shù)量的。
很多同學(xué)肯定說(shuō),這我會(huì)啊,不就是controller、service、mapper的增刪改查的那一套嘛,這熟悉的不能再熟悉了。但是你可不一定能寫的規(guī)范,即使寫規(guī)范了,你知道為什么要這么寫嗎?對(duì)于這個(gè)場(chǎng)景的實(shí)現(xiàn)有兩種不規(guī)范的情況:
1、IndexController 里調(diào)用 IndexService,然后 IndexServiceImpl 里調(diào)用 UserMapper 查詢用戶數(shù)量,這種寫法可能在很多大家做過(guò)的項(xiàng)目中非常常見(jiàn),這種寫法沒(méi)有錯(cuò),只是不符合單一職責(zé)原則,并且也不符合**“功能內(nèi)聚”**的規(guī)范。
2、直接在 IndexController 里調(diào)用 UserMapper,其實(shí)這個(gè)就是不符合迪米特法則 ,Controller 很清楚的定義,就是請(qǐng)求的前置處理,處理一些接口參數(shù)校驗(yàn),包括一些轉(zhuǎn)換等,而 Service 的定義則是業(yè)務(wù)處理,如果要在 Controller 里查詢,處理業(yè)務(wù)邏輯,本身功能不會(huì)出錯(cuò),但是不符合規(guī)范,不符合迪米特法則 ,“沒(méi)有各司其職,是一種越俎代庖的表現(xiàn)”。
package com.pany.camp.design.principle.demeter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
*
* @description: 用戶實(shí)現(xiàn)
* @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 {
/**
* 查詢用戶注冊(cè)數(shù)量
*
* @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: 用戶實(shí)現(xiàn)
* @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 {
/**
* 查詢用戶注冊(cè)數(shù)量
*
* @since 1.0.0
* @param
* @return: java.lang.Integer
* @author: panyong
* @version: 1.0.0
* @createTime: 2023-05-30 23:09
*/
Integer findActiveUserCount();
}
二、為什么要使用迪米特法則
我們面向面試說(shuō)下為什么要使用迪米特原則,因?yàn)槊嬖嚬倏赡苓@樣問(wèn)你:“你知道哪些設(shè)計(jì)規(guī)則?” 、“為什么要用這個(gè)設(shè)計(jì)規(guī)則,有什么好處,有什么還出呢?”、“舉一個(gè)使用這個(gè)規(guī)則的場(chǎng)景說(shuō)明一下”等等。
1、“為什么要用這個(gè)設(shè)計(jì)規(guī)則,有什么好處,有什么還出呢?”文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-469266.html
迪米特法則的核心觀念就是:類之間解耦,弱耦合。耦合松了,類的復(fù)用性就提高了,以上這些事好處。如果面試還問(wèn)到了壞處?你是不是要懵了,這TM的公認(rèn)的設(shè)計(jì)規(guī)范,還有壞處?當(dāng)然,很多東西它都是把雙刃劍,解決了A問(wèn)題,那么可能引起B(yǎng)問(wèn)題。迪米特法則也不例外,它的壞處就是**類松耦合了,有可能會(huì)帶來(lái)大量的中轉(zhuǎn)調(diào)用,A要通過(guò)調(diào)用B,然后調(diào)用C,再調(diào)用D才能獲取想要的結(jié)果。**這樣調(diào)用的深度會(huì)讓系統(tǒng)的復(fù)雜度提升,從而維護(hù)成本提升。成本提升了,老板就要暴怒了,TM的讓你寫個(gè)代碼,你非要搞追求,搞情操,哈哈哈。
所以在遵循規(guī)范的同時(shí),也要權(quán)衡可讀性、維護(hù)性等因素,不可盲目炫技,為了實(shí)現(xiàn)而實(shí)現(xiàn),搞得本末倒置。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-469266.html
到了這里,關(guān)于6大設(shè)計(jì)規(guī)則-迪米特法則的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!