分析一套源代码的代码规范和风格并讨论如何改进优化代码

个人工程实践选题主要是实现一个先后端分离的数据可视化项目,后端在数据获取这块,应用的是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命名方式:用于方法名和普通变量名称

  • 若标识是由单个单词组成的,则单词所有小写。例如:private Integer name;
  • 若标识是由多个单词组成的,则第一个单词为小写,第二个单词及其以后的,首字母均需大写。例如:private Integer myName;

二、pascal命名方式:用于类、接口命名

  • 类名是以大写字母开头的单词。例如:class User;
  • 若类名由多个单词组成,则每一个单词首字母大写。例如:class MyUser;

类名: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++){

//...

}

七、除非必要,不然不要频繁在循环内建立对象,以避免影响效率。

八、除非必要,不然尽可能把循环次数多的循环放在内层,减小跨切循环的次数。循环次数不要超过三层。

相关文章
相关标签/搜索