自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

拒絕if-else!小而美的規(guī)則引擎 Easy Rules 真不錯(cuò)!

開(kāi)發(fā) 項(xiàng)目管理
Easy Rules 非常適合需要快速實(shí)現(xiàn)業(yè)務(wù)規(guī)則引擎的場(chǎng)景。對(duì)于中小型項(xiàng)目,Easy Rules 的簡(jiǎn)單性和靈活性是一大優(yōu)勢(shì)。如果項(xiàng)目規(guī)則復(fù)雜或者性能要求較高,可以考慮結(jié)合 Drools 等更強(qiáng)大的規(guī)則引擎使用。

Easy Rules是一個(gè)簡(jiǎn)單而強(qiáng)大的Java規(guī)則引擎,提供以下功能:

  • 輕量級(jí)框架和易于學(xué)習(xí)的API
  • 基于POJO的開(kāi)發(fā)與注解的編程模型
  • 定義抽象的業(yè)務(wù)規(guī)則并輕松應(yīng)用它們
  • 支持從簡(jiǎn)單規(guī)則創(chuàng)建組合規(guī)則的能力
  • 支持使用表達(dá)式語(yǔ)言(如MVEL和SpEL)定義規(guī)則的能力

為何選擇Easy Rules規(guī)則引擎

1. 傳統(tǒng)if - else編程的困境

案例一:電商滿減規(guī)則頻繁變更(真實(shí)生產(chǎn)場(chǎng)景重現(xiàn))

在電商業(yè)務(wù)的實(shí)際運(yùn)營(yíng)中,促銷規(guī)則的頻繁變更是一個(gè)常見(jiàn)的問(wèn)題。假設(shè)某電商平臺(tái)有如下促銷規(guī)則:

// 傳統(tǒng)硬編碼方式(噩夢(mèng)般的代碼片段)
if(user.isVip()){  
    if(order.getAmount() > 200){  
        if(order.getItems().stream().anyMatch(i -> i.isPromotion())){  
            order.applyDiscount(0.8); // 會(huì)員滿200且含促銷商品打8折  
        }  
    } else if(order.getCreateTime().isAfter(LocalDate.of(2023,11,1))){  
        order.applyDiscount(0.9); // 雙十一期間會(huì)員專屬9折  
    }  
} else {  
    // 普通用戶規(guī)則嵌套層級(jí)更深...  
}

這種傳統(tǒng)的硬編碼方式存在諸多痛點(diǎn):

  • 維護(hù)困難:每當(dāng)市場(chǎng)部調(diào)整規(guī)則時(shí),開(kāi)發(fā)者需要在大量的代碼中艱難地尋找邏輯修改點(diǎn),這不僅效率低下,還容易出錯(cuò)。
  • 發(fā)版風(fēng)險(xiǎn)高:發(fā)版頻率極高,可能一個(gè)月需要進(jìn)行6次規(guī)則修改和上線操作,每次上線都伴隨著一定的風(fēng)險(xiǎn),如代碼沖突、功能異常等。
  • 協(xié)作問(wèn)題:在多人協(xié)作開(kāi)發(fā)時(shí),由于代碼結(jié)構(gòu)復(fù)雜,很容易引發(fā)代碼沖突,增加了開(kāi)發(fā)和維護(hù)的難度。

案例二:物聯(lián)網(wǎng)設(shè)備告警條件嵌套難題

在物聯(lián)網(wǎng)設(shè)備監(jiān)控系統(tǒng)中,復(fù)雜的告警條件嵌套也是一個(gè)常見(jiàn)的問(wèn)題。某工廠設(shè)備監(jiān)控系統(tǒng)需要進(jìn)行如下判斷:

if(temperature > 50 || humidity > 80) {  
    if(pressure < 100 && vibration > 5) {  
        if(deviceStatus != Status.MAINTENANCE) {  
            triggerAlarm(AlarmLevel.CRITICAL);  
        }  
    }  
} else if (runtimeHours > 1000 && !isMaintained) {  
    triggerAlarm(AlarmLevel.WARNING);  
}  
// 后續(xù)還有8個(gè)else if...

這種代碼結(jié)構(gòu)帶來(lái)了以下問(wèn)題:

  • 調(diào)試?yán)щy:在調(diào)試過(guò)程中,斷點(diǎn)需要穿透10層條件判斷,調(diào)試難度極大,耗費(fèi)大量時(shí)間。
  • 擴(kuò)展性差:當(dāng)需要新增“電壓波動(dòng) > 10%”這樣的條件時(shí),需要重構(gòu)整個(gè)邏輯,開(kāi)發(fā)成本高。
  • 知識(shí)傳遞困難:交接文檔需要繪制3頁(yè)流程圖才能清晰說(shuō)明規(guī)則邏輯,給知識(shí)傳遞帶來(lái)了很大的困難。

可視化對(duì)比(代碼量的顯著優(yōu)化)

代碼量對(duì)比代碼量對(duì)比

2. 輕量級(jí)規(guī)則引擎的優(yōu)勢(shì)

場(chǎng)景化演示:從復(fù)雜到簡(jiǎn)潔的轉(zhuǎn)變

場(chǎng)景轉(zhuǎn)變場(chǎng)景轉(zhuǎn)變

核心優(yōu)勢(shì)解析

  • 解耦的智慧

規(guī)則與業(yè)務(wù)分離:規(guī)則與業(yè)務(wù)代碼實(shí)現(xiàn)物理隔離,可以將規(guī)則存儲(chǔ)在獨(dú)立文件或數(shù)據(jù)庫(kù)中,使代碼結(jié)構(gòu)更加清晰。這樣,業(yè)務(wù)代碼專注于業(yè)務(wù)邏輯的處理,而規(guī)則代碼則負(fù)責(zé)規(guī)則的定義和管理。

動(dòng)態(tài)加載規(guī)則:修改規(guī)則無(wú)需重新編譯部署,支持動(dòng)態(tài)加載規(guī)則。以下是一個(gè)動(dòng)態(tài)加載規(guī)則的示例:

public void refreshRules() {
    List<Rule> newRules = ruleLoader.loadFromDB(); // 從數(shù)據(jù)庫(kù)讀取最新規(guī)則
    rulesEngine.fire(new Rules(newRules), facts);  
}
  • 可讀性的提升

自描述性規(guī)則:規(guī)則具有自描述性,每個(gè)規(guī)則都可以看作是一個(gè)獨(dú)立的文檔,便于理解和維護(hù)。開(kāi)發(fā)者可以通過(guò)規(guī)則的名稱、描述和條件等信息,快速了解規(guī)則的用途和邏輯。

決策流程可視化:支持決策流程可視化,可以自動(dòng)生成規(guī)則關(guān)系圖。例如:

[用戶類型] --> [VIP規(guī)則] --> [折扣計(jì)算]  
             \-> [普通用戶規(guī)則] --> [滿減計(jì)算]
  • 擴(kuò)展性的保障

零侵入式擴(kuò)展:新增規(guī)則對(duì)現(xiàn)有代碼零侵入,只需添加新的Rule類即可。這使得系統(tǒng)的擴(kuò)展性得到了極大的提升,開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)需求隨時(shí)添加新的規(guī)則。

多規(guī)則源支持:支持混合多種規(guī)則源,例如數(shù)據(jù)庫(kù)、YAML文件和注解。以下是一個(gè)YAML規(guī)則文件的示例:

# discount_rule.yml
name: "老用戶回饋規(guī)則"
description: "注冊(cè)超過(guò)3年的用戶額外折扣"
condition: "user.registerYears >= 3"
actions:
  - "order.applyAdditionalDiscount(0.95)"

定義規(guī)則

大多數(shù)業(yè)務(wù)規(guī)則可以由以下定義表示:

  • 名稱:規(guī)則命名空間中的唯一規(guī)則名稱
  • 說(shuō)明:規(guī)則的簡(jiǎn)要說(shuō)明
  • 優(yōu)先級(jí):相對(duì)于其他規(guī)則的規(guī)則優(yōu)先級(jí)
  • 事實(shí):去匹配規(guī)則時(shí)的一組已知事實(shí)
  • 條件:為了匹配該規(guī)則,在給定某些事實(shí)的情況下應(yīng)滿足的一組條件
  • 動(dòng)作:當(dāng)條件滿足時(shí)要執(zhí)行的一組動(dòng)作(可以添加/刪除/修改事實(shí))

Easy Rules為定義業(yè)務(wù)規(guī)則的每個(gè)關(guān)鍵點(diǎn)提供了抽象。

在Easy Rules中,一個(gè)規(guī)則由Rule接口表示:

public interface Rule {

    /**
    * 改方法封裝規(guī)則的條件(conditions)
    * @return 如果提供的事實(shí)適用于該規(guī)則返回true, 否則,返回false
    */
    boolean evaluate(Facts facts);

    /**
    * 改方法封裝規(guī)則的操作(actions)
    * @throws 如果在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤將拋出Exception
    */
    void execute(Facts facts) throws Exception;

    //Getters and setters for rule name, description and priority omitted.

}

evaluate方法封裝了必須求值為T(mén)RUE才能觸發(fā)規(guī)則的條件。

execute方法封裝了在滿足規(guī)則條件時(shí)應(yīng)執(zhí)行的操作。條件和動(dòng)作ConditionandAction接口表示。

規(guī)則可以用兩種不同的方式定義:

  • 通過(guò)在POJO上添加注釋,以聲明方式定義
  • 通過(guò)RuleBuilder API,以編程方式定義

用注解定義規(guī)則

這些是定義規(guī)則的最常用方法,但如果需要,還可以實(shí)現(xiàn)Rulei接口或繼承BasicRule類。

@Rule(name = "my rule", description = "my rule description", priority = 1)
publicclass MyRule {

    @Condition
    public boolean when(@Fact("fact") fact) {
        //my rule conditions
        returntrue;
    }

    @Action(order = 1)
    public void then(Facts facts) throws Exception {
        //my actions
    }

    @Action(order = 2)
    public void finally() throws Exception {
        //my final actions
    }

}

@Condition注解標(biāo)記計(jì)算規(guī)則條件的方法。此方法必須是公共的,可以有一個(gè)或多個(gè)用@Fact注解的參數(shù),并返回布爾類型。只有一個(gè)方法能用@Condition注解。

@Action注解標(biāo)記要執(zhí)行規(guī)則操作的方法。規(guī)則可以有多個(gè)操作??梢允褂胦rder屬性按指定的順序執(zhí)行操作。默認(rèn)情況下,操作的順序?yàn)?。

2. 用RuleBuilder API定義規(guī)則

Rule rule = new RuleBuilder()
                .name("myRule")
                .description("myRuleDescription")
                .priority(3)
                .when(condition)
                .then(action1)
                .then(action2)
                .build();

在這個(gè)例子中, Condition實(shí)例condition,Action實(shí)例是action1和action2。

定義事實(shí)

Facts API是一組事實(shí)的抽象,在這些事實(shí)上檢查規(guī)則。在內(nèi)部,F(xiàn)acts實(shí)例持有HashMap<String,Object>,這意味著:

  • 事實(shí)需要命名,應(yīng)該有一個(gè)唯一的名稱,且不能為空
  • 任何Java對(duì)象都可以充當(dāng)事實(shí)

這里有一個(gè)實(shí)例定義事實(shí):

Facts facts = new Facts();
facts.add("rain", true);

Facts 能夠被注入規(guī)則條件,action 方法使用 @Fact 注解. 在下面的規(guī)則中,rain 事實(shí)被注入itRains方法的rain參數(shù):

@Rule
class WeatherRule {

    @Condition
    public boolean itRains(@Fact("rain") boolean rain) {
        return rain;
    }

    @Action
    public void takeAnUmbrella(Facts facts) {
        System.out.println("It rains, take an umbrella!");
        // can add/remove/modify facts
    }

}

Facts類型參數(shù) 被注入已知的 facts中 (像action方法takeAnUmbrella一樣).

如果缺少注入的fact, 這個(gè)引擎會(huì)拋出 RuntimeException異常.

定義規(guī)則引擎

從版本3.1開(kāi)始,Easy Rules提供了RulesEngine接口的兩種實(shí)現(xiàn):

  • DefaultRulesEngine:根據(jù)規(guī)則的自然順序(默認(rèn)為優(yōu)先級(jí))應(yīng)用規(guī)則。
  • InferenceRulesEngine:持續(xù)對(duì)已知事實(shí)應(yīng)用規(guī)則,直到不再應(yīng)用規(guī)則為止。

創(chuàng)建一個(gè)規(guī)則引擎

要?jiǎng)?chuàng)建規(guī)則引擎,可以使用每個(gè)實(shí)現(xiàn)的構(gòu)造函數(shù):

RulesEngine rulesEngine = new DefaultRulesEngine();
// or
RulesEngine rulesEngine = new InferenceRulesEngine();

然后,您可以按以下方式觸發(fā)注冊(cè)規(guī)則:

rulesEngine.fire(rules, facts);

規(guī)則引擎參數(shù)

Easy Rules 引擎可以配置以下參數(shù):

圖片圖片

  • skipOnFirstAppliedRule:告訴引擎規(guī)則被觸發(fā)時(shí)跳過(guò)后面的規(guī)則。
  • skipOnFirstFailedRule:告訴引擎在規(guī)則失敗時(shí)跳過(guò)后面的規(guī)則。
  • skipOnFirstNonTriggeredRule:告訴引擎一個(gè)規(guī)則不會(huì)被觸發(fā)跳過(guò)后面的規(guī)則。
  • rulePriorityThreshold:告訴引擎如果優(yōu)先級(jí)超過(guò)定義的閾值,則跳過(guò)下一個(gè)規(guī)則。版本3.3已經(jīng)不支持更改,默認(rèn)MaxInt。

可以使用RulesEngineParameters API指定這些參數(shù):

RulesEngineParameters parameters = new RulesEngineParameters()
    .rulePriorityThreshold(10)
    .skipOnFirstAppliedRule(true)
    .skipOnFirstFailedRule(true)
    .skipOnFirstNonTriggeredRule(true);

RulesEngine rulesEngine = new DefaultRulesEngine(parameters);

如果要從引擎獲取參數(shù),可以使用以下代碼段:

RulesEngineParameters parameters = myEngine.getParameters();

這允許您在創(chuàng)建引擎后重置引擎參數(shù)。

5分鐘極速入門(mén)(Hello World版)

1. 環(huán)境搭建(手把手教學(xué))

為什么選擇Maven依賴?Easy Rules的核心庫(kù)僅有 217KB,不會(huì)造成項(xiàng)目臃腫。只需在pom.xml中添加:

<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>4.1.0</version>
</dependency>

驗(yàn)證是否成功: 在IDE中新建RulesEngine engine = new DefaultRulesEngine();若無(wú)報(bào)錯(cuò),則環(huán)境配置成功!

2. 第一個(gè)規(guī)則實(shí)戰(zhàn)(帶逐行解析)

場(chǎng)景背景: 假設(shè)我們正在開(kāi)發(fā)智能家居系統(tǒng),需要根據(jù)濕度傳感器數(shù)據(jù)觸發(fā)雨天提醒。

代碼深度解讀

圖片圖片

執(zhí)行過(guò)程全解

public static void main(String[] args) {
    // 模擬傳感器數(shù)據(jù)(真實(shí)項(xiàng)目從MQTT獲?。?    Facts facts = new Facts();  // 事實(shí)對(duì)象(數(shù)據(jù)容器)
    facts.put("humidity", 85);  // 放入濕度值
    
    // 創(chuàng)建規(guī)則引擎(核心控制器)
    RulesEngine engine = new DefaultRulesEngine();
    
    // 裝載規(guī)則并執(zhí)行(點(diǎn)火?。?    engine.fire(new Rules(new RainRule()), facts); 
    
    // 執(zhí)行結(jié)果:
    // 【智能家居】檢測(cè)到濕度85%,建議關(guān)閉窗戶帶傘出門(mén)!
}

3. 可視化規(guī)則執(zhí)行流程(小白秒懂版)

完整執(zhí)行鏈路圖示

圖片圖片

關(guān)鍵點(diǎn)提醒

  • 一個(gè)Facts對(duì)象可承載多個(gè)數(shù)據(jù):
facts.put("temperature", 28);  
facts.put("location", "上海");
  • 多個(gè)規(guī)則會(huì)按優(yōu)先級(jí)順序執(zhí)行(默認(rèn)優(yōu)先級(jí)=0)
  • 使用
@Priority

注解調(diào)整執(zhí)行順序:

@Rule(priority = 1) // 數(shù)字越大優(yōu)先級(jí)越高

新手常見(jiàn)問(wèn)題QA規(guī)則沒(méi)觸發(fā)怎么辦?

  • 檢查@Fact名稱是否與put時(shí)一致
  • 確認(rèn)@Condition方法返回true
  • 添加日志打印調(diào)試:
@Action
public void remind() {
    System.out.println("規(guī)則觸發(fā)!"); // 先確認(rèn)是否執(zhí)行到此
}

如何同時(shí)處理多個(gè)規(guī)則?

// 一次性加載多個(gè)規(guī)則
Rules rules = new Rules(new RainRule(), new TempRule(), new WindRule());
engine.fire(rules, facts);

需要我展示如何擴(kuò)展這個(gè)案例,比如增加溫度規(guī)則形成組合條件嗎?比如"濕度>80%  溫度>30℃"觸發(fā)高溫高濕預(yù)警?

6大經(jīng)典場(chǎng)景深度解析

場(chǎng)景1:電商促銷系統(tǒng)(組合優(yōu)惠精算)

案例3進(jìn)階實(shí)現(xiàn):VIP折扣與滿減疊加計(jì)算

圖片

避坑指南

  • 使用@Priority控制執(zhí)行順序(數(shù)值越大越先執(zhí)行)
  • 折扣計(jì)算需采用乘法疊加而非減法,避免出現(xiàn)0元訂單
  • 在動(dòng)作中增加日志記錄,審計(jì)實(shí)際優(yōu)惠金額

場(chǎng)景2:物聯(lián)網(wǎng)報(bào)警系統(tǒng)(多級(jí)聯(lián)動(dòng))

案例4優(yōu)化版:帶設(shè)備狀態(tài)判斷的三級(jí)報(bào)警

圖片圖片

實(shí)戰(zhàn)技巧

  1. 設(shè)備維護(hù)狀態(tài)作為獨(dú)立Fact傳遞
  2. 優(yōu)先處理高風(fēng)險(xiǎn)規(guī)則(priority=3)
  3. 動(dòng)作中集成多種通知渠道(短信/郵件/看板)

場(chǎng)景3:會(huì)員等級(jí)系統(tǒng)(混合規(guī)則源)

案例5增強(qiáng)方案:YAML+注解混合使用

圖片圖片

集成方法

// 加載YAML規(guī)則
RulesLoader loader = new YamlRuleLoader();
Rules yamlRules = loader.load(new File("promotion_rules.yml"));

// 加載注解規(guī)則
Rules annoRules = new Rules(new ShareRule());

// 合并執(zhí)行
engine.fire(yamlRules, facts);
engine.fire(annoRules, facts);

場(chǎng)景4:工單分配系統(tǒng)(動(dòng)態(tài)派單)

案例6增強(qiáng)版:基于值班表的動(dòng)態(tài)分配

@Rule(name = "技術(shù)緊急工單")
publicclass TechEmergencyRule {
    @Condition
    public boolean isTechEmergency(
            @Fact("ticket") Ticket ticket,
            @Fact("dutyTable") DutyTable table) {
        return ticket.getType() == TECH 
            && ticket.getPriority() == HIGH
            && table.hasAvailableTechLead();
    }
    
    @Action
    public void assignToTechLead() {
        String techLead = dutyTable.getCurrentTechLead();
        ticket.setAssignee(techLead);
        dutyTable.markBusy(techLead); // 標(biāo)記為忙碌狀態(tài)
    }
}

設(shè)計(jì)亮點(diǎn)

  • 值班表作為獨(dú)立Fact,實(shí)時(shí)反映工程師狀態(tài)
  • 自動(dòng)標(biāo)記工程師忙碌狀態(tài),避免重復(fù)分配
  • 可擴(kuò)展支持輪詢、負(fù)載均衡等分配策略

場(chǎng)景5:風(fēng)控預(yù)警系統(tǒng)(時(shí)序檢測(cè))

案例7優(yōu)化版:時(shí)間窗口滑動(dòng)檢測(cè)

圖片圖片

性能優(yōu)化

  • 使用@Fact注入預(yù)處理的時(shí)序數(shù)據(jù)
  • 采用BloomFilter快速過(guò)濾低風(fēng)險(xiǎn)設(shè)備
  • 異步執(zhí)行風(fēng)險(xiǎn)處理動(dòng)作

場(chǎng)景6:游戲戰(zhàn)斗系統(tǒng)(狀態(tài)管理)

案例8增強(qiáng)版:連招技能狀態(tài)機(jī)

@Rule(name = "龍卷風(fēng)連擊")
publicclass TornadoComboRule {
    @Condition
    public boolean checkComboSequence(
            @Fact("queue") CircularFifoQueue<Skill> queue) {
        return queue.size() >=3
            && queue.get(0) == Skill.A
            && queue.get(1) == Skill.B
            && queue.get(2) == Skill.C;
    }
    
    @Action
    public void releaseSuperSkill() {
        player.cast(Skill.SUPER_TORNADO);
        queue.clear(); // 清空連招隊(duì)列
        effectPlayer.play("combo_success.wav");
    }
}

注意事項(xiàng)

  • 使用Apache Commons的CircularFifoQueue控制隊(duì)列長(zhǎng)度
  • 動(dòng)作中重置狀態(tài)避免重復(fù)觸發(fā)
  • 集成音效/特效等游戲元素

架構(gòu)師擴(kuò)展包

  • 規(guī)則模板技術(shù)
public abstract class BasePromotionRule implements Rule {
    @Condition
    public abstract boolean matchCondition(Order order);
    
    @Action
    public void applyDiscountTemplate(@Fact("order") Order order) {
        order.applyDiscount(getDiscountRate());
        log.info("應(yīng)用{}折扣", getRuleName());
    }
    
    protected abstract double getDiscountRate();
}
  • 規(guī)則性能監(jiān)控
engine.registerRuleListener(new RuleListener() {
    public void beforeExecute(Rule rule, Facts facts) {
        Monitor.startTimer(rule.getName());
    }
    
    public void afterExecute(Rule rule, Facts facts) {
        long cost = Monitor.stopTimer(rule.getName());
        if(cost > 100) {
            alertSlowRule(rule.getName(), cost);
        }
    }
});

Spring Boot集成

配置自動(dòng)加載:

@Configuration  
publicclass RuleEngineConfig {  

    @Bean
    public RulesEngine rulesEngine() {  
        returnnew DefaultRulesEngine(  
            new Parameters()  
                .skipOnFirstNonTriggeredRule(true)  
                .priorityThreshold(10)  
        );  
    }  

    @Bean
    public Rules ruleRegistry() throws IOException {  
        // 自動(dòng)掃描帶@Rule注解的Bean  
        returnnew Rules(  
            new AnnotationRuleFactory().create(  
                new ClasspathRuleDefinitionReader(),  
                new ClassPathResource("rules/").getFile()  
            )  
        );  
    }  

    @Bean
    public ApplicationRunner ruleInitializer(RulesEngine engine, Rules rules) {  
        return args -> {  
            // 啟動(dòng)時(shí)預(yù)加載驗(yàn)證規(guī)則  
            engine.fire(rules, new Facts());  
            logger.info("已成功加載{}條規(guī)則", rules.size());  
        };  
    }  
}

在controller中測(cè)試:

@RestController  
publicclass PromotionController {  
    @Autowired
    private RulesEngine rulesEngine;  
    @Autowired
    private Rules rules;  

    @PostMapping("/apply-rules")  
    public Order applyRules(@RequestBody Order order) {  
        Facts facts = new Facts();  
        facts.put("order", order);  
        rulesEngine.fire(rules, facts);  
        return order;  
    }  
}

在生產(chǎn)中我們還可以將規(guī)則配置設(shè)置為熱更新,以@RefreshScope + Spring Cloud Config的方式,這樣在配置更新時(shí)會(huì)自動(dòng)加載。

總結(jié)

Easy Rules 非常適合需要快速實(shí)現(xiàn)業(yè)務(wù)規(guī)則引擎的場(chǎng)景。對(duì)于中小型項(xiàng)目,Easy Rules 的簡(jiǎn)單性和靈活性是一大優(yōu)勢(shì)。

如果項(xiàng)目規(guī)則復(fù)雜或者性能要求較高,可以考慮結(jié)合 Drools 等更強(qiáng)大的規(guī)則引擎使用。

責(zé)任編輯:武曉燕 來(lái)源: 碼猿技術(shù)專欄
相關(guān)推薦

2024-11-13 16:32:21

aviatorJava表達(dá)式引擎

2023-11-01 11:04:12

Javaaviator

2023-10-11 08:32:13

2021-03-24 14:46:52

Python工具代碼

2012-05-09 11:45:43

蘋(píng)果

2023-06-02 07:30:24

If-else結(jié)構(gòu)流程控制

2020-09-22 18:35:31

AI

2013-03-06 10:28:57

ifJava

2022-11-04 11:18:16

代碼優(yōu)化可讀性

2020-10-22 09:20:22

SQLNoSQL 數(shù)據(jù)庫(kù)

2021-04-13 06:39:13

代碼重構(gòu)code

2022-07-11 08:16:55

策略模式if-else

2021-03-10 07:20:43

if-else靜態(tài)代碼

2020-12-15 09:31:58

CTOif-else代碼

2020-05-13 14:15:25

if-else代碼前端

2021-04-14 10:47:12

區(qū)塊鏈比特幣以太坊

2021-11-04 08:53:00

if-else代碼Java

2025-04-24 08:40:00

JavaScript代碼return語(yǔ)句

2016-01-13 15:11:32

leangoo工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)