故事背景
组长让我修改一个很简单的bug——在用户使用API添加地址的时候,后台验证一下地址信息。比如:地址名称,国家名称,街道名称不能为空……
之前是在API的Controller中写了一部分验证逻辑的,因为没有写全面,导致了bug的产生。
解决方案
办法:直接在API的Controller中的validate方法中修改。
【优点】:直接,快速,可以很快把bug修改完。
【缺点】:添加地址的入口不止一个,在我们的项目中除了通过API的方式添加,还有Upload方式添加,以及通过Portal添加。既然,该功能入口不止一个,那么他们都需要在添加时进行验证。如果以这种方式改,其他地方只能Copy,如果再加入其他的验证规则,这三处都得改。办法:将validate方法写到contactService接口中,并在contactServiceImpl类中编写实现。
【优点】:只维护一份,便于修改和维护。
【缺点】:在contactService大多是和Contact的查询,添加,删除,修改有关的方法,好像验证方法放这里不太合适,而且ContactService中的方法的第一个参数必须加@DataCenterId注解,和分布式有关,而验证方法并不需要。方法:将validate方法写到Contact中。
【优点】:因为validate方法都是对contact中的各个字段进行验证,这样更符合面向对象和单一职责原则。
【缺点】:但是因为Contact是POJO对象,直接在contact中加一个validate的验证方法不合适,而且在验证过程中,可能会调用其他类的其他方法,所以直接这样写,肯定是不行的。在我困惑应该怎么写的时候,发现了Hibernate-validator框架。它可以直接配置验证规则在xml中,既满足了封装,又易于修改。
总结
这里用一个经典的话来回答题目中的问题:
绝大多数情况下,函数应该放在它所使用的数据的所属对象内。
——《重构—改善既有代码的设计》