四年經驗老開發,總結的Java代碼規範全部奉上

四年經驗老開發,總結的Java代碼規範全部奉上

寫代碼就像寫文章, 好的代碼就像好的文章,結構嚴謹,構思清晰。寫代碼就像寫文章, 一不留神就成流水賬,為避免這種情況作為軟件開發工程師,重要的是設計而不是實現。

在一個團隊中,由於不同經驗的開發導致編程風格可能會出現非常混亂的情況,從而導致開發成本上升。難以維護。所以代碼規範就顯得異常重要了。

本篇文章就是給出編程命名的建議,僅供參考,但是其目的是為了統一規範,提高編程能力,降低開發成本,減少代碼維護成本。

契約精神: 做到有法可依,有章可循。

一、類命名1. 抽象類

適用的設計模式為模板模式。抽象是自下往上的設計。由具體實現推斷出抽象方法。建議以Abstract開頭。

2. 枚舉類
  • 枚舉是由JVM來保證的單例。可以用來做單例類。
  • 枚舉類長用作值判斷,不建議每次進行循環判斷得到實例。建議由內部維護一個map類型,當做cache。此方法建議放在static靜態代碼塊中實現

public enumProtocolEnum {
/**
* ECHO協議
*/
ECHO(1null),
/**
* mojito協議
*/
MOJITO(2, MojitoProtocol.class);
privatebyte type;
privateClassextends

Protocol> protocol;
private staticMap<Byte, ProtocolEnum> cache = newHashMap<>();
static {
for(ProtocolEnum protocolEnum : values()) {
            cache.put(protocolEnum.type, protocolEnum);
}
}
public staticProtocolEnum byType(byte type) {
returncache.get(type);
}
}    
3. 工具類

工具類常為無狀態對象,無狀態對象都是線程安全對象,建議使用 final 修飾。

工具類中避免出現業務屬性, 如果出現業務屬性,抽象出領域層

4. 異常類

建議保持異常鏈。

5. 接口實現類

眾所周知

6. 設計模式相關類
四年經驗老開發,總結的Java代碼規範全部奉上
7. 處理特定功能的

其主要的目的是代碼可重複使用。

8. 測試類


9. 領域模型載體


二、方法命名

參考於網絡。

1. 布爾判斷方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
2. 檢查的方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

3. 按需求才執行的方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
4. 異步相關方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
5. 回調方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
6. 操作對象生命週期的方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
7. 與集合操作相關的方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
8. 數據增刪改查相關的方法

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
9. 成對出現的動詞

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

四年經驗老開發,總結的Java代碼規範全部奉上
四年經驗老開發,總結的Java代碼規範全部奉上
10. 獲取必須的參數


11. 獲取數據並對數據進行某種處理

注:Prefix-前綴,Suffix-後綴,Alone-單獨使用

三、方法編程建議1. 方法複雜度

凡事邏輯判斷語句均為複雜度。當一個方法中出現了大於等於10個複雜度。建議根據

方法實現進行業務抽離。兩個建議點(1. 方法單一職責 2. 方法可重複利用 3. 是否能用策略模式或者命令模式)

2.方法長度及寬度

長度: 方法的長度建議控制在80-120行以內。滿足一屏可以放下。 寬度: 當方法超過3個及以上入參,建議使用對象封裝(對象容易後期擴展,且不會出現眼花繚亂現象)

3.關注方法優化編輯器提示

減少出現黃色警告⚠️, 最好不要出現警告。編輯器的警告都是優化點,需要在編程時候考慮進去。

eg: 性能優化、命名不規範、重複代碼

四年經驗老開發,總結的Java代碼規範全部奉上

img

4.方法重複代碼

貧血模型的標誌性問題

重複代碼編輯器會提出警告,此種現象,強烈建議不要出現

5. 方法註釋

註釋是必須要做的(先寫註釋再做實現),重在設計。

代碼是公司財產, 要對自己對公司對後人負責,先寫註釋再做實現。

四、項目依賴模型1. 領域設計的認識

領域劃分,用另外一個詞形容也非常的合適,就是業務模塊化。所有能力都進行能力化抽象,形成模塊,形成領域。 當遇到新的業務邏輯,底層的數據結構和數據關係肯定也是一樣的。那麼就可以像堆積木一樣,根據這些模塊快速的組裝成新的業務邏輯。快速的實現業務的迭代和升級。

關於這個問題,需要結合自己的業務系統來進行抽象和設計。

設計核心: 用面向對象的設計思想對業務進行解耦來做到領域劃分。

2. 層次劃分基礎層(外部調用,db操作)

注意: 基礎層只做適配不做業務

  • db操作以dao結尾
  • 外部調用以Client(Http協議)/Instruction(Rpc協議) 該層僅僅做數據適配,不做業務處理。
領域層(偏向領域的業務邏輯)

以Manager

業務層(對領域層的業務編排)

以Service結尾

外觀層(可以提供能力,可以提供視圖)。

以Resource、Facade結尾

有一個完善的領域層,可以方便快速便捷的對業務進行擴展。與其對立的就是貧血模型。沒有領域層只有業務層,業務邏輯都堆積在業務層。典型的面向過程設計。

四年經驗老開發,總結的Java代碼規範全部奉上

img

3. 層次依賴模型

maven多模塊應用和單模塊應用通用。

一定要控制項目的依賴情況。

①service只能出現領域層的依賴, 領域層只能存在dao層和第三方服務層。

②各個層代碼不能平行調用(出現平行調用邏輯,要抽象出領域層來封裝)。

四年經驗老開發,總結的Java代碼規範全部奉上

img

具體代碼體現就是

  • 以Service命名的類,裏面只能存在Manager
  • 以Manager命名的類,裏面只能存在Dao和Client(Http協議)/Instruction(Rpc協議)封裝的第三方調用
  • 以Dao命名的類是對數據庫的操作
  • 以Client(Http協議)/Instruction(Rpc協議)命名的類,作為適配層與第三方API進行交互封裝
五、設計模式六大原則

代碼編程時候要向以下這6大原則,進行向其靠攏。

1. 開閉原則

一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。

代碼設計建議

用抽象構建框架,用實現擴展細節因為抽象靈活性好,適應性廣,只要抽象的合理,可以基本保持軟件架構的穩定。

2. 單一職責

不要存在多於一個導致類變更的原因通俗的説,即一個類只負責一項職責。

代碼設計建議

在具體方法編寫或者類編寫時候,類編寫時候業務要單一,方法編寫時候實現要單一

反例:

UserService 類中提供了獲取商品信息的接口

setUserName(String name)方法的時候,對name的值進行了二次處理。

3. 里氏替換原則

所有引用基類的地方必須能透明地使用其子類的對象。

代碼設計建議

面向接口編程, 子類能透明替換父類。

4. 依賴倒置原則

高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。

代碼設計建議

要根據接口或者抽象去設計,不要依賴於細節,eg.項目中要換數據庫,不用重新寫底層的數據庫代碼. 就是使用了hibernate一樣,替換方言就好了,因為hibernate是根據接口設計的,不同數據庫有不同的實現,可以直接使用. eg2: 我生病了要去買藥,如果A藥鋪,沒有我就用B藥鋪買. 因為他們都是藥鋪,都有一樣的功能,可以友好的替換

5. 接口隔離原則

客户端不應該依賴它不需要的接口;一個類對另一個類的依賴應該建立在最小的接口上。

代碼設計建議

保持最小的責任。

eg: 接口ConfigurableApplicationContext實現了Lifecycle和Closeable接口。他們其中每個裏面定義的接口都很少,為什麼不定義到一起呢?

首先第一責任清晰單一,第二做到接口隔離。

當某一個方法只用到生命週期的方法,那麼方法就可以寫成。

public void stop(Lifecycle lifecycle); 調用時候用->public void stop(new ConfigurableApplicationContext());

public void close(Closeable closeable); 調用時候用->public void close(new ConfigurableApplicationContext());

stop裏面的實現就只能調用Lifecycle裏面的方法,而不能調用ConfigurableApplicationContext裏面的方法。從而來達到接口隔離原則

6. 迪米特法則

一個對象應該對其他對象保持最少的瞭解。

代碼設計建議

減少類與類之間的關係,接口隔離也可以做到。

六、版本迭代
  • master分支版本後綴 ${大版本號}.${0進位}.${迭代版本號}.RELEASE
  • test分支版本號 ${大版本號}.${0進位}.${迭代版本號}.SNAPSHOP

迭代版本可追蹤,避免出現jar包覆蓋無法追蹤

迭代版本升級,必須升級迭代版本號。避免出現jar包覆蓋無法追蹤

1. 大版本定義

APP1.0 APP2.0 APP3.0

2. 迭代版本號

APP1.0.1 APP1.0版本的第一個迭代

APP1.1.0 APP1.0版本的第十個迭代

APP2.0.2 APP2.0版本的第二個迭代

APP2.1.0 APP2.0版本的第十個迭代

七、代碼格式化

統一格式化模板,解決多人共同開發場景,代碼格式化導致的git提交衝突問題

【來源:軟件編程指南】

聲明:轉載此文是出於傳遞更多信息之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與本網聯繫,我們將及時更正、刪除,謝謝。 郵箱地址:[email protected]

版權聲明:本文源自 網絡, 於,由 楠木軒 整理發佈,共 528 字。

轉載請註明: 四年經驗老開發,總結的Java代碼規範全部奉上 - 楠木軒