写代码好多年了,发现你们的思路都是写代码、写代码、写代码,还弄了个称号——码农。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; } };
今天先到这里,代码在不断改进中。以上代码都是能够正常运行的。
第二版的代码,有不少缺点,好比层次不分明,思路混乱,无法扩展。由于这还只是单表的添加,那么主从表的添加呢,批量添加又怎么办?仍是要不断的改进的。