引言
什麼是設計模式?
來源於建築學。設計模式是一套被反覆使用、多數人知曉、經過分類編目的、代碼設計經驗的總結。
為什麼我們需要設計模式?
為了面試有話說 提前發現代碼的變化點, 提高程序擴展性, 可複用性, 減少溝通成本。
如何學習設計模式?
應用到項目中, 體會模式的優缺點, 寫讀書筆記等。
編程規範
下面的代碼有哪些問題:
<code>public class Demo {
private static final String EXPENSESTATUSUPDATEDEMAIL = "費用報告狀態更新提醒/ Expense report status updated notice";
private boolean ispaper;
private Long rate = 202l;
private static final String PERPOSE = "123";
public static void main(String[] args) {
String purpose = "報銷款_" + args[0] + "_" + args[1];
System.out.println(purpose.equals(new Demo().PERPOSE));
ArrayList<bigdecimal> bigDecimalList = new ArrayList<>();
bigDecimalList.add(new BigDecimal(23.567));
for (BigDecimal bigDecimal : bigDecimalList) {
bigDecimalList.remove(bigDecimal);
}
}
}
/<bigdecimal>/<code>
設計技巧
一. 不要有重複代碼
1.1 主要是一些 convert 等一些私有方法, 使用 idea 快捷鍵( Option + Command+ M )重構成 private 方法, 沒有抽取到 Util 工具類或者更通用的 manager 中造成重複
1.2 業務迭代遠程配置開關的時候的業務代碼重複程度高
1.3 二個相似類內部代碼相似, 沒有抽出公共基類, 接口等
1.4 大量入參拼裝代碼相似, set 十幾行, 沒有抽成公共的 requestBuilder
二. 過長函數
2.1 過長的函數不只是指代碼行數長的函數, 還指函數內部包含代碼語義與實現手法之間的差異大的代碼的函數,也就是 "做什麼" 和 "怎麼做" 之間的語義差距(需要註釋單獨說明的代碼段, if 和 for 的內容等)
2.2 建議函數行數不超過 80 行
三. 參數長度過短或者過長
3.1 過長會導致閱讀困難, 調用方調用困難, 比如 ipId, ipRoleId 和 alipayId 可以組成同一個入參 userIds, pdCode, loanTerm, repayMode 等變成 productionInfo 傳遞, 可以有效減少參數長度
3.2 過短是由於入參中的某個類有太多的屬性導致, 同樣會出現閱讀和調用困難
四. 發散式變化 VS 散彈式修改
4.1 針對某一外界變化的所有相應修改, 都只應該發生在單一類中, 而這個新類內的所有內容都應該反應此變化
4.2 一個變化需要修改多個類, 可以把相關的類聚合在一起
五. 依戀情結
5.1 某一個類 A 中的某個函數為了計算一個值, 調用了另外一個類 B 中的大量方法和屬性, 可以考慮將方法放入 B 中
六. 數據泥團&基本類型偏執
6.1 指的是多個數據相互關聯, 又缺一不可, 可以考慮定義一個統一的新類, 把這些數據放在一起, 基本類型推薦小對象, range, money 類等
七. 過度耦合的消息鏈
7.1 A 對象調用 B, B 再調用 C, C 再調用 D etc 才能獲取到真正的值, 實際表現比如 a.getb.getc.getd 等, 這種壞處是調用方還要經常判空, 調用方要明確對象之間的關係, 對象之間的關係變化時, 調用方也不得不隨著變化調用方式
八. 不完美的類庫
8.1 一些工具類可能不滿足需求, 可以通過繼承重寫或者外面包一層來解決
比如原始的 uuid 生成不滿足渠道需求, 定製化重新提供, UUIDUtil 等
九. 分解臨時變量
9.1 同一個臨時變量不是循環變量和用於收集計算結果的, 卻被複制超過一次, 這時候第 n 次複製時可以另外定義一個變量用來說明, 這樣可以增加可讀性
十. 封裝集合
當一個函數返回一個 Collection 時, 返回集合的可讀副本, 類內部提供添加/刪除能力, add/remove/put 等
十一. 使用衛語句
如果一個 if 語句過長, 使用取反操作直接 return 方法
十二.將查詢函數與修改函數分離開
任何有返回值的函數, 都不應該有看得見的副作用
小討論-效率和工程的取捨
這有一個集合, 要求幾個的最大值和最小值, 是要定義一個函數 getMinAndMax(list) 還是 getMin(list) 和 getMax(list) 呢?
設計模式的缺點
https://www.zhihu.com/question/23757237
最大的缺點就是令人頭禿...
學習資料
https://item.jd.com/12623588.html(23 種設計模式經典教程)
GitHub
https://github.com/iluwatar/java-design-patterns(裡面有 100 多種設計模式的 java 代碼例子, 會比較淺, 但是模式種類比較全, 還包括異步和多線程方面的設計模式)
Refactoring
https://refactoring.com/(https://martinfowler.com/)
阿里巴巴編程規範
https://github.com/alibaba/p3c(包含了編碼風格, 日誌打印, 數據庫, 工程結構, 安全, 設計等方面的規範)
廣告時間
GitBook:https://current_person.gitbooks.io/codogdesignpattern/content/
閱讀更多 codog代碼狗 的文章