习惯3:一个对象执行功能集中的服务集
第三个习惯是,软件的每一个对象都集中的执行一个小的、少有的服务集。执行小基数工作的对象容易阅读,容易正确使用,因为只有少量的代码需要理解。此外,软件的每一个对象都必须执行少有的服务集,因为重复的逻辑浪费开发人员的时间,增加维护的成本。设想,未来,业务团队要求升级 isRequestedPasswordValid()的逻辑,如果两个不同的对象都有执行相同动作的类似方法,在这种情况下,软件开发人员将要比升级仅仅一个对象花费更多的时间来升级两个对象。
作为案例学习的示例,CustomerAccount对象的目的是管理一个独立的客户的账户。它首先是创建一个账户,然后是验证账户对于购买商品来说仍然是活跃的。假设在未来,软件需要给那些购买了十件以上商品的客户折扣。创建一个新的接口,ICustomerTransactions,而且对象,CustomerTransactions,来实现这些新的特性。这些都是开发“易于理解”软件需要有目的进行的工作。

这个新的对象维护存储客户交易和决定什么时候客户获得他的十件商品者扣的状态变化和行为方法。它应该是易于创建、测试和维护,因为它只有一个简单的、集中的目的。而一个效率低下的方法是将这些新方法加入到已经存在的ICustomerAccount接口和CustomerAccount对象。如下所示:

就像上面看到的那样,允许对象变成大的责任和目标的仓库将使得它们更加难以阅读,更加容易误解。误解将导致效率的损失,增加业务团队的时间和金钱。简而言之,让对象和它的方法集中的执行小单元的工作更好一些。