编辑推荐
《面向对象设计实践指南:Ruby语言描述》一本直接关注Ruby语言面向对象应用程序设计的书籍。对“如何编写更易维护、更易管理、更讨人喜爱,以及功能更为强大的Ruby应用程序”的全面指导。
任何层次的Ruby程序员都能从中汲取有用的知识:初级的Ruby程序员将会找到赖以生存的特定准则,中等水平的Ruby程序员将会找到多条可以根据需要灵活地诠释和应用的有价值的原则,高水平的Ruby程序员则会找到一种共同语言,用以引导开发和指导同事。
内容简介
《面向对象设计实践指南:Ruby语言描述》是对“如何编写更易维护、更易管理、更讨人喜爱且功能更为强大的Ruby应用程序”的全面指导。为帮助读者解决Ruby代码难以更改和不易扩展的问题,作者在书中运用了多种功能强大和实用的面向对象设计技术,并借助大量简单实用的Ruby示例对这些技术进行全面解释。
全书共9章,主要包含的内容有:如何使用面向对象编程技术编写更易于维护和扩展的Ruby代码,单个Ruby类所应包含的内容,避免将应该保持独立的对象交织在一起,在多个对象之间定义灵活的接口,利用鸭子类型减少编程间接成本,合理运用继承,通过组合构建对象,设计出划算的测试,解决不良设计的Ruby代码所导致的常见问题等。
《面向对象设计实践指南:Ruby语言描述》适合所有对面向对象设计和Ruby编程语言感兴趣的程序员阅读参考。
作者简介
Sandi Metz,在处理经历不断变化仍然存活的项目方面,Sandi Metz拥有30年的工作经验。作为杜克大学的一名软件架构师,她每天都坚持编写代码。在杜克大学里,她的团队不断地为许多客户解决大量实际问题。其中,有些客户的应用程序不仅具有规模大和面向对象的特点,而且已演变了15年之久。她全身心投入的工作是用简单实用的方法将有用的软件提取出来。Sandi在Ruby Nation做过演讲,在Gotham Ruby用户大会上也演讲过多次。本书是她做过的关于OO设计的谈话汇集之后的必然成果。
译者简介
张雪平,西南石油大学毕业,模式识别与智能系统专业,硕士研究生。拥有多年高校计算机相关课程的教学经验,热衷于计算机应用软件的开发与研究。现从事石油行业相关软件的研发工作。
彭晓东,西南师范大学毕业,计算机科学与技术专业。10余年来,一直从事高校计算机网络管理、软件开发及教学工作。
内页插图
精彩书评
“这是一部厉害的作品!其描述如此生动活泼,让我再一次发现埋藏在OO原则之下的真相。这些真相都藏匿很深,以致我也忘记了去探究它们。作者的设计思维和对未来的认识尤其具有说服力。”
——Ian McFarland,New Context有限公司总裁
“对于一名自学成才的程序员来说,这是一本对钻研某些OOP概念非常有用的书籍。我显然也需要对那些概念更加熟悉才行。我并不孤独,在工作的时候,总会有这样一种提示在脑中不断地闪现:‘Sandi Metz会怎么做呢?’”
——Jonathan Mukai,Pivotal in NYC
“作者以一丝不苟的务实态度与细腻清晰的表达方式,将那些令人难以捉摸的知识呈现给了迫切需要它的读者。这些解决之道既可作为新手的准则,也可当作有经验专业人士的指导。”
——Katrina Owen,Bengler开发人员
“我相信这是2012年重要的一本Ruby书籍。不仅因为作者100%抓住了要点,而且她还采用了轻松的写作风格,并大量使用类比,让每一个要点都浅显易懂。”
——Avdi Grimm,Exceptional Ruby and Objects on Rails作者
目录
第1章 面向对象设计
1.1 设计赞歌
1.1.1 设计解决的问题
1.1.2 为何难以更改
1.1.3 实用的设计定义
1.2 设计工具
1.2.1 设计原则
1.2.2 设计模式
1.3 设计行为
1.3.1 设计失败
1.3.2 设计时机
1.3.3 设计评
1.4 面向对象编程简介
1.4.1 过程式语言
1.4.2 面向对象语言
1.5 小结
第2章 设计具有单一职责的类
2.1 决定类的内容
2.1.1 将方法分组成类
2.1.2 组织代码以便于更改
2.2 创建具有单一职责的类
2.2.1 示例程序:自行车和齿轮
2.2.2 为何单一职责原则很重要
2.2.3 确定一个类是否具有单一职责
2.2.4 确定何时做出设计决策
2.3 编写拥抱变化的代码
2.3.1 要依赖行为,不依赖数据
2.3.2 全面推行单一职责原则
2.4 最后是真实的轮子需求
2.5 小结
第3章 管理依赖关系
3.1 理解依赖关系
3.1.1 认识依赖关系
3.1.2 对象间的耦合
3.1.3 其他依赖关系
3.2 编写松耦合的代码
3.2.1 注入依赖关系
3.2.2 隔离依赖关系
3.2.3 移除参数顺序依赖关系
3.3 管理依赖方向
3.3.1 反转依赖关系
3.3.2 选择依赖方向
3.4 小结
第4章 创建灵活的接口
4.1 理解接口
4.2 定义接口
4.2.1 公共接口
4.2.2 私有接口
4.2.3 职责、依赖关系和接口
4.3 找出公共接口
4.3.1 示例程序:自行车旅游公司
4.3.2 构建意图
4.3.3 使用时序图
4.3.4 请询问"要什么",别告知"如何做"
4.3.5 寻求上下文独立
4.3.6 信任其他对象
4.3.7 使用消息来发现对象
4.3.8 创建基于消息的应用程序
4.4 编写能展现其(内在)最好面的代码
4.4.1 创建显式接口
4.4.2 善用其他类的公共接口
4.4.3 避免依赖私有接口
4.4.4 最小化上下文
4.5 迪米特法则
4.5.1 定义迪米特法则
4.5.2 违规的后果
4.5.3 避免违规
4.5.4 听从迪米特法则
4.6 小结
第5章 使用鸭子类型技术降低成本
5.1 理解鸭子类型
5.1.1 鸭子类型概述
5.1.2 让问题复杂些
5.1.3 发现鸭子类型
5.1.4 鸭子类型的后果
5.2 编写依赖于鸭子类型的代码
5.2.1 识别出隐藏的鸭子类型
5.2.2 信任你的鸭子类型
5.2.3 记录好鸭子类型
5.2.4 在鸭子类型之间共享代码
5.2.5 合理选择鸭子类型
5.3 克服对鸭子类型的恐惧
5.3.1 使用静态类型颠覆鸭子类型
5.3.2 静态类型与动态类型
5.3.3 拥抱动态类型
5.4 小结
第6章 通过继承获得行为
6.1 理解经典的继承
6.2 弄清使用继承的地方
6.2.1 从一个具体类开始
6.2.2 嵌入多种类型
6.2.3 找出嵌入的类型
6.2.4 选择继承
6.2.5 描绘出继承关系
6.3 误用继承
6.4 找出抽象
6.4.1 创建抽象父类
6.4.2 提升抽象行为
6.4.3 从具体分离出抽象
6.4.4 使用模板方法模式
6.4.5 实现所有模板方法
6.5 管理父类与子类之间的耦合
6.5.1 理解耦合
6.5.2 使用钩子消息解耦子类
6.6 小结
第7章 使用模块共享角色行为
7.1 理解角色
7.1.1 找出角色
7.1.2 组织职责
7.1.3 删除不必要的依赖关系
7.1.4 编写具体代码
7.1.5 提取抽象
7.1.6 查找方法
7.1.7 继承角色行为
7.2 编写可继承的代码
7.2.1 识别出反模式
7.2.2 坚持抽象
7.2.3 重视契约
7.2.4 使用模板方法模式
7.2.5 预先将类解耦
7.2.6 创建浅层结构
7.3 小结
第8章 组合对象
8.1 Parts组合成Bicycle
8.1.1 更新Bicycle类
8.1.2 创建Parts层次结构
8.2 组合成Parts对象
8.2.1 创建Part
8.2.2 让Parts对象更像一个数组
8.3 制造Parts
8.3.1 创建PartsFactory
8.3.2 借助PartsFactory
8.4 组合成Bicycle
8.5 继承和组合的抉择
8.5.1 接受继承带来的后果
8.5.2 接受组合带来的后果
8.5.3 选择关系
8.6 小结
第9章 设计最划算的测试
9.1 意图测试
9.1.1 了解测试的意图
9.1.2 了解测试的内容
9.1.3 了解测试的时机
9.1.4 了解测试的方法
9.2 测试输入消息
9.2.1 删除未使用的接口
9.2.2 证明公共接口
9.2.3 隔离测试对象
9.2.4 注入使用类的依赖关系
9.2.5 将依赖关系注入成角色
9.3 测试私有方法
9.3.1 在测试过程中忽略私有方法
9.3.2 从测试类里移除私有方法
9.3.3 选择测试私有方法
9.4 测试输出消息
9.4.1 忽略查询消息
9.4.2 证明命令消息
9.5 测试鸭子类型
9.5.1 测试角色
9.5.2 用角色测试验证测试替身
9.6 测试继承代码
9.6.1 指定继承接口
9.6.2 指定子类责任
9.6.3 测试独特行为
9.7 小结
后记
前言/序言
面向对象设计实践指南:Ruby语言描述 引言 在软件开发的广阔领域中,面向对象设计(Object-Oriented Design, OOD)已成为构建复杂、可维护、可扩展系统的基石。它提供了一套强大的原则和模式,帮助开发者理解和组织代码,使其更贴近现实世界的模型。本书《面向对象设计实践指南:Ruby语言描述》并非空泛地罗列理论,而是深入实践,以Ruby语言为载体,为读者提供一条清晰、可操作的学习路径,掌握面向对象设计的精髓,并能将其灵活应用于实际开发中。 本书旨在成为您在面向对象设计旅程中的一位得力伙伴,为您揭示那些使得优秀代码得以诞生的核心思想和策略。我们不追求理论的晦涩难懂,而是致力于将抽象的概念转化为生动的编程实践,让您在理解“为什么”的同时,也能熟练掌握“怎么做”。Ruby语言以其优雅的语法、富有表现力的特性以及强大的元编程能力,为阐释面向对象设计提供了绝佳的平台。通过Ruby,我们将能够更直观地感受封装、继承、多态等核心概念,并深入理解设计模式的实际应用。 核心内容概览 本书的内容将围绕以下几个核心主题展开,循序渐进地引导读者构建扎实的面向对象设计功底: 第一部分:面向对象设计的基石 理解对象与类: 这一部分将从最基础的概念出发,清晰地阐述对象(Object)和类(Class)在面向对象编程中的作用。我们将深入探讨类的定义、对象的创建、属性(Attributes)和方法(Methods)的封装,以及实例变量(Instance Variables)和类变量(Class Variables)的用途。通过Ruby的实例,读者将能直观地理解如何将现实世界的概念映射到代码中的对象和类。 封装:数据与行为的融合: 封装是面向对象的核心原则之一。本书将详细解释封装的目的,即隐藏对象的内部实现细节,并通过公共接口(Public Interface)来暴露必要的功能。我们将探讨访问控制(Access Control)的策略,以及如何通过 getter 和 setter 方法来安全地访问和修改对象的属性。Ruby的各种访问修饰符(如 `public`, `protected`, `private`)将被详细讲解,并结合实际代码示例,展示如何有效地运用封装来提高代码的稳定性和可维护性。 继承:代码的复用与扩展: 继承允许创建新的类(子类)来继承现有类(父类)的属性和行为,从而实现代码的复用和功能的扩展。本书将深入讲解继承的机制,包括单继承与多重继承的区别(以及Ruby如何通过Mixins解决多重继承的问题),`super` 关键字的用法,以及如何利用继承来构建具有层次结构的对象模型。我们将通过大量的Ruby代码示例,展示如何设计合理的继承体系,避免代码冗余,并使系统更易于扩展。 多态:统一接口下的多样化实现: 多态是面向对象设计的另一项强大特性,它允许使用一个统一的接口来处理不同类型的对象。本书将重点阐述多态的概念,包括编译时多态(方法重载,虽然Ruby原生支持度不高,但可以通过元编程等方式实现)和运行时多态(方法覆盖,即子类重写父类方法)。我们将深入分析多态如何提高代码的灵活性和可读性,并通过Ruby的鸭子类型(Duck Typing)特性,展示如何在动态类型语言中实现强大的多态性。 第二部分:面向对象设计的核心原则(SOLID) SOLID 原则是面向对象设计的“圣经”,是构建健壮、可维护、可扩展软件的关键。本书将逐一深入解析这五个原则,并结合Ruby语言的特点,提供丰富的实践指导。 单一职责原则(Single Responsibility Principle, SRP): 一个类应该只有一个引起它变化的原因。我们将探讨如何识别类的职责,以及如何通过职责的划分来避免“万能类”的出现,从而提高类的内聚性。 开放-封闭原则(Open/Closed Principle, OCP): 软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。本书将重点讲解如何通过抽象、继承和多态等技术来实现这一原则,使系统在增加新功能时,无需修改现有代码。 里氏替换原则(Liskov Substitution Principle, LSP): 子类型必须能够替换掉它们的基类型,而程序的行为不会因此发生改变。我们将深入分析LSP的重要性,以及如何设计子类以满足这一原则,避免出现“is-a”关系下的行为不一致。 接口隔离原则(Interface Segregation Principle, ISP): 客户端不应该被强迫依赖于它们不使用的方法。本书将重点讲解如何创建更精细的接口,避免臃肿的接口设计,从而降低耦合度。 依赖倒置原则(Dependency Inversion Principle, DIP): 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。低层模块对抽象的依赖应该与高层模块的抽象保持一致。我们将深入探讨如何利用抽象(如模块、接口)来解耦,使系统更易于替换和测试。 第三部分:设计模式在Ruby中的应用 设计模式是针对软件设计中常见问题的成熟解决方案。本书将聚焦于一些最常用、最核心的设计模式,并通过Ruby语言的特性,展示它们如何优雅地实现。 创建型模式(Creational Patterns): 工厂模式(Factory Pattern): 封装对象的创建过程,使客户端代码无需关心具体类的实例化。我们将展示如何使用Ruby的类方法或模块来构建各种工厂。 单例模式(Singleton Pattern): 确保一个类只有一个实例,并提供一个全局访问点。我们将探讨Ruby中实现单例的常用方法,例如使用 `Singleton` 模块。 建造者模式(Builder Pattern): 分步创建复杂对象,允许同一创建过程创建不同表示。 结构型模式(Structural Patterns): 适配器模式(Adapter Pattern): 允许不兼容的接口之间协同工作。我们将展示如何使用Ruby的模块或类来创建适配器。 装饰器模式(Decorator Pattern): 动态地给一个对象添加一些额外的职责。我们将深入讲解Ruby的Mixins如何优雅地实现装饰器模式。 外观模式(Facade Pattern): 提供一个统一的接口,用于隐藏一系列子系统的复杂性。 行为型模式(Behavioral Patterns): 策略模式(Strategy Pattern): 定义一系列算法,将每一个算法封装起来,并使它们可以互换。我们将重点讲解Ruby的块(Blocks)和 Proc 如何简洁地实现策略模式。 观察者模式(Observer Pattern): 定义对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。Ruby的 `observable` 模块将是讲解的重点。 模板方法模式(Template Method Pattern): 在父类中定义一个算法的骨架,允许子类在不改变算法结构的前提下,重新定义算法的某些特定步骤。 第四部分:Ruby语言的面向对象特性与实践 Ruby语言本身就充满了面向对象的思想,并且提供了许多强大的特性来支持面向对象的设计。 Mixins 与模块(Modules): Ruby通过 Mixins(通过 `include` 或 `extend` 关键字)实现了代码的复用和接口的共享,这与许多其他语言中的多重继承有着异曲同工之妙,但更加灵活安全。我们将深入讲解模块的作用,以及如何利用它们来实现代码的组织和模式的复用。 元编程(Metaprogramming): Ruby强大的元编程能力允许在运行时动态地修改类的定义、创建方法等。本书将介绍如何运用元编程来简化代码,实现更高级的设计模式,并提升代码的灵活性。 鸭子类型(Duck Typing): Ruby的鸭子类型是其面向对象特性的重要体现,它强调“如果它能像鸭子一样叫,像鸭子一样走路,那么它就是一只鸭子”,即关注对象的行为而非其类型。我们将深入探讨鸭子类型如何影响我们的设计,以及如何有效地利用它来编写更具弹性的代码。 Ruby 中的 DSL(Domain-Specific Languages): Ruby的语法特性使得创建领域特定语言(DSL)变得相对容易。本书将探讨如何利用面向对象的设计原则来构建易于阅读和使用的DSL,从而提高开发效率。 第五部分:面向对象设计的进阶话题与最佳实践 在掌握了基础和核心原则之后,本书还将引导读者探索更深入的话题,以及在实际开发中应该遵循的最佳实践。 测试驱动开发(Test-Driven Development, TDD)与面向对象设计: 我们将探讨 TDD 如何与面向对象设计相辅相成,如何编写可测试的面向对象代码,以及单元测试在验证设计原则和模式方面的作用。 重构(Refactoring)与设计改进: 软件设计是一个持续演进的过程。本书将提供关于如何识别代码中的设计缺陷,并运用重构技术来改进现有设计的指导,使其更符合面向对象的设计原则。 面向对象设计中的常见陷阱与避免策略: 总结在面向对象设计过程中可能遇到的常见问题,例如过度设计、耦合过紧、职责不清等,并提供相应的解决方案和避免策略。 Ruby 项目中的实际应用案例分析: 通过分析一些开源Ruby项目或虚构的实际应用场景,演示如何将本书所学的面向对象设计原则和模式应用于解决真实世界的开发挑战。 本书特色 Ruby 语言驱动: 全书以 Ruby 语言为载体,所有概念和模式都通过实际的、可运行的代码示例来阐述,让读者在动手实践中学习。 理论与实践并重: 既讲解了面向对象设计背后的核心理论和原则,又深入探讨了如何在 Ruby 中进行具体实现,避免理论脱离实践。 循序渐进的学习曲线: 内容从基础概念到高级主题,逐步深入,适合不同水平的 Ruby 开发者。 强调“为什么”和“怎么做”: 不仅仅是介绍“是什么”,更注重解释“为什么”要这样做,以及“怎么做”才能做得更好。 贴近实际开发: 关注解决实际开发中遇到的问题,提供可操作的建议和最佳实践。 目标读者 本书适合所有希望提升软件设计能力的 Ruby 开发者,包括: 初学者,希望系统学习面向对象设计的核心概念和原则。 有一定经验的开发者,希望深入理解面向对象设计模式,并在 Ruby 项目中更有效地应用。 对编写高质量、可维护、可扩展代码有追求的工程师。 任何对 Ruby 语言的面向对象特性感兴趣并希望深入探索的开发者。 结语 面向对象设计并非一蹴而就的技能,它需要持续的学习、实践和反思。《面向对象设计实践指南:Ruby语言描述》将陪伴您在这条探索之路上,为您提供坚实的理论基础、丰富的实践经验和清晰的行动指南。我们相信,通过本书的学习,您将能够设计出更优雅、更健壮、更具生命力的 Ruby 程序。让我们一起,用面向对象设计的智慧,构建更美好的软件世界。