前提

某天晚上老夫在神游时,想起白天公司同事说起的问题,这老表抱怨使用mysql生成大批的随机测试数据太过麻烦,问大家有没有好的工具推荐,老夫对这种事情当然不关心,毕竟我也不知道。

秉承着不懂就要问,不会就要学的核心思想,花了点喝咖啡的时间,简单的在脑海中构思了一下工具核心实现,决定开始动手写,今晚的烧烤不吃了。

几个问题

我们需要学会如何去分析一个需求,在不包含业务的情况下,尽可能多的考虑即将面临的问题以及解决方式。

1.如何生成数据。

2.如何把数据放在对象里。

3.如何输出对应类型的对象,确保使用者不用再次转换。

4.如何约束生成规则,让生成的数据尽量的具有实际意义。

5.对于不同的类型,如何判断。

6.对于List,Map此类数据如何生成。

7.有点饿。

解决问题的路

粗略的预设了以上7点拦路虎,除了第7点暂时无法解决外,另外6点都好说,好说。

把以上问题都一步步解决,整个工具也已经大概成型。

第一个问题:如何生成数据

在不要求实际业务意义的情况下,要解决此问题,似乎格外的简单,我们在日常业务中会接触到一些简单的数据生成器,如 new Random().nextInt() 等, 我们需要做的只是对生成的数据的范围进行一个限制,其他类型的数据也具有解决方案,后续会一一说明。

第二个问题:如何把数据放在对象里

没有其他办法,使用反射进行设置。

第三个问题:如何输出对应类型

使用过一些工具,唯一蛋疼的地方就在最后一步,需要我进行一次强制转换才能正常使用,如:MyEntity myEntity = (MyEntity) xxx.xxx(MyEntity.class); ,此方式从功能上来说肯定没有任何问题,从我个人角度来说,老夫并不是很喜欢这种编码风格。

于是老夫思来想去,最终皇天不负有心人,方案如下(伪代码):

public class ClassName<T>{
public T build(Class clazz){
Object data; //生成的数据
//.......
return (T)data;
}
}

使用泛型的方式,解决了此问题,对此部分不熟悉的同僚,请查阅相关资料,此处不做赘述。

第四个问题:如何约束生成规则,让生成的数据尽量的具有实际意义。

此问题的解决方案其实很多,注解,配置,代码设置,都可实现,我们需要考虑的是几种方案的优劣。

注解先排除,工具性质的框架,个人觉得应该最大化的避免代码的侵入性,注解会对使用者项目的实体类进行代码入侵。

剩下2种方式最终我选择配置文件的方式,代码设置固然可行,但是会导致整个工具使用起来相当复杂,且工具的设计者也需要考虑更多。

第五个问题:对于不同的类型,如何判断

此问题作为数据生成类的工具额外重要,对需要生成的类型的判断也是基础中的基础,但是却格外的简单,方式如下(伪代码):

public Object checkType(Type fieldType){
if(fieldType == int.class || fieldType == Integer.class){
//...
} else if(fieldType == String.class){
//...
}
}

Type为java.lang.reflect包下的类,表示Java中属性的类型,使用此方式,可判断出对应的需要生成的数据类型,此处有坑,后续说明。

第六个问题:对于List,Map此类数据如何生成

此处文字不好说明。后续代码部分进行说明

开始Codeing

粗略的分析并且简单的构思了一下几只拦路虎的对付方法,下面可以准备开始剥夺键盘的寿命了。

当然还有一个很严重的问题:给你的工具起个名字吧。

本例的名称暂定为JavaFastData。

既然是工具,那么需要先提供一个对外的API,供使用者调用。

代码部分篇幅略大,为了不影响各位的体验,随后另开文章,精彩继续。

最新文章

  1. Android 通过httppost上传文本文件到服务器。
  2. SVN-简要说明
  3. Java中的Set集合接口实现插入对象不重复的原理
  4. linux配置时间同步
  5. (摘)Chart属性设置
  6. BZOJ 3884: 上帝与集合的正确用法 [欧拉降幂]
  7. Docker----搭建自己的gitlab(填坑之旅)
  8. Educational Codeforces Round 5F. Expensive Strings
  9. Android Studio 入口程序的设置方法
  10. 内网主机使用yum安装软件
  11. Modbus库开发笔记之五:Modbus RTU Slave开发
  12. 洗礼灵魂,修炼python(13)--模块random,math,pickle
  13. MySQL基础~~编程语法
  14. JavaScript操作BOM对象
  15. fatal: unable to access &#39;https://xxxxx&#39;: SSL connect error
  16. vue中的前置守卫
  17. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换
  18. 使用u盘安装os&#160;x系统
  19. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
  20. MVC FormCollection 无法获取值的问题

热门文章

  1. iTextSharp生成PDF文件
  2. 字符串split的用法
  3. adb连接手机
  4. 大揭秘| 我司项目组Gitlab Flow &amp;&amp; DevOps流程
  5. Hadoop框架:单服务下伪分布式集群搭建
  6. day51:django:dispatch&amp;模板渲染&amp;过滤器&amp;标签&amp;组件&amp;静态文件配置
  7. VS2017报错:未识别符vector
  8. 将lua编译进nginx
  9. php第三天-数组的定义,数组的遍历,常规数组的操作
  10. python库之argparse