Re: [問題] 如何彈性不修改程式碼, 卻能比對模式
※ 引述《smithkimo (Smith K)》之銘言:
: Dear all,
: 小弟有一個很特別的問題, 就是手邊有一些會隨時會增加的規則,
: 例如,
: String test = "abc";
: Rule 1: if(regex1.match()) then ...
: Rule 2: if(regex2.match()) then ...
: 這些規則會隨時增加, 但是比對的邏輯是透過if...else if...else if...
: 如果一增加rules, 就必須要修改判斷的主程式, 新增新的else if的判斷,
: 不知道有辦法, 不更動判斷的程式, 但卻可以任意增加rules呢
: 想設計一個較彈性的判斷程式, 謝謝大家
其實這比較像是設計概念的問題
一些實行的細節我會略過
程式碼也沒跑過,就是示意一下怎麼設計這樣
在你的例子中
你的要求是彈性的進行比對
以及對比對成功的動作進行不同的動作
所以,在這裡我們要作的
是將「比對條件」以及「執行動作」這兩個部份
從主結構中抽離出來
也就說,不要用if....else的寫法
在這裡,來複習一下物件導向的概念
一個物件可以是一個「東西」當然也可以是「條件」或是「執行動作」
所以,你可以定一個界面以及物件像這樣:
interface IRegexAction
{
//檢查字串有沒有合乎條件
//data為判斷的字串
boolean check(String data);
//處理的動作
//data為判斷的字串
//return 為處理後的字串
String invoke(String data);
}
然後,你可以宣告一個List去放這個條件跟執行動作的配對
List<IRegexAction> regexActions=new ArrayList<>();
然後把你的條件放進去
regexActions.add(new CheckEmpty()); //假設這個把空白去除
regexActions.add(new Replace("o","O")); //假設這是把o變成O
之後,逐一檢查你的條件
String data="Hello World!"; //這是要需要判斷的資料
for(IRegexAction regexAction : regexActions)
{
if(regexAction.check(data))
{
data=regexAction.invoke(data);
//假設你原本用的是用的是if.....else if.... else if....
//就在這裡加個break
//如果是 if....; if....; 就不用加break
break;
}
}
到目前為止是第一階段
請先看懂這部份
這是教你怎麼把一般的if...else之類的簡單程式流程,換成List去跑
這是比較簡單的部份
============================================
第一階段的那個方法
雖然可以作到把「條件」、「執行動作」從主邏輯中抽出
但是你看看下面這一段
regexActions.add(new CheckEmpty()); //假設這個把空白去除
regexActions.add(new Replace("o","O")); //假設這是把o變成O
雖然要加新的判斷條件時,只需宣告一個物件,實作IRegexAction
但還是需要到主程式中加入那一行 regexActions.add(...); 的程式片段
這裡要講的,是把你的「條件」以及「動作」放到檔案中
因為你講的
Rule 1: if(條件) then 動作
條件這部份,處理起來還頗簡單的,因為regex就是表示式而已
可以把表示式放到檔案中沒問題
但是動作這部份比較麻煩
java中沒有像php或是ruby, JavaScript之類的evel可以跑程式碼
所以,處理起來會比較麻煩就是了
在這裡,至少有三種方法可以解決掉這個問題
1.是自定義檔案中的動作名稱,例如在檔案中的動作是這樣
"shoutdown(\snow)+" shoutdown
前面這一段是表示式,把這段字串塞進Pattern裡面就是了
第二段,基本上就是判斷一下讀到的字串是什麼動作,就去執行什麼動作這樣
基本上還是用第一階段的方法去做
如果是小東西的話,用這個方法就足夠了
2.用Reflection
JAVA有個功能,可以動態載入class
你可以看看Reflection那部份
然後用個檔案紀錄class的名稱,他長的應該像是
com.ptt.myclass.Action
com.ptt.myclass.Action2
之類的
讀到這個名稱之後,靠Reflection就可以去建立實體
我比較喜歡用這個方法,因為用起會比較方便
3.自己寫個解釋器去處理
簡單來講.... 就是自訂一套腳本的處理方式
一般是只有framework等級的程式才會這樣幹
只不過寫起來也不難
去google一下lua java或是javascript java engine
應該就能找到很多資料
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.38.71.182
推
12/02 08:11, , 1F
12/02 08:11, 1F
推
12/02 09:49, , 2F
12/02 09:49, 2F
→
12/02 10:12, , 3F
12/02 10:12, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章