公司的crm系統(tǒng)有新增了一個(gè)需求友题,需要在所有模塊都顯示操作日志虚倒,復(fù)雜點(diǎn)在于不是記錄一個(gè)字符串嫡锌,而是操作日志顯示要求不統(tǒng)一。
image.png
比如:
- 小張新建了銷售機(jī)會(huì)檬寂,操作的人名的是動(dòng)態(tài)的,銷售機(jī)會(huì)是固定內(nèi)容终抽。
- 小王增加了標(biāo)簽:
重要客戶,
客戶標(biāo)簽,
時(shí)間:2025-12-12 21:00昼伴,這個(gè)需要支持多行文字 - 小王刪除了訂單2100224488匾旭,訂單號(hào)是個(gè)鏈接可以點(diǎn)到訂單頁。
如果不去設(shè)計(jì)直接寫代碼的化亩码,所有記錄的地方都會(huì)是硬編碼的方式各種拼接字符串季率,而且必然有大量重復(fù)代碼。
分析一下不同日志的異同異同點(diǎn):
- 相同點(diǎn)是需要拼接字符串:操作用戶名+操作內(nèi)容
- 不同點(diǎn)是不同記錄需求有需要外部傳入的變量個(gè)數(shù)不同描沟,內(nèi)容也不同
所以主體思路是把日志的結(jié)構(gòu)定義成模板飒泻,然后調(diào)用時(shí)候用傳入變量來替換占位符,這樣來簡化調(diào)用處的代碼量來實(shí)現(xiàn)復(fù)用
$符號(hào)表示變量吏廉,后面的數(shù)子標(biāo)識(shí)是第幾個(gè)變量
- $1增加了訂單<a href='/show/order/$1'>$1<a/>
- $1增加了標(biāo)簽$2:<BR/>$3<BR/>$4
//獲取記用戶名和訂單號(hào)
genText('創(chuàng)建訂單','小王',123456)
genText('新建銷售機(jī)會(huì)','小王')
//genText內(nèi)部邏輯可以是這樣:
public void genText(String moduleName,String... args) {
//獲取該模塊的模板字符串
String templateStr = ''//省略...
for(int x = 1; x < args.lengh; x = x+1) {
templateStr = templateStr.replace("$"+i,arg[i-1]);
}
}
動(dòng)態(tài)的內(nèi)容如何處理
其實(shí)還有種情況沒考慮到泞遗, 比如
小王批量刪除了用戶,用戶1席覆,用戶2史辙,用戶3,用戶4佩伤。聊倔。。
這種用字符串模板要實(shí)現(xiàn)就太復(fù)雜生巡,硬要設(shè)計(jì)出來耙蔑,模板規(guī)則就太復(fù)雜,所以這里不是一個(gè)技術(shù)問題孤荣,而是一個(gè)方案復(fù)雜度的取舍問題甸陌。
這里我建議特殊處理,對(duì)這個(gè)日志直接用寫代碼實(shí)現(xiàn)盐股。
所以這里我們用設(shè)計(jì)去降低復(fù)雜度不光要關(guān)注通用性钱豁,也需要有邊界意識(shí)的靈活組合,模板可以解決90%的問題疯汁,10%的問題用其他方式牲尺,而不是說為了這個(gè)功能去設(shè)計(jì)一個(gè)100%通用的模板,那樣反而會(huì)耗費(fèi)更多的時(shí)間幌蚊。