边界
程序中的边界就是你的代码和其他代码的分界线。包含两个部分,一个是你是接口提供者,如何提供数据;另一个你是接口使用者,如何使用数据。
1.接口提供者
写接口给别人使用时,都会使用对象来传递数据,但有些传递数据的对象是存在问题的。例如:List、Map等,如果我们使用这些数据结构返回数据,使用者可以使用这些数据结构的某些方法修改数据,例如List有add、remove等方法,使用者也可以使用,这就产生了风险,使用者可以窥探我们返回的数据。
一般的解决方法是定义一个新类,包装我们返回的数据。即在类中私有化数据结构,提供公共的某些获取方法。举例如下。
public class ResultClass { private List<String> data; public String getByIndex(int index) { return data.get(index); } }
2. 接口使用者
很多时候,我们都会遇到,我们要使用的接口还没开始编码或还没完成,但我们又不能一直等。这时,我们就需要先设计出我们需要接口提供的功能,以及自己定义接口返回的数据,后面我们使用接口的地方都会使用我们前面自己定义的类。当接口完成后,我们再写一个适配器类,完成第三方接口和我们已经定义的接口需要完成的功能类的整合。本质上就是使用设计模式中的适配器模式。举例如下。
interface API { void sayHello(int type); } public class APIImpl implements API { APIAdapter api; void sayHello(int type) { api = APIAdapter(type); api.sayHello(); } } public class APIAdapter implements API { ConcreteAPI api; APIAdapter(int typeId) { if(typeId == 1) { api = new APIByEnglish(); } else if(typeId == 2) { api = new APIByChinese(); } api = null; } void sayHello(int type) { api.sayHello(); } } interface ConcreteAPI { void sayHello(); } public class APIBYEnglish implements ConcreteAPI { void sayHello() { System.out.println("Hello"); } } public class APIByChinese implements ConcreteAPI { void sayHello() { System.out.println("你好"); } }
总之,这一部分要求我们学会写接口和使用接口。对于使用接口我们一般通过看文档、写测试用例来使用接口,同时如果接口更新后,我们也可以通过接口测试用例来检验接口的正确性。