一直想分享一段10年Java web開發過程中,最滿意一個軟件項目的設計與實現,但總是由於自己的懶惰,不愛整理而停止不前,今天終於心血來潮,決定總結分享這段經歷。
面對互聯網科技時代,作爲一名高級軟件工程,要想在程序員的道路上一直走下去,那麼我們避免不了要開闊自己的腦洞,擁有新的設計理念,一個完美設計理念至少支撐一個產品線,一個壞的理念視乎只能支持一個功能點,未來互聯時代要想在軟件行業走的一直前行,那麼必須走產品路線,最好的產品是支持這一條產品線上的任何個性化需求的。
我之前的項目,就是從產品的理念出發,要求實現一個支持所有個性需求的項目。我們之前做的產品是對賬。所謂對賬就是兩個文件之間中的各條記錄,按照記錄中唯一標識,對比金額,同時得到四種對賬結果記錄(金額一致,金額不一致,文件1多,文件2多)這四種結果。不同的對賬結果有不同自動處理。同時我們的產品理念是可以支持多個系統間的對賬,也就是說要支持不同格式的文件,不同的對賬策略,不需要修改代碼完成一個這樣的產品的設計與實現。經過調研很久,最終我們決定使用Java代碼引用js代碼。也就是說通過頁面配置js策略,然後利用對比文件的實現類解析js,實現超動態的產品效果。
代碼實現如下:解析js
public Reconciliation createReconciliation(AccCheckCfg accCheckCfg){
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
engine.eval(accCheckCfg.getJsScript());
Reconciliation dydzwj = new Reconciliation();//定義對應實體
if (engine instanceof Invocable) {
Invocable invEngine = (Invocable) engine;
invEngine.invokeFunction("putParameters", null, dydzwj,-1);//將腳本中定義的內容複製到dydzwj對象中。
return dydzwj;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
js實例:
function putParameters(pojoInfo,recLog){
pojoInfo.setAutoProcess("01");
pojoInfo.setAutoEsbPath("");
pojoInfo.setTempletPath("");
pojoInfo.setXpath1("/message/body/bankCode");
pojoInfo.setValue1(recLog.getAccSysCode());
pojoInfo.setXpath2("/message/body/transDate");
pojoInfo.setValue2(recLog.getAccCheckTime());
pojoInfo.setXpath3("/message/body/transCode");
pojoInfo.setValue3(recLog.getDataRec1Key());
pojoInfo.setRetXpath1("/message/body/transCode");
pojoInfo.setRetXpath2("/message/body/temp1");
pojoInfo.setRetXpath3("/message/body/temp2");
}