个人工程实践选题主要是实现一个先后端分离的数据可视化项目,后端在数据获取这块,应用的是Mybaits框架,最近也一直在学习相关内容,如下分析的,即是一套基于Mybaits的增删改查入门案例。java
1、分析源代码目录结构程序员
/src 源代码目录算法
/src/main 工程源代码目录数据库
/src/main/java 工程java源代码目录编程
/src/main/resources 工程的资源目录(Mybatis、Spring等的配置文件)后端
/src/test 单元测试目录数组
/src/test/java 工程java单元测试目录,存放全部测试.java文件,如JUnit测试类app
/target 输出目录,存放全部的输出文件(如 .class、.jar、.war 等文件)框架
/target/classes 编译以后的class文件前后端分离
Maven Dependencies 引到项目的jar包
pom.xml maven最核心的配置文件,与构建过程相关的设置都在这个文件中配置
maven工程的目录结构均按此标准,实现项目的自动化构建。遵循 约定->配置->编码 的过程,能够进行配置的不须要专门编码指定,能按照实现约定好的规则处理的不须要再多余配置,可以减小多余劳动力,还可以预防低级错误。
2、文件名/类名/函数名/变量名等命名规范
符合Java的命名规范有两种:
一、camel命名方式:用于方法名和普通变量名称
二、pascal命名方式:用于类、接口命名
类名:pascal命名方式
变量名(局部变量、形参、实例域、静态域):camel命名方式
函数名:camel命名方式
包名:全小写
常量:所有大写,多个单词之间用“_”隔开
类名、接口名:与源文件名一致
3、接口定义规范
接口定义统一放在 dao 文件夹中,由于是针对User类的相关属性进行“增删改查”,命名为“IUserDao”,I 表明 Interface,User 即对应相应的操做类,Dao 说明是数据操做层。
接口中定义的方法名,也以动词+名词的方法,体现其实现的功能。
4、单元测试组织形式
在 /test/java 的文件夹下,创建和 /main 文件夹同样的路径信息 /com/lyg,建立单元测试文件。命名规则为“待操做类+Test”。
引入 junit 包,实现单元测试功能。
针对待测试的功能,经过 @Test 注解,建立 “void 功能名”的方法,并在该方法中使用待测试的功能,运行单元模块,输出结果进行判断。
5、列举哪些作法符合代码规范和风格通常要求
如红圈标示所示,针对某一具体路径的 java工程,对应的配置文件,单元测试类所处的相对路径相同。使得总体一致,方便自动对应,减小设置路径的代码工做。
Mybatis的事务操做前须要设置配置并链接数据库,事务操做后须要提交事务并释放资源,在每一个测试方法中都须要应用到。
经过@Before、@After的注解,抽离成独立的方法,提高了代码的可阅读性和简洁性。
Mybatis的特色之一在于,利用配置文件去实现Dao层的数据库操做,不须要程序员去具体实现接口功能。只要在接口对应的配置文件中将所需实现功能的SQL语句写好,便可实现该功能。极大简化了程序员的开发工做量,将精力集中在具体业务实现的逻辑中,简化其余繁琐工做。
6、列举哪些作法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进
接口的方法定义中,void类型方法没有考虑失败状况,不返回任何数据。
改进:将void改成boolean类型,若成功返回true值,失败返回false。
同一接口返回格式不统一,有返回 User 的,也有返回 List<User>的。
改进:定义一个统一的格式类,ResultBean,集成全部相关类型。
7、总结同类编程语言或项目在代码规范和风格的通常要求(引用CSDN博主「下班后的爪哇菌」的博客内容https://blog.csdn.net/lxxiang1/article/details/81042604)
排版:
一、不一样的程序块之间,用空行隔开。
二、较长的语句应该换行,并适当缩紧保持可读性。长表达式优先在操做符处划分,操做符放在新行之首。
三、一行只声明一个变量。
四、if、for、while、do while语句,哪怕只有一条语句,也必须使用{ }隔开。
五、类属性和类方法不要交叉放置,不一样存取范围(private、protected、public)的属性或者方法也尽可能不要交叉放置。
六、修饰词按照指定顺序书写:[访问权限][static][final]。
七、类内部的代码布局顺序:类属性、构造方法、方法、main方法
注释:
一、类和接口的注释放在class或者interface关键字以前,import关键字以后,使用“/** */”注释方式。
格式举例
/**
* <一句话功能简述>
* <功能详细描述>
* @author [做者](必须)
* @see [相关类/方法](可选)
* @since [产品/模块版本](必须)
* @deprecated (可选)
*/
二、类属性的注释放在属性前面
格式:
/**
* 注释内容
*/
private String userName;
三、公共(public)和保护(protected)方法注释内容:列出方法的一句话功能简述、功能详细描述、输入参数、输出参数、返回值、异常等。
格式示例(根据各公司具体要求有所不一样):
/**
* <一句话功能简述>
* <功能详细描述>
* @param [参数1] [参数1说明]
* @param [参数2] [参数2说明]
* @return [返回类型说明]
* @exception/throws [异常类型][异常说明]
* @see [类、类#方法、类#成员]
* @since [起始版本]
* @deprecated
*/
注意:异常注释用@exception或@throws表示,在JavaDoc中二者等价,但推荐用@exception标注Runtime异常,用throws标注非Runtime异常。
异常的注释必须说明该异常的含义及什么条件下抛出该异常。
四、代码注释使用 // 进行,与其描述的代码相近,对代码的注释应放在其上方,并与其上面的代码用空行隔开,注释与所描述内容进行一样的缩进。
命名规则:
一、类名和接口名字使用意义完整的英文描述,加强可读性。每一个英文单词的首字母使用大写,其他字母使用小写。
例如:ConnectionManager、UserDAO、Customer;
二、属性名使用意义完整的英文描述,第一个单词的字母使用小写,剩余单词的首字母大写、其他字母小写。属性名不能与方法名相同,集合意义的属性名使用复数形式。
例如:private String customerName; private List<Customer> customers;
三、方法名的命名规则基本与属性名相同,不过方法名通常以动词开头。
例如:private void initFrame(){ }
四、常量名使用全大写的英文描述,英文单词之间用下划线隔开,并使用final或者static final修饰。
例如:public final int MAX_VALUE = 1000;
性能与可靠性:
一、使用System.arrayCopy方法进行数组拷贝,提升性能。
int[] a = {3,5,6,12,45};
int[] b = {23,12,4,53,2};
System.arraycopy(a, 1, b, 2, 2);
for(int i=0; i < b.length; i++){
System.out.print(b[i]+" "); //23 12 5 6 2
}
二、把集合转换成数组时,使用Collection中的toArray方法,不要使用循环。
List<String> strList = new ArrayList<String>(15);
String[] strArr = new String[strList.size()];
String[] strs = strList.toArray(strArr);
三、大量字符串的相加等于处理应该使用StringBuffer。“大量”通常指5次“+=”以上或者在循环中进行字符串“+=”操做。
例如:
String[] strs = {"aa","bb","cc","dd","ee","ff","gg"};
String str = "";
for(int i = 0; i < strs.length; i++){
str += strs[i];
}
应改成
String[] strs = {"aa","bb","cc","dd","ee","ff","gg"};
StringBuffer sbf = new StringBuffer();
for(String str : strs){
sbf.append(str);
}
四、尽可能使用JDK自带的API类库中的类和方法,不要本身写相似功能的类。API在可靠性、性能方面通常有更好的表现,必须熟练掌握,特别是算法方面的。
五、IO操做流使用有Buffer功能的类,如BufferedReader以及BufferedWriter,拥有更好的性能,没有Buffer的IO流频繁IO操做,效率相对低。
FileReader fr = new FileReader("D://test.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
while(line != null){
System.out.println(line);
line = br.readLine();
}
六、不要在循环内执行没必要要的重复操做,可在循环外调用一次的,就避免在循环内进行没必要要的反复调用。
例如:
for(int i = 0; i < result.size(); i++){
//...
}
应写成:
int size= result.size();
for(int i = 0; i < size; i++){
//...
}
七、除非必要,不然不要频繁在循环内建立对象,以避免影响效率。
八、除非必要,不然尽可能把循环次数多的循环放在内层,减小跨切循环的次数。循环次数不要超过三层。