我們平常在做需求過程中,有的同學會按照面向對象的原則設計寫出和框架代碼一樣高水平的代碼,有的可能就是用面向過程的方式把需求給實現了,但是感覺不漂亮!也就是複用性比較差,修改一點地方容易導致別的地方出問題,擴展性也比較差, 我覺得我們要寫出漂亮的代碼應該考慮下面幾個因素
1. 向對象的的基本特徵:封裝,繼承,多態
2. 類之間的關係:實現、依賴、關聯、聚合(has-a)、組合(contains-a);
3. 設計模式:23種設計模式;
4. 設計原則:SOLID (單一職責原則、開閉原則、里氏替換、接口隔離以及依賴反轉)
5. 多看下經典學習案例,如《Agile Software Dvelopment Principles》(敏捷軟件開發》中有個java薪水支付案例
簡單解釋下2個簡單又重要的設計原則:單一職責原則和開閉原則
1)單一職責原則,一個合理的類,應該僅有一個引起它變化的原因,即單一職責,就是設計的這個類功能應該只有一個;消除耦合,減小因需求變化引起代碼僵化。如下面的接口就應該抽到多個接口上
package com.cn.demo;
/**
* 購物行爲
* @version 1.00
* @time 2019-06-06 23:22
*/
public interface ShoppingResource {
/**
* 下單
*/
void createOrder();
/**
* 修改庫存
*/
void updateProductStock();
/**
* 發貨
*/
void deliverGoods();
/**
* 獲取用戶信息
*/
void getUserInfo();
}
2) 開-閉原則,講的是設計要對擴展有好的支持,而對修改要嚴格限制。降低了程序各部分之間的耦合性,其適應性、靈活性、穩定性都比較好。當已有軟件系統需要增加新的功能時,不需要對作爲系統基礎的抽象層進行修改,只需要在原有基礎上附加新的模塊就能實現所需要添加的功能。增加的新模塊對原有的模塊完全沒有影響或影響很小,這樣就無須爲原有模塊進行重新測試。 如下面的代碼其實就是模板方法的列子
package jk.sj.templateMethod;
public abstract class Testcase {
public abstract void beforeTest();
public abstract void doTest();
public abstract void afterTest();
public final void test() {
beforeTest();
doTest();
afterTest();
}
}
public class ATestcase extends Testcase {
public void beforeTest() {
System.out.println("A: <before>");
}
public void doTest() {
System.out.println("A: <test>");
}
public void afterTest() {
System.out.println("A: <after>");
}
}
public class BTestcase extends Testcase {
@Override
public void beforeTest() {
System.out.println("B: <before>");
}
@Override
public void doTest() {
System.out.println("B: <test>");
}
@Override
public void afterTest() {
System.out.println("B: <after>");
}
}
public class TestTemplateMethod {
public static void main(String[] args) {
Testcase testcase = new ATestcase();
testcase.test();
}
}
對於設計原則不明白的可以參考下面的博客講的比較清楚,但是建議熟記於心