《软件框架设计的艺术》书评
正如本书作者在序言中问到“仅仅是又多了一本设计书吗?”作者相信本书的存在“自有其必要性”,原因在于本书探讨的设计领域是如此的卓尔不群,却又是Java程序员在开发中必须要面对的问题,那就是框架的设计,API的设计。
我自认为对面向对象设计的掌握已经深入骨髓,对设计模式也算得上了然于胸,可在阅读本书时,我才发现自己所知不过是米粒之珠,对象设计原来还有更加广阔的世界。API设计的不同,已经超出了通常的面向对象设计讨论的范围。API的演化需要考虑的因素,比起一般的接口与类的设计,要更加地复杂与困难。面向对象设计有一个非常重要的原则是“开放-封闭原则(OCP),利用抽象以应对扩展,利用封装以隐藏实现,从而避免修改。这是我们在设计中需要遵循的一条重要法则。但我始终认为,要达成真正的开放与封闭,实则是一种遥不可及的理想,在现实的开发过程中,能做到修改尽量少,扩展尽量容易,就已经不错了。然而,对于一个已经拥有大量用户群体的框架与API而言,则必须追求OCP至极致,否则就会因为实现的不稳定性与版本的不兼容性,而被原有客户抱怨,甚至被抛弃。这正是框架设计与通常的企业应用系统设计最大的不同。
托尔斯泰说过:“幸福的家庭总是相似的,而不幸的家庭则各有各的不幸。”设计亦然。好的设计原则可以放之四海而皆准,而设计的缺陷却各有各的表现特征。本书的最大特点是围绕着NetBeans的开发来说事儿,诉说其渊源、演化与设计的过失。这是真实的实践,不是拿着可笑的玩具项目阐释设计原则的方式所能比拟的。也许它失之于晦涩艰深,但只要你愿意仔细研磨,收获定能远超阅读的付出。不过,如果你是一位Java初学者,那就奉劝你远离此书,它会比“云计算”还要让你云里雾里。或许,你的职业发展目标,应以读懂本书为一个重要的里程碑。当你明白本书讲解的知识时,也许你已经可以驾驭面向对象设计与API设计了。
阅读本书最好能结合NetBeans的源代码一起分析,如此方能领会设计之妙。其实在我看来,这是本书的硬伤。因为作者在讲解设计问题时,实在太罗嗦了。所谓“一图胜千言”,而对于我们这些代码狂热者而言,代码的清晰度远甚于冗长的描述。书中列出的UML图与代码实在太少了,通篇的文字描述让我们在阅读时感觉有些乏味。以我小人之心,会认为本书作者包藏“祸心”,因为本书可以大肆地推广NetBeans,他好像在说“读不懂吗?不明白吗?那快去下载NetBeans啊!”可惜我们必须接受这样的诱惑,因为读懂这本书的内容绝对能够让你的设计能力登上一个大大的台阶。
Rod Johnson的名著Expert One-to-One J2EE Development without EJB,在书名中并未提到Spring,但书中对Spring设计的阐释,也许比任何一本Spring著作都要通透与权威,因为Rod Johnson正是Spring之父。本书的英文名Practical API Design同样没有提到NetBeans,但若要论NetBeans中的设计原则,本书作者Jaroslav Tulach自然是最佳选择,因为他正是NetBeans之父。在JavaLobby对他的采访(人民邮电出版社编辑李松峰在其博客上翻译了这篇采访)中,Jaroslav Tulach提到了写作本书的心路历程:“写这本书的素材我已经收集了10年之久了,因此我知道这本书绝不可能在短时间内写完。自从去年夏天,我表弟促使我下定决心之后,写这本书大概花了整整一年时间,包括整理笔记和修改润色。”可以说,本书事实上是伴随着NetBeans的成长而孕育成熟直至诞生。
本书为我们描绘了API设计的壮丽画卷,这里的景色美不胜收,又仿佛如蒙娜丽莎的微笑那般神秘。在设计的旅途中,我们充满敬畏,却又应保持足够的怀疑,这是我一直以来的阅读态度。本书我已经阅读到了第15章。书中提到的许多设计技巧与原则,让我欣喜不已;然而也有许多讲解让我疑惑。当我发现,为了保证API的向后兼容,不得不牺牲设计上的优雅与美时,这让我有些不快,却又必须无奈地接受现实。还有5章的内容,我就要结束本书的阅读了。然而,这仅仅是开始,因为我对书中许多内容依旧抱有困惑,甚至没能明白个中含义。我还需要阅读第二遍,第三遍……经典的书籍就应该这样阅读。