第16章 面向对象开发

    懂得设计模式并不等于已经学会了使用面向对象进行开发,虽然熟悉这些模式有助于使用这些成功的经验来解决问题,但是由于问题本身的复杂性和隐藏性等特点,如何使用面向对象的方法建立合理的模型就成为了关键。

    本章,笔者将和大家一起讨论如何建立OO模型。

    16.1 写在面向对象设计之前

    我是一个Agile和Domain-Driven Design(简称DDD)的爱好者。在以下各节的讲述中,所提到的一些开发设计方法很大部分和它们有关,如果你是它们的反对者,可以忽略本章。这里首先简单介绍一下两个概念。

    1.Agile(敏捷开发)

    Agile兴起于20世纪90年代,像大家非常熟悉的Scrum(1995),Extreme Programming(极限开发,简称XP,1996)等轻量级软件开发方法现在都被认为是Agile的实现方法。在2001年2月,17个软件开发大师在美国犹他州(Utah)的一处滑雪胜地度假,期间讨论了各种轻量级软件开发的方式,最终一起发表了题为“Manifesto for Agile Software Development”的软件开发宣言。在此宣言中,提出了12条软件开发原则,由此便形成了我们以后知道的敏捷开发和敏捷联盟。

    2.Domain—Driven Design(领域驱动设计)

    Domain-Driven Design(DDD),是一门面向对象设计的哲学[1],在解决复杂领域问题方面,卓有成效。Eric Evans在“Domain-Driven Design:Tackling Complexity in the Heart of Software”一书,详细讲述了如何进行DDD开发,此书极具影响力,也是笔者最喜欢的软件设计图书之一。对于极限开发(XP),缺乏经验的新手往往会带来过于简单的设计,而一些经验丰富的老手在开发设计中,往往沉浸于技术和设计,带来了过度的开发(Over-engineering),DDD开发介于过度开发和过于简单的开发之间,能为复杂的领域迅速迭代提炼出出色的模型。

    我们有很多人已经使用模式好长时间了,而是否享受到面向对象设计的好处,并不见得。软件的核心是模型,如果在不能表达丰富功能需求的模型上应用模式,将不会有太大成效,往往因为误使了模式而带来开发的泥沼。例如,如果使用模板方法模式解决第12章提出的问题时,则会弄巧成拙。

    本章将给读者分享一些我在面向对象开发设计过程中的经验,虽然这不是本书的重点,但对读者进行OOP开发设计有重要意义,其中有些部分虽然超越了OOP的范畴,但都属于软件开发设计的范畴。

    [1]参见DomainDriven Design:Tackling Complexity in the Heart of Software, Eric Evans,2003,在序言中,作者原话为:“……it has never been formulated clearly, a philosophy has emerged as an undercurrent in the object community, a philosophy I call domaindriven design”。