16.4 提炼模型

    软件设计的其中一个目标是实现模块内部的高内聚,要实现这个目标,对象应该职责分明,如果对象承担了应该由其他对象承担的职责时,它是低内聚的,换句话说,高内聚需要限制对象的职责,尽可能为它们分解单一的、不重复的职责。

    在第12章,我们讲述了策略模式,从模型来看,其实它还不算是精炼的。

    让我们再仔细看看这个模型,我们为HappyPeople类添加了addTransportation(Travellable transportation)、getTransportation(int index)和removeTransportation(Travellable transportation)等方法,添加这些方法的意图无外乎就是管理Travellable对象。随着业务的深入,或许需要更多的方法来管理它们,这样HappyPeople多出了很多与Travellable管理相关的职责。其实更进一步,我们应该分解这个类,把管理Travellable对象的职责封装在一个新类里,这样便形成了如图16-4所示的设计图。

    figure_0269_0284

    图16-4

    这样,类之间的结构便是高内聚的,对于Travellable对象的处理都在Travel对象里,HappyPeople类便能更加关注自己的职责了。

    我们看看Travel类的实现代码,大致如下所示。

    figure_0269_0285

    HappyPeople类的代码如下所示。

    figure_0270_0286

    于是,我们撰写测试的代码大致如下所示。

    figure_0270_0287

    figure_0271_0288

    最后,执行结果如下所示。

    figure_0271_0289

    figure_0272_0290

    提炼模型不是在开发中的某一个阶段应该做的事情,而是一个不停迭代的过程,随着我们对领域知识的不断消化,我们也就能提炼出更为精准的模型。提炼模型比使用技术更为重要,一个好的软件架构能够使我们选用不同的实现技术(所谓的Reversibility[1]),而如果模型粗糙、拙劣,不管使用多么先进多么流行的技术,都是无法应对复杂的领域问题。软件的核心不是技术,也不是模式,而是模型。

    [1]参见“The Pragmatic Programmer”一书的第二章:A Pragmatic Approach。