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)。这样在以后第三方代码更新的时候,我们的工作量会降到最低。