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)。這樣在以後第三方代碼更新的時候,我們的工作量會降到最低。