寫代碼好多年了,發現你們的思路都是寫代碼、寫代碼、寫代碼,還弄了個稱號——碼農。javascript
我是挺無語的,個人思路是——不寫代碼、不寫代碼、不寫代碼!java
無聊的代碼爲啥要重複寫呢?甚至一寫寫好幾年。node
舉個例子吧,要否則你們確定很懵。mysql
當咱們剛開始學習數據庫編程的時候,咱們會先寫一段代碼,實現往一個表裏添加數據的功能。這段代碼是必須寫的,不寫怎麼會?sql
而後熟悉這段代碼,儘可能知道其含義,越深刻越好。數據庫
而後呢,進入項目組,發現項目裏面有n張數據表,每一個表都至少要有一個添加數據的功能。編程
那麼怎麼辦?固然要寫代碼了。因而添加數據的代碼被一遍又一遍的寫,區別在於表名和字段名的不一樣,由於每一個表都有本身的名稱和本身的字段。json
僅僅是由於表名和字段名的不一樣,就要一遍一遍的寫相似的代碼嗎?這就是我說的無聊的代碼。c#
雖然各位前輩想了不少不少的方法,好比代碼生成器,這樣相似的代碼就不用寫了,直接生成就好。可是當字段名變了怎麼辦?增長了一個字段怎麼辦?數組
好比orm,好比各類框架,可是老是要寫代碼。沒發現誰把不寫代碼做爲目標。
我在這些年裏也在不斷嘗試,雖然有了一些效果,可是缺點仍是不少,離不寫代碼還很遠,只是作到了不寫重複代碼的目的。
我一直用c#來實現個人想法,可是c#太嚴謹了,好多思路實現起來太複雜。好比:
一、 必須先定義實體類,而後才能各類傳遞
二、 「插件」實現起來很是不方便。
三、 必須先編譯,而後才能加載。
四、 對json不太友好,須要反覆轉換。
五、 反射、泛型這類的不太理想。
看了一下其餘語言,發現Node很是適合個人想法,也能避免上面的那些「缺點」,只是因爲種種緣由,如今纔開始正式學習。
Node使用的是JavaScript,天生對json很是友好,能夠直接操做,不用各類轉換。
能夠用require加載JavaScript代碼而且當即編譯,能夠利用這個特性方便的寫插件。
require也能夠加載json文件,這樣依賴注入就很容易實現了。
性能方面也不用擔憂,畢竟阿里爸爸都在用。
好吧,介紹一下思路,上流程圖
這是初步想法,具體細節還在不斷完善。
下面是初版代碼,很初級,只是實現基本功能,由於這是我第一次寫node,邊熟悉node的寫法和基本功能,邊實現個人想法。
話說,語言裏面沒有node呢,只好選擇JavaScript了。
/** * Created by jyk00 on 2019/3/31. * 添加數據的服務 */ exports.start = function(code) { console.log('開始添加數據'); /** 根據配置信息實現添加數據的功能 * 獲取服務信息 * 接收數據 * 驗證數據 * 調用插件 * 持久化 * 獲取持久化後數據 * 寫數據變化日誌 * 返回結果 */ //獲取服務信息 console.log('服務ID:' + code); var meta = require('./serviceAdd_'+ code +'.json'); console.log('獲取服務信息:' + meta); //獲取實體類,先模擬一下 var data = require('./node_user.json'); //驗證數據,暫時略 //調用持久化前的插件 //持久化 saveData(function(err, result) { console.log('#######################'); console.log('saveData的回調'); console.log('result:', result); }); //調用持久化以後的插件 //記錄數據變化日誌 //持久化數據 function saveData(callback) { console.log('開始持久化'); //建立mysql對象 var mysql = require('mysql'); var cnString = require('../sqlConnection.json'); var connection = mysql.createConnection(cnString); var sql = meta.sqlCache; //拼接數據 var valuesParams = createParams(); connection.connect(); connection.query(sql,valuesParams,function (err, result) { if(err){ console.log('[INSERT ERROR ] - ',err.message); callback(err, result); return; } console.log('-------INSERT by service ----------'); console.log('INSERT ID:',result.insertId); console.log('#######################'); callback(err, result); }); connection.end(); console.log('調用結束等待結果'); } //拼接valuesParams function createParams(){ console.log('開始拼接數據數組'); var params = []; //數據變成數組的形式 var colName = ""; for (var i=0 ;i<meta.column.length;i++) { colName = meta.column[i]; params.push(data[colName]); } return params; } };
下面是第二版代碼,功能多了一些,代碼也更難看了,都是異步害的。這麼醜陋的代碼,確定要進行改善的。
/** * Created by jyk00 on 2019/3/31. * 添加數據的服務 */ exports.start = function(code) { console.log('開始添加數據'); /** 根據配置信息實現添加數據的功能 * 獲取服務信息 * 接收數據 * 驗證數據 * 調用插件 * 持久化 * 獲取持久化後數據 * 寫數據變化日誌 * 返回結果 */ //獲取服務信息 console.log('服務ID:' + code); var meta = require('./serviceAdd_'+ code +'.json'); console.log('獲取服務信息:' + meta); //獲取實體類,先模擬一下 var data = require('./node_user.json'); //驗證數據,暫時略 //調用持久化前的插件 var plugName = meta.pluginBefore; if (plugName.length === 0){ //沒有插件,不調用 console.log('沒有插件,不調用'); //持久化及後續 saveAndLast(data); } else { //有插件 console.log('有插件,調用'); var plug = require('../plugin/' + plugName); plug.begin(data,function(data){ //持久化及後續 saveAndLast(data); }); } //持久化以及以後的事情 function saveAndLast(data) { //持久化 saveData(data,function(err, result){ console.log('#######################'); console.log('saveData的回調:' + data.age); console.log('result:',result); //調用持久化以後的插件 plugName = meta.pluginAfter; if (plugName.length === 0){ //沒有插件,不調用 //記錄數據變化日誌 } else{ //有插件 plug = require('../plugin/' + plugName); plug.begin(err, result,data,function() { //記錄數據變化日誌 }); } }); } //持久化數據 function saveData(data,callback) { console.log('開始持久化'); console.log('saveData的age:' + data.age); //建立mysql對象 var mysql = require('mysql'); var cnString = require('../sqlConnection.json'); var connection = mysql.createConnection(cnString); var sql = meta.sqlCache; console.log('sql:' + sql); //拼接數據 var valuesParams = createParams(data); connection.connect(); connection.query(sql,valuesParams,function (err, result) { if(err){ console.log('[INSERT ERROR ] - ',err.message); callback(err, result); return; } console.log('-------INSERT by service ----------'); console.log('INSERT ID:',result.insertId); console.log('#######################'); callback(err, result); }); connection.end(); console.log('調用結束等待結果'); } //拼接valuesParams function createParams(data){ console.log('開始拼接數據數組'); console.log('createParams的age:' + data.name); var valuesParams = []; //數據變成數組的形式 var colName = ""; for (var i=0 ;i<meta.column.length;i++) { colName = meta.column[i]; valuesParams.push(data[colName]); } return valuesParams; } };
今天先到這裏,代碼在不斷改進中。以上代碼都是能夠正常運行的。
第二版的代碼,有不少缺點,好比層次不分明,思路混亂,無法擴展。由於這還只是單表的添加,那麼主從表的添加呢,批量添加又怎麼辦?仍是要不斷的改進的。