設計模式分享

引言


什麼是設計模式?


來源於建築學。設計模式是一套被反覆使用、多數人知曉、經過分類編目的、代碼設計經驗的總結。


為什麼我們需要設計模式?


為了面試有話說 提前發現代碼的變化點, 提高程序擴展性, 可複用性, 減少溝通成本。


如何學習設計模式?


應用到項目中, 體會模式的優缺點, 寫讀書筆記等。


設計模式分享


編程規範

下面的代碼有哪些問題:

<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/


分享到:


相關文章: