"我講的話你們要能理解並執行!『如果業績大於目標且客戶滿意度超過80分就發獎金』,系統要能聽懂這種邏輯!"
週五下午的規則制定會議,老闆站在白板前,手裡拿著麥克筆,準備制定新的業務規則。
「各位!」老闆清了清嗓子,「我們要建立『智能業務規則系統』!」
HR 主管小陳好奇地問:「什麼意思?」
老闆開始在白板上寫字:「我要能用『自然語言』制定規則!比如說...」
他寫下:「如果 業績 > 目標 且 滿意度 >= 80 則 發放獎金」
「還有!」老闆繼續寫:「如果 遲到次數 > 3 或 請假天數 > 10 則 扣除績效獎金」
「再來!」他又寫:「如果 專案進度 < 50% 且 剩餘時間 < 30天 則 啟動緊急支援」
財務主管老趙困惑地看著白板:「這些規則要怎麼讓系統理解?」
「這就是重點!」老闆眼神發亮,「我要一個『規則翻譯器』!我用中文寫規則,系統自動理解並執行!」
系統分析師小莉疑惑地問:「但是每個規則的邏輯結構都不一樣...」
「沒關係!」老闆興奮地說,「翻譯器要很聰明!知道『如果...則...』是條件判斷,『且』是AND,『或』是OR,『>』是大於比較!」
他繼續解釋:「就像Google翻譯一樣!我輸入中文,它能理解語法結構,轉換成系統能執行的程式!」
產品經理阿凱試圖理解:「所以是要解析自然語言?」
「對!但不只解析!」老闆總結,「還要能執行!我說『如果業績大於100萬則發1萬獎金』,系統要能自動檢查所有員工,符合條件的就發獎金!」
前端工程師小美問:「那規則變更怎麼辦?」
「直接改規則描述就好!」老闆拍手,「不用改程式碼,不用重新部署,直接修改規則文字,系統立刻理解新規則!」
你突然明白了,老闆在描述 Interpreter Pattern - 為語言定義文法表示,並定義一個解釋器來處理這個文法!
Interpreter Pattern(解釋器模式)是行為型設計模式中的語言大師,它的核心思想是:給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
在我們的語言翻譯災難中,老闆的規則系統需求完美地展現了 Interpreter Pattern 的本質:
Interpreter Pattern 的核心組件:
適用情境:
讓我們實作一個「業務規則解釋器」,展示 Interpreter Pattern 的核心概念:
// 上下文:包含變量和數據
class Context {
private variables: Map<string, number> = new Map();
setVariable(name: string, value: number): void {
this.variables.set(name, value);
}
getVariable(name: string): number {
return this.variables.get(name) || 0;
}
}
// 抽象表達式
abstract class Expression {
abstract interpret(context: Context): boolean | number;
}
// 終端表達式:變量
class VariableExpression extends Expression {
constructor(private name: string) {
super();
}
interpret(context: Context): number {
return context.getVariable(this.name);
}
}
// 終端表達式:數字
class NumberExpression extends Expression {
constructor(private value: number) {
super();
}
interpret(context: Context): number {
return this.value;
}
}
// 非終端表達式:比較運算
class ComparisonExpression extends Expression {
constructor(
private left: Expression,
private operator: string,
private right: Expression
) {
super();
}
interpret(context: Context): boolean {
const leftValue = this.left.interpret(context) as number;
const rightValue = this.right.interpret(context) as number;
switch (this.operator) {
case '>': return leftValue > rightValue;
case '<': return leftValue < rightValue;
case '>=': return leftValue >= rightValue;
default: return false;
}
}
}
// 規則引擎
class RuleEngine {
// 簡化的規則解析
parseAndEvaluate(rule: string, context: Context): boolean {
// 解析 "如果 業績 > 100 則 發獎金"
const match = rule.match(/如果\s+(\w+)\s*([><=]+)\s*(\d+)\s+則\s+(.+)/);
if (match) {
const variable = new VariableExpression(match[1]);
const operator = match[2];
const value = new NumberExpression(parseInt(match[3]));
const action = match[4];
const condition = new ComparisonExpression(variable, operator, value);
const result = condition.interpret(context) as boolean;
if (result) {
console.log(`🎯 規則觸發: ${action}`);
return true;
} else {
console.log(`❌ 條件不滿足: ${rule}`);
return false;
}
}
console.log(`❌ 規則格式錯誤: ${rule}`);
return false;
}
}
// 使用範例
const context = new Context();
context.setVariable("業績", 150);
context.setVariable("滿意度", 85);
context.setVariable("遲到次數", 2);
const ruleEngine = new RuleEngine();
console.log("=== 老闆的智能規則系統 ===");
// 測試各種規則
ruleEngine.parseAndEvaluate("如果 業績 > 100 則 發放獎金", context);
ruleEngine.parseAndEvaluate("如果 滿意度 >= 80 則 給予表揚", context);
ruleEngine.parseAndEvaluate("如果 遲到次數 > 5 則 扣薪水", context);
Interpreter 設計原則:
與老闆溝通策略:
技術實作要點:
架構決策建議:
明天我們將探討 Null Object Pattern - 空氣員工,學習如何應對老闆的虛位以待哲學:「這個位置要有人,但可以什麼都不做!」
準備迎接無害存在的挑戰! 👻