[Clean Code] Chapter 8: 第三方API的使用!

Chapter 8:Boundaries

很多時候我們會使用 第三方包 API 其他部分開發的API 或者 開源軟件。
我們應當cleanly 的使用這些外部代碼


1-使用第三方代碼

代碼的提供者需要考慮通用性,但是代碼的使用者,則會根據自己的需求希望special的功能。

創建一個關於傳感器的map, 則

// 代碼1
Map sensors = new HashMap();
...
// 取出 not clean
Sensor s = (Sensor)sensors.get(sensorId );

or
// Map<Sensor> 依然是提供超出我們需求的東西
Map<Sensor> sensors = new HashMap<Sensor>();
...
Sensor s = sensors.get(sensorId );

一種解決辦法,

// 代碼2
public class Sensors {
    private Map sensors = new HashMap();

    public Sensor getById(String id) {
        return (Sensor) sensors.get(id);
    }
    //snip
}

但是並不是說每次使用map都要這樣做,作者推薦不要直接在你的整個系統中直接傳map,且避免傳給公共API, 或者從API返回

在學習中測試你使用的API接口,確保你返回你要的結果


2-學習 log4j

一個簡單的命令行日誌,且將系統其餘部分與 log4j 隔離開。

public class LogTest {
    private Logger logger;

    @Before
    public void initialize() {
        logger = Logger.getLogger("logger"); logger.removeAllAppenders(); Logger.getRootLogger().removeAllAppenders();
    }

    @Test
    public void basicLogger() {
        BasicConfigurator.configure();
        logger.info("basicLogger");
    }

    @Test
    public void addAppenderWithStream() {
        logger.addAppender(new ConsoleAppender(
            new PatternLayout("%p %t %m%n"), ConsoleAppender.SYSTEM_OUT));
        logger.info("addAppenderWithStream");
    }

    @Test
    public void addAppenderWithoutStream() {
        logger.addAppender(new ConsoleAppender(
            new PatternLayout("%p %t %m%n")));
        logger.info("addAppenderWithoutStream");
    }
}

3-使用還沒有開發的代碼

項目中,你的項目可以需要和其他的子系統相互配合,但是子系統還沒開發完成(也許設計都沒完成)。
定義你需要的子系統接口,保證代碼clean, 然後預留對子系統API的適配器。

[A] <---> [B API](未開發)

可以分解爲
[A] <---> [B]
           |
           +--- [Fake B]
           |
           +--- [B API Adapter] <-- 適配 --> [未來會開發的B API]

4-總結

在測試中學習第三方的接口,保證其輸出的確實你想要的結果。
將系統的其餘部分與這些Boundaries隔離開,使其中的依賴降到最低(譬如添加Adapter)。這樣在以後第三方代碼更新的時候,我們的工作量會降到最低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章