分析一套源代碼的代碼規範和風格並討論如何改進優化代碼

個人工程實踐選題主要是實現一個先後端分離的數據可視化項目,後端在數據獲取這塊,應用的是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++){

//...

}

七、除非必要,不然不要頻繁在循環內建立對象,以避免影響效率。

八、除非必要,不然儘可能把循環次數多的循環放在內層,減小跨切循環的次數。循環次數不要超過三層。

相關文章
相關標籤/搜索