日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

規則執行器:告別冗余IF判斷,讓代碼更優雅高效

來源: 責編: 時間:2024-07-03 10:11:47 220觀看
導讀最近公司有個小需求,需要對之前已有的試用用戶申請規則進行拓展。我們的場景大概如下所示:if (是否海外用戶) { return false;}if (刷單用戶) { return false;}if (未付費用戶 && 不再服務時段) { return false}if (

最近公司有個小需求,需要對之前已有的試用用戶申請規則進行拓展。我們的場景大概如下所示:iDc28資訊網——每日最新資訊28at.com

if (是否海外用戶) { return false;}if (刷單用戶) {  return false;}if (未付費用戶 && 不再服務時段) {  return false}if (轉介紹用戶 || 付費用戶 || 內推用戶) {  return true;}

按照上述的條件我們可以得出的結論是:iDc28資訊網——每日最新資訊28at.com

  1. 咱們的的主要流程主要是基于and 或者or 的關系。
  2. 如果有一個不匹配的話,其實咱們后續的流程是不用執行的,就是需要具備一個短路的功能。
  3. 對于目前的現狀來說,我如果在原有的基礎上來改,只要稍微注意一下解決需求不是很大的問題,但是說后面可維護性非常差。

后面經過權衡過后,我還是決定將這個部分進行重構一下。iDc28資訊網——每日最新資訊28at.com

規則執行器

針對這個需求,我首先梳理了一下咱們規則執行器大概的設計, 然后我設計了一個 V1 版本和大家一起分享一下,如果大家也有這樣的 case 可以給我分享留言,下面部分主要是設計和實現的流程和 code。iDc28資訊網——每日最新資訊28at.com

規則執行器的設計

規則處理邏輯優化規則處理邏輯優化iDc28資訊網——每日最新資訊28at.com

iDc28資訊網——每日最新資訊28at.com

對于規則的抽象并實現規則

// 業務數據@Datapublic class RuleDto {  private String address; private int age;}// 規則抽象public interface BaseRule {    boolean execute(RuleDto dto);}// 規則模板public abstract class AbstractRule implements BaseRule {    protected <T> T convert(RuleDto dto) {        return (T) dto;    }    @Override    public boolean execute(RuleDto dto) {        return executeRule(convert(dto));    }      protected <T> boolean executeRule(T t) {        return true;    }}// 具體規則- 例子1public class AddressRule extends AbstractRule {    @Override    public boolean execute(RuleDto dto) {        System.out.println("AddressRule invoke!");        if (dto.getAddress().startsWith(MATCH_ADDRESS_START)) {            return true;        }        return false;    }}// 具體規則- 例子2public class NationalityRule extends AbstractRule {    @Override    protected <T> T convert(RuleDto dto) {        NationalityRuleDto nationalityRuleDto = new NationalityRuleDto();        if (dto.getAddress().startsWith(MATCH_ADDRESS_START)) {            nationalityRuleDto.setNationality(MATCH_NATIONALITY_START);        }        return (T) nationalityRuleDto;    }    @Override    protected <T> boolean executeRule(T t) {        System.out.println("NationalityRule invoke!");        NationalityRuleDto nationalityRuleDto = (NationalityRuleDto) t;        if (nationalityRuleDto.getNationality().startsWith(MATCH_NATIONALITY_START)) {            return true;        }        return false;    }}// 常量定義public class RuleConstant {    public static final String MATCH_ADDRESS_START= "北京";    public static final String MATCH_NATIONALITY_START= "中國";}

執行器構建

public class RuleService {    private Map<Integer, List<BaseRule>> hashMap = new HashMap<>();    private static final int AND = 1;    private static final int OR = 0;    public static RuleService create() {        return new RuleService();    }    public RuleService and(List<BaseRule> ruleList) {        hashMap.put(AND, ruleList);        return this;    }    public RuleService or(List<BaseRule> ruleList) {        hashMap.put(OR, ruleList);        return this;    }    public boolean execute(RuleDto dto) {        for (Map.Entry<Integer, List<BaseRule>> item : hashMap.entrySet()) {            List<BaseRule> ruleList = item.getValue();            switch (item.getKey()) {                case AND:                    // 如果是 and 關系,同步執行                    System.out.println("execute key = " + 1);                    if (!and(dto, ruleList)) {                        return false;                    }                    break;                case OR:                    // 如果是 or 關系,并行執行                    System.out.println("execute key = " + 0);                    if (!or(dto, ruleList)) {                        return false;                    }                    break;                default:                    break;            }        }        return true;    }    private boolean and(RuleDto dto, List<BaseRule> ruleList) {        for (BaseRule rule : ruleList) {            boolean execute = rule.execute(dto);            if (!execute) {                // and 關系匹配失敗一次,返回 false                return false;            }        }        // and 關系全部匹配成功,返回 true        return true;    }    private boolean or(RuleDto dto, List<BaseRule> ruleList) {        for (BaseRule rule : ruleList) {            boolean execute = rule.execute(dto);            if (execute) {                // or 關系匹配到一個就返回 true                return true;            }        }        // or 關系一個都匹配不到就返回 false        return false;    }}

執行器的調用

public class RuleServiceTest {    @org.junit.Test    public void execute() {        //規則執行器        //優點:比較簡單,每個規則可以獨立,將規則,數據,執行器拆分出來,調用方比較規整        //缺點:數據依賴公共傳輸對象 dto        //1. 定義規則  init rule        AgeRule ageRule = new AgeRule();        NameRule nameRule = new NameRule();        NationalityRule nationalityRule = new NationalityRule();        AddressRule addressRule = new AddressRule();        SubjectRule subjectRule = new SubjectRule();        //2. 構造需要的數據 create dto        RuleDto dto = new RuleDto();        dto.setAge(5);        dto.setName("張三");        dto.setAddress("北京");        dto.setSubject("數學");;        //3. 通過以鏈式調用構建和執行 rule execute        boolean ruleResult = RuleService                .create()                .and(Arrays.asList(nationalityRule, nameRule, addressRule))                .or(Arrays.asList(ageRule, subjectRule))                .execute(dto);        System.out.println("this student rule execute result :" + ruleResult);    }}

總結

規則執行器的優點和缺點iDc28資訊網——每日最新資訊28at.com

  • 優點:

比較簡單,每個規則可以獨立,將規則,數據,執行器拆分出來,調用方比較規整;iDc28資訊網——每日最新資訊28at.com

我在 Rule 模板類中定義 convert 方法做參數的轉換這樣可以能夠,為特定 rule 需要的場景數據提供拓展。iDc28資訊網——每日最新資訊28at.com

  • 缺點:上下 rule 有數據依賴性,如果直接修改公共傳輸對象 dto 這樣設計不是很合理,建議提前構建數據。

本文鏈接:http://m.www897cc.com/showinfo-26-98418-0.html規則執行器:告別冗余IF判斷,讓代碼更優雅高效

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C#字符串處理技術詳解,你學會了嗎?

下一篇: .NET Core MVC 頁面傳值方式詳解

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • iQOO Neo8系列新品發布會

    旗艦雙芯 更強更Pro
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久九九精品| 日韩视频在线观看| 国产精自产拍久久久久久| 国产精品美女在线观看| 国产日产精品一区二区三区四区的观看方式 | 亚洲视频大全| 欧美中文在线观看国产| 六月丁香综合| 欧美三级韩国三级日本三斤| 欧美日韩在线不卡| 国产亚洲一级高清| 亚洲日本免费电影| 亚洲欧美视频| 男女精品网站| 国产精品日韩欧美综合| 在线欧美日韩精品| 亚洲性视频网址| 久久亚洲欧美| 欧美四级伦理在线| 激情成人综合| 中文在线一区| 美女精品在线| 国产精品无码永久免费888| 在线观看欧美日韩国产| 亚洲一区高清| 欧美国产91| 国产一区视频在线看| 一区二区三区欧美| 久久影视精品| 国产乱码精品一区二区三区忘忧草 | 国产亚洲在线观看| 日韩一区二区免费看| 久久se精品一区二区| 欧美日韩黄视频| 一区二区视频免费在线观看 | 亚洲欧美精品在线| 免费在线日韩av| 国产乱码精品一区二区三区不卡| 亚洲精品看片| 久久久久久久综合色一本| 欧美性事在线| 91久久午夜| 久久国产精品99久久久久久老狼 | 国产精品入口夜色视频大尺度| 在线精品观看| 午夜日韩电影| 欧美视频手机在线| 亚洲人成7777| 久久青草久久| 国产无遮挡一区二区三区毛片日本| 一本久久a久久精品亚洲| 久久一二三四| 国产一区二区久久久| 亚洲在线一区二区三区| 欧美日本中文字幕| 91久久精品网| 老牛国产精品一区的观看方式| 国产日韩一区二区三区在线播放 | 亚洲人线精品午夜| 久久久人成影片一区二区三区| 国产精品美女久久| 中文成人激情娱乐网| 欧美日韩成人激情| 亚洲精品久久视频| 欧美大片一区二区三区| 国语精品中文字幕| 欧美一区精品| 国产麻豆午夜三级精品| 亚洲综合社区| 国产精品久久9| 欧美成人免费一级人片100| 国产婷婷一区二区| 香蕉成人伊视频在线观看| 国产精品久久久久久久久借妻| 一本色道久久综合亚洲精品按摩| 欧美成人一区二免费视频软件| 在线观看av一区| 浪潮色综合久久天堂| 在线观看日韩av| 久久综合久色欧美综合狠狠| 黄色精品在线看| 久久婷婷成人综合色| 国产揄拍国内精品对白| 欧美一区二区高清| 国产一区二区激情| 久久久免费av| 亚洲福利av| 欧美成人一品| 99精品久久久| 欧美少妇一区| 亚洲自拍啪啪| 国产精品自拍视频| 国产精品毛片va一区二区三区 | 国产精品视频久久久| 亚洲免费视频一区二区| 国产精品男gay被猛男狂揉视频| 亚洲一区二区三区在线观看视频| 国产精品久久国产三级国电话系列| 亚洲专区一区| 国产一区二区三区久久| 久久躁日日躁aaaaxxxx| 亚洲破处大片| 国产精品mv在线观看| 欧美一区观看| 亚洲国产老妈| 欧美日韩亚洲一区二区三区在线 | 久久日韩粉嫩一区二区三区| 亚洲高清资源综合久久精品| 欧美激情一区二区在线 | 亚洲大片一区二区三区| 欧美精品v国产精品v日韩精品| 一本大道久久a久久综合婷婷| 国产精品久久777777毛茸茸| 欧美一区二区三区四区在线观看地址 | 欧美丝袜一区二区三区| 性欧美8khd高清极品| 在线播放豆国产99亚洲| 欧美成人有码| 亚洲一区影音先锋| 黄网站色欧美视频| 欧美日韩精品国产| 性久久久久久久久久久久| 在线观看成人一级片| 欧美日韩在线大尺度| 欧美在线国产精品| 亚洲人成啪啪网站| 国产精品午夜久久| 狂野欧美性猛交xxxx巴西| 中文欧美字幕免费| 国产亚洲网站| 欧美日韩激情小视频| 久久av在线| 夜夜爽www精品| 国产一区二区久久精品| 欧美精品一区二区三区很污很色的| 亚洲免费人成在线视频观看| 亚洲福利精品| 国产精品永久免费视频| 欧美成人一区二区| 欧美一区久久| 日韩视频中午一区| 国产综合av| 欧美日韩在线一区二区三区| 久久久久久久一区二区三区| 一本一本久久a久久精品综合妖精| 国产一区二区三区在线观看精品| 欧美精品在线极品| 久久精品人人做人人爽电影蜜月 | 狂野欧美一区| 精品动漫一区二区| 欧美特黄一区| 免费永久网站黄欧美| 欧美在线视频免费| 中文精品视频| 亚洲国产欧美一区| 国产亚洲精品成人av久久ww| 欧美日韩视频在线一区二区观看视频| 久久精品人人做人人爽电影蜜月 | 欧美激情网友自拍| 久久精品国产999大香线蕉| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 一区二区三区在线观看国产| 国产精品成人一区二区三区吃奶| 免费观看亚洲视频大全| 欧美一区二区三区久久精品| 国产精品99久久久久久久久久久久| 在线观看亚洲精品| 国产午夜精品美女视频明星a级| 欧美日韩精品在线播放| 免费短视频成人日韩| 久久成人av少妇免费| 亚洲已满18点击进入久久| 日韩视频一区二区| 亚洲韩国一区二区三区| 黄色成人小视频| 国产日韩欧美日韩大片| 国产精品卡一卡二卡三| 欧美区在线播放| 欧美大片18| 免费观看久久久4p| 久久久免费精品| 久久精品国亚洲| 性色一区二区| 亚洲欧美高清| 亚洲免费在线视频| 亚洲香蕉在线观看| 夜夜狂射影院欧美极品| 99re热精品| 亚洲精品一区二区在线观看| 在线看日韩欧美| 黄网站色欧美视频| 国内精品视频在线观看| 国产视频一区二区在线观看 | 国产麻豆精品在线观看| 国产精品久久久久久久久久直播 | 在线日韩电影| 亚洲国产精品精华液2区45| 永久久久久久| 精品1区2区3区4区| 伊人影院久久| 在线国产精品播放| **性色生活片久久毛片| 在线日韩视频| 91久久精品日日躁夜夜躁国产|