重构:Ruby版

重构:Ruby版
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者: [美] ,
2010-04
版次: 1
ISBN: 9787111300786
定价: 49.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 294页
正文语种: 简体中文
47人买过
  •   本书是一本专门为职业Ruby程序员编写的重构指导。它的目标是向你展示如何以一种既受到严格控制又高效的方式进行重构。你将学习到不在代码中引入bug并能按部就班改进结构的重构方式。本书的主要内容:第1章指出重构是什么;第2章讨论进行重构的理由;第3章指出需要进行重构的信号;第4章讨论测试在重构中扮演的重要角色;第5章~第12章介绍了重构花名册,它包含了在重构领域里到目前为止的成果。当需要进行某项任务时,这份花名册可以手把手地提醒我们安全的做法。
      本书是对MartinFowler的经典权威著作《重构》的重大更新版,并以Ruby为例彻底重写——并非只是把代码从Java版中搬过来而已。
      书中给出了一份详细的重构花名册,包含超过70条经过锤炼的Ruby重构技术,每一条都有详细指引、使用细节和范例代码。其中很多重构技术都用到了Ruby专有的强大特性,你可以从华章网站下载到全部代码。
      作者借用Fowler最初的想法,展示了如何以一种受控、高效以及迭代的方式进行重构,帮助你有条不紊地改善代码的质量而不会引入新的bug。不论是编写还是维护Ruby代码,本书都将是不可或缺的重要参考。
      本书内容
      理解重构的核心原则,以及进行重构的原因
      发现Ruby代码中的“坏味道”
      逐步将糟糕的设计转变成设计精良的代码
      构建测试以便保证重构正确进行
      理解重构中的难点以及克服的办法
      编写正确包装代码的方法
      在对象之间移动特性,将其放在最适合的地方
      将数据组织成更容易处理的形式
      简化条件表达式,更高效地利用多态
      创建更易于理解和使用的接口
      进行大型重构,这将可能影响整个软件系统数月乃至数年
      成功重构RubyonRails代码   JayFields是DRWTrading公司的一名软件程序员,也是一位研讨会的常客。Jay对发现和成熟化创新式解决方案总是抱有激情。
      ShaneHarvie在美国、印度和澳大利亚等国的敏捷公司中从事软件开发工作。他现在位于芝加哥的DRWTrading公司工作。
      MartinFowler是ThoughtWorks公司的首席科学家,他是一位作家、演说家和咨询师,经常在软件开发活动中发表演讲。他关注的是企业软件设计——诸如什么能产生良好的设计,而良好的设计,而良好的设计有需要哪些实践等。他是面向对象技术、重构、模式、敏捷方法论、领域建模、统一建模语言(UML)和极限编程的先行者。近十年来他一直在ThoughtWorks公司工作,这是一家非常出色的系统开发赫咨询公司。 译者序

    前言
    致谢
    第1章重构初体验
    1.1起点
    1.1.1Movie
    1.1.2Rental
    1.1.3Customer
    1.1.4对起始程序的评价
    1.2重构第一步
    1.3Statement方法的分解和再组合
    1.3.1移动Amount的计算
    1.3.2提炼常客积分的计算
    1.3.3移除临时变量
    1.4用多态替换价格代码中的条件逻辑
    1.5小结

    第2章重构的基本原理
    2.1重构的起源
    2.2重构的定义
    2.3重构的理由
    2.3.1重构可以改进软件的设计
    2.3.2重构让软件变得易于理解
    2.3.3重构可以帮助你发现bug
    2.3.4重构可以帮助你更快地编程
    2.4重构的时机
    2.4.1事不过三
    2.4.2在添加功能时重构
    2.4.3在需要修复bug时重构
    2.4.4在进行代码复审时重构
    2.4.5为了更好地理解而重构(或者说,向着同一个目标进行重构)
    2.5为什么重构能起作用
    2.6我怎么跟经理说
    2.7抽象和重构
    2.8重构的问题
    2.8.1改变接口
    2.8.2数据库
    2.8.3难以重构的设计变化
    2.8.4什么时候不应该重构
    2.9重构和设计
    2.10竹篮打水一场空
    2.11重构和性能
    2.12优化薪资系统

    第3章代码里的坏味道
    3.1重复代码
    3.2方法过长
    3.3类太大
    3.4参数列表太长
    3.5发散型变化
    3.6霰弹型修改
    3.7特性依赖
    3.8数据泥团
    3.9基本类型偏执
    3.10case语句
    3.11平行继承体系
    3.12冗赘类
    3.13纯臆测的泛化
    3.14临时字段
    3.15消息链
    3.16中间人
    3.17过分亲密
    3.18异曲同工的类
    3.19不完善的类库
    3.20数据类
    3.21被拒绝的遗赠
    3.22注释
    3.23狂热的元编程
    3.24脱节的API
    3.25不断重复的样板文本

    第4章构建测试
    4.1自我测试代码的价值
    4.2Test∷Unit测试框架
    4.3程序员测试和质量保证测试
    4.4添加更多的测试

    第5章重构花名册
    5.1重构的格式
    5.2查找引用

    第6章组织方法
    6.1提炼方法
    6.1.1动机
    6.1.2手法
    6.1.3示例:没有局部变量
    6.1.4示例:使用局部变量
    6.1.5示例:重新给局部变量赋值
    6.2内联化方法
    6.2.1动机
    6.2.2手法
    6.3内联化临时变量
    6.3.1动机
    6.3.2手法
    6.4使用查询替换临时变量
    6.4.1动机
    6.4.2手法
    6.4.3示例
    6.5使用链式调用替换临时变量
    6.5.1动机
    6.5.2手法
    6.5.3示例
    6.6引入解释性变量
    6.6.1动机
    6.6.2手法
    6.6.3示例
    6.6.4采用提炼方法的手法
    6.7分解临时变量
    6.7.1动机
    6.7.2手法
    6.7.3示例
    6.8移除对参数赋值
    6.8.1动机
    6.8.2手法
    6.8.3示例
    6.9使用方法对象替换方法
    6.9.1动机
    6.9.2手法
    6.9.3示例
    6.10替换算法
    6.10.1动机
    6.10.2手法
    6.11使用集合闭包方法替换循环
    6.11.1动机
    6.11.2手法
    6.11.3示例
    6.12提炼环绕方法
    6.12.1动机
    6.12.2手法
    6.12.3示例
    6.13引入类标注
    6.13.1动机
    6.13.2手法
    6.13.3示例
    6.14引入命名参数
    6.14.1动机
    6.14.2手法
    6.14.3示例1:命名全部参数
    6.14.4示例2:只命名可选参数
    6.15移除命名参数
    6.15.1动机
    6.15.2手法
    6.15.3示例
    6.16移除未使用的默认参数
    6.16.1动机
    6.16.2手法
    6.16.3示例
    6.17动态方法定义
    6.17.1动机
    6.17.2手法
    6.17.3示例:通过def_each来定义相似的方法
    6.17.4instance_exec方法
    6.17.5示例:用类标注来定义实例方法
    6.17.6示例:通过扩展一个动态定义的模块来定义方法
    6.18使用动态方法定义替换动态接收器
    6.18.1动机
    6.18.2手法
    6.18.3示例:不用method_missing进行动态委托
    6.18.4示例:使用自定义数据来定义方法
    6.19隔离动态接收器
    6.19.1动机
    6.19.2手法
    6.19.3示例
    6.20把计算从运行时移到解析时
    6.20.1动机
    6.20.2手法

    第7章在对象之间移动特性
    7.1移动方法
    7.1.1动机
    7.1.2手法
    7.1.3示例
    7.2移动字段
    7.2.1动机
    7.2.2手法
    7.2.3示例
    7.2.4示例:使用自封装
    7.3提炼类
    7.3.1动机
    7.3.2手法
    7.3.3示例
    7.4内联化类
    7.4.1动机
    7.4.2手法
    7.4.3示例
    7.5隐藏委托
    7.5.1动机
    7.5.2手法
    7.5.3示例
    7.6移除中间人
    7.6.1动机
    7.6.2手法
    7.6.3示例

    第8章组织数据
    8.1自封装字段
    8.1.1动机
    8.1.2手法
    8.1.3示例
    8.2使用对象替换数据值
    8.2.1动机
    8.2.2手法
    8.2.3示例
    8.3将值对象改为引用对象
    8.3.1动机
    8.3.2手法
    8.3.3示例
    8.4将引用对象改为值对象
    8.4.1动机
    8.4.2手法
    8.4.3示例
    8.5使用对象替换数组
    8.5.1动机
    8.5.2手法
    8.5.3示例
    8.5.4使用Deprecation进行重构
    8.6使用对象替换Hash
    8.6.1动机
    8.6.2手法
    8.6.3示例
    8.7将单向关联改为双向关联
    8.7.1动机
    8.7.2手法
    8.7.3示例
    8.8将双向关联改为单向关联
    8.8.1动机
    8.8.2手法
    8.8.3示例
    8.9使用符号常数代替魔法数
    8.9.1动机
    8.9.2手法
    8.10封装集合
    8.10.1动机
    8.10.2手法
    8.10.3示例
    8.10.4将行为移入类里
    8.11使用数据类替换记录
    8.11.1动机
    8.11.2手法
    8.12使用多态替换类型码
    8.12.1动机
    8.12.2移除条件逻辑
    8.12.3手法
    8.12.4示例
    8.13使用模块扩展替换类型码
    8.13.1动机
    8.13.2手法
    8.13.3示例
    8.14使用状态或策略模式替换类型码
    8.14.1动机
    8.14.2手法
    8.14.3示例
    8.15使用字段替换子类
    8.15.1动机
    8.15.2手法
    8.15.3示例
    8.16惰性初始化的属性
    8.16.1动机
    8.16.2手法
    8.16.3以II=为例
    8.16.4以instance-variable_defined?为例
    8.17及早初始化的属性
    8.17.1动机
    8.17.2讨论
    8.17.3手法
    8.17.4示例

    第9章简化条件表达式
    9.1分解条件语句
    9.1.1动机
    9.1.2手法
    9.1.3示例
    9.2重组条件语句
    9.2.1动机
    9.2.2示例:使用“0r”赋值替换=三元操作符
    9.2.3示例:使用显式返回替换条件语句
    9.3合并条件表达式
    9.3.1动机
    9.3.2手法
    9.3.3示例:Ors
    9.3.4示例:Ands
    9.4合并重复的条件片段
    9.4.1动机
    9.4.2手法
    9.4.3示例
    9.5移除控制位
    9.5.1动机
    9.5.2手法
    9.5.3示例:使用break替换简单的控制位
    9.5.4示例:返回控制位的结果
    9.6使用守卫子句替换嵌套条件语句
    ……
    第10章简化方法调用
    第11章处理通用化
    第12章大型重构
    第13章总结
    参考文献
    重构手法列表
  • 内容简介:
      本书是一本专门为职业Ruby程序员编写的重构指导。它的目标是向你展示如何以一种既受到严格控制又高效的方式进行重构。你将学习到不在代码中引入bug并能按部就班改进结构的重构方式。本书的主要内容:第1章指出重构是什么;第2章讨论进行重构的理由;第3章指出需要进行重构的信号;第4章讨论测试在重构中扮演的重要角色;第5章~第12章介绍了重构花名册,它包含了在重构领域里到目前为止的成果。当需要进行某项任务时,这份花名册可以手把手地提醒我们安全的做法。
      本书是对MartinFowler的经典权威著作《重构》的重大更新版,并以Ruby为例彻底重写——并非只是把代码从Java版中搬过来而已。
      书中给出了一份详细的重构花名册,包含超过70条经过锤炼的Ruby重构技术,每一条都有详细指引、使用细节和范例代码。其中很多重构技术都用到了Ruby专有的强大特性,你可以从华章网站下载到全部代码。
      作者借用Fowler最初的想法,展示了如何以一种受控、高效以及迭代的方式进行重构,帮助你有条不紊地改善代码的质量而不会引入新的bug。不论是编写还是维护Ruby代码,本书都将是不可或缺的重要参考。
      本书内容
      理解重构的核心原则,以及进行重构的原因
      发现Ruby代码中的“坏味道”
      逐步将糟糕的设计转变成设计精良的代码
      构建测试以便保证重构正确进行
      理解重构中的难点以及克服的办法
      编写正确包装代码的方法
      在对象之间移动特性,将其放在最适合的地方
      将数据组织成更容易处理的形式
      简化条件表达式,更高效地利用多态
      创建更易于理解和使用的接口
      进行大型重构,这将可能影响整个软件系统数月乃至数年
      成功重构RubyonRails代码
  • 作者简介:
      JayFields是DRWTrading公司的一名软件程序员,也是一位研讨会的常客。Jay对发现和成熟化创新式解决方案总是抱有激情。
      ShaneHarvie在美国、印度和澳大利亚等国的敏捷公司中从事软件开发工作。他现在位于芝加哥的DRWTrading公司工作。
      MartinFowler是ThoughtWorks公司的首席科学家,他是一位作家、演说家和咨询师,经常在软件开发活动中发表演讲。他关注的是企业软件设计——诸如什么能产生良好的设计,而良好的设计,而良好的设计有需要哪些实践等。他是面向对象技术、重构、模式、敏捷方法论、领域建模、统一建模语言(UML)和极限编程的先行者。近十年来他一直在ThoughtWorks公司工作,这是一家非常出色的系统开发赫咨询公司。
  • 目录:
    译者序

    前言
    致谢
    第1章重构初体验
    1.1起点
    1.1.1Movie
    1.1.2Rental
    1.1.3Customer
    1.1.4对起始程序的评价
    1.2重构第一步
    1.3Statement方法的分解和再组合
    1.3.1移动Amount的计算
    1.3.2提炼常客积分的计算
    1.3.3移除临时变量
    1.4用多态替换价格代码中的条件逻辑
    1.5小结

    第2章重构的基本原理
    2.1重构的起源
    2.2重构的定义
    2.3重构的理由
    2.3.1重构可以改进软件的设计
    2.3.2重构让软件变得易于理解
    2.3.3重构可以帮助你发现bug
    2.3.4重构可以帮助你更快地编程
    2.4重构的时机
    2.4.1事不过三
    2.4.2在添加功能时重构
    2.4.3在需要修复bug时重构
    2.4.4在进行代码复审时重构
    2.4.5为了更好地理解而重构(或者说,向着同一个目标进行重构)
    2.5为什么重构能起作用
    2.6我怎么跟经理说
    2.7抽象和重构
    2.8重构的问题
    2.8.1改变接口
    2.8.2数据库
    2.8.3难以重构的设计变化
    2.8.4什么时候不应该重构
    2.9重构和设计
    2.10竹篮打水一场空
    2.11重构和性能
    2.12优化薪资系统

    第3章代码里的坏味道
    3.1重复代码
    3.2方法过长
    3.3类太大
    3.4参数列表太长
    3.5发散型变化
    3.6霰弹型修改
    3.7特性依赖
    3.8数据泥团
    3.9基本类型偏执
    3.10case语句
    3.11平行继承体系
    3.12冗赘类
    3.13纯臆测的泛化
    3.14临时字段
    3.15消息链
    3.16中间人
    3.17过分亲密
    3.18异曲同工的类
    3.19不完善的类库
    3.20数据类
    3.21被拒绝的遗赠
    3.22注释
    3.23狂热的元编程
    3.24脱节的API
    3.25不断重复的样板文本

    第4章构建测试
    4.1自我测试代码的价值
    4.2Test∷Unit测试框架
    4.3程序员测试和质量保证测试
    4.4添加更多的测试

    第5章重构花名册
    5.1重构的格式
    5.2查找引用

    第6章组织方法
    6.1提炼方法
    6.1.1动机
    6.1.2手法
    6.1.3示例:没有局部变量
    6.1.4示例:使用局部变量
    6.1.5示例:重新给局部变量赋值
    6.2内联化方法
    6.2.1动机
    6.2.2手法
    6.3内联化临时变量
    6.3.1动机
    6.3.2手法
    6.4使用查询替换临时变量
    6.4.1动机
    6.4.2手法
    6.4.3示例
    6.5使用链式调用替换临时变量
    6.5.1动机
    6.5.2手法
    6.5.3示例
    6.6引入解释性变量
    6.6.1动机
    6.6.2手法
    6.6.3示例
    6.6.4采用提炼方法的手法
    6.7分解临时变量
    6.7.1动机
    6.7.2手法
    6.7.3示例
    6.8移除对参数赋值
    6.8.1动机
    6.8.2手法
    6.8.3示例
    6.9使用方法对象替换方法
    6.9.1动机
    6.9.2手法
    6.9.3示例
    6.10替换算法
    6.10.1动机
    6.10.2手法
    6.11使用集合闭包方法替换循环
    6.11.1动机
    6.11.2手法
    6.11.3示例
    6.12提炼环绕方法
    6.12.1动机
    6.12.2手法
    6.12.3示例
    6.13引入类标注
    6.13.1动机
    6.13.2手法
    6.13.3示例
    6.14引入命名参数
    6.14.1动机
    6.14.2手法
    6.14.3示例1:命名全部参数
    6.14.4示例2:只命名可选参数
    6.15移除命名参数
    6.15.1动机
    6.15.2手法
    6.15.3示例
    6.16移除未使用的默认参数
    6.16.1动机
    6.16.2手法
    6.16.3示例
    6.17动态方法定义
    6.17.1动机
    6.17.2手法
    6.17.3示例:通过def_each来定义相似的方法
    6.17.4instance_exec方法
    6.17.5示例:用类标注来定义实例方法
    6.17.6示例:通过扩展一个动态定义的模块来定义方法
    6.18使用动态方法定义替换动态接收器
    6.18.1动机
    6.18.2手法
    6.18.3示例:不用method_missing进行动态委托
    6.18.4示例:使用自定义数据来定义方法
    6.19隔离动态接收器
    6.19.1动机
    6.19.2手法
    6.19.3示例
    6.20把计算从运行时移到解析时
    6.20.1动机
    6.20.2手法

    第7章在对象之间移动特性
    7.1移动方法
    7.1.1动机
    7.1.2手法
    7.1.3示例
    7.2移动字段
    7.2.1动机
    7.2.2手法
    7.2.3示例
    7.2.4示例:使用自封装
    7.3提炼类
    7.3.1动机
    7.3.2手法
    7.3.3示例
    7.4内联化类
    7.4.1动机
    7.4.2手法
    7.4.3示例
    7.5隐藏委托
    7.5.1动机
    7.5.2手法
    7.5.3示例
    7.6移除中间人
    7.6.1动机
    7.6.2手法
    7.6.3示例

    第8章组织数据
    8.1自封装字段
    8.1.1动机
    8.1.2手法
    8.1.3示例
    8.2使用对象替换数据值
    8.2.1动机
    8.2.2手法
    8.2.3示例
    8.3将值对象改为引用对象
    8.3.1动机
    8.3.2手法
    8.3.3示例
    8.4将引用对象改为值对象
    8.4.1动机
    8.4.2手法
    8.4.3示例
    8.5使用对象替换数组
    8.5.1动机
    8.5.2手法
    8.5.3示例
    8.5.4使用Deprecation进行重构
    8.6使用对象替换Hash
    8.6.1动机
    8.6.2手法
    8.6.3示例
    8.7将单向关联改为双向关联
    8.7.1动机
    8.7.2手法
    8.7.3示例
    8.8将双向关联改为单向关联
    8.8.1动机
    8.8.2手法
    8.8.3示例
    8.9使用符号常数代替魔法数
    8.9.1动机
    8.9.2手法
    8.10封装集合
    8.10.1动机
    8.10.2手法
    8.10.3示例
    8.10.4将行为移入类里
    8.11使用数据类替换记录
    8.11.1动机
    8.11.2手法
    8.12使用多态替换类型码
    8.12.1动机
    8.12.2移除条件逻辑
    8.12.3手法
    8.12.4示例
    8.13使用模块扩展替换类型码
    8.13.1动机
    8.13.2手法
    8.13.3示例
    8.14使用状态或策略模式替换类型码
    8.14.1动机
    8.14.2手法
    8.14.3示例
    8.15使用字段替换子类
    8.15.1动机
    8.15.2手法
    8.15.3示例
    8.16惰性初始化的属性
    8.16.1动机
    8.16.2手法
    8.16.3以II=为例
    8.16.4以instance-variable_defined?为例
    8.17及早初始化的属性
    8.17.1动机
    8.17.2讨论
    8.17.3手法
    8.17.4示例

    第9章简化条件表达式
    9.1分解条件语句
    9.1.1动机
    9.1.2手法
    9.1.3示例
    9.2重组条件语句
    9.2.1动机
    9.2.2示例:使用“0r”赋值替换=三元操作符
    9.2.3示例:使用显式返回替换条件语句
    9.3合并条件表达式
    9.3.1动机
    9.3.2手法
    9.3.3示例:Ors
    9.3.4示例:Ands
    9.4合并重复的条件片段
    9.4.1动机
    9.4.2手法
    9.4.3示例
    9.5移除控制位
    9.5.1动机
    9.5.2手法
    9.5.3示例:使用break替换简单的控制位
    9.5.4示例:返回控制位的结果
    9.6使用守卫子句替换嵌套条件语句
    ……
    第10章简化方法调用
    第11章处理通用化
    第12章大型重构
    第13章总结
    参考文献
    重构手法列表
查看详情
系列丛书 / 更多
重构:Ruby版
PHP和MySQL Web开发(原书第4版):PHP and MySQL Web Development, Fourth Edition
[澳]Luke、[澳]Luke Welling 著;武欣 译
重构:Ruby版
Objective-C 2.0程序设计
[美]科施恩 著;张波 译
重构:Ruby版
软件测试实用技术与常用模板
李龙 著
重构:Ruby版
OpenGL编程指南(原书第7版)
[美]施瑞奈尔 著;李军 译
重构:Ruby版
PHP和MySQL Web开发
威利、武欣 著
重构:Ruby版
Windows高级调试
[美]赫瓦特 著;聂雪军 译
重构:Ruby版
测试驱动的面向对象软件开发
[美]弗里曼、[美]普雷斯 著;王海鹏 译
重构:Ruby版
成功的软件开发(原书第2版)
多纳尔德森 编;刘列励 译
重构:Ruby版
PHP和MySQL Web应用开发核心技术
温施耐德 著
重构:Ruby版
测试驱动的JavaScript开发
[美]Christian Johansen 著;赵勇 译
重构:Ruby版
Windows并发编程指南
[美]杜飞(Duffy J.) 著;聂雪军 译
重构:Ruby版
自动化软件测试实施指南
[美]达斯汀、[美]加瑞特、[美]高夫 著;余昭辉 译
您可能感兴趣 / 更多
重构:Ruby版
孩子,把你的手给我1:怎么说孩子才爱听,怎么教孩子才肯学?帮助每一位3-12岁孩子的父母结束与孩子的所有冲突!
[美]海姆·G.吉诺特
重构:Ruby版
怎样做成大事
[美]丹·加德纳(Dan Gardner) 著;贾拥民 译;湛庐文化 出品;[丹麦]傅以斌(Bent Flyvbjerg)
重构:Ruby版
1200年希腊罗马神话
[美]伊迪丝·汉密尔顿
重构:Ruby版
爱情心理学(新编本)
[美]罗伯特·J. 斯腾伯格 (美)凯琳·斯腾伯格 倪爱萍 译
重构:Ruby版
黄金圈法则
[美]西蒙·斯涅克 著;磨铁文化 出品
重构:Ruby版
汤姆·索亚历险记 彩图注音版 一二三四年级5-6-7-8-9岁小学生课外阅读经典 儿童文学无障碍有声伴读世界名著童话故事
[美]马克 吐温
重构:Ruby版
富兰克林自传 名家全译本 改变无数人命运的励志传奇 埃隆马斯克反复推荐 赠富兰克林签名照及精美插图
[美]本杰明·富兰克林 著;李自修 译
重构:Ruby版
意大利文艺复兴新艺术史
[美]迈克尔·韦恩·科尔 著;[美]斯蒂芬·J·坎贝尔;邵亦杨
重构:Ruby版
汤姆素亚历险记:中小学生课外阅读快乐读书吧 儿童文学无障碍有声伴读世界名著童话故事
[美]马克·吐温
重构:Ruby版
老人与海 彩图注音版 一二三四年级5-6-7-8-9岁小学生课外阅读经典 儿童文学无障碍有声伴读世界名著童话故事
[美]海明威
重构:Ruby版
养育的觉醒:全面激发孩子自驱力,教你如何心平气和做妈妈
[美]凯文·莱曼 著;唐晓璐 译;斯坦威 出品
重构:Ruby版
国际大奖图画书系列 共11册(小老鼠的恐惧的大书,大灰狼,红豆与菲比,别烦我,下雪了 ,穿靴子的猫 ,先有蛋,绿 ,特别快递,如果你想看鲸鱼 ,一个部落的孩子 ) 麦克米伦世纪
[美]莱恩·史密斯 (英)埃米莉·格雷维特 (美)劳拉·瓦卡罗·等/文 (英)埃米莉·格雷维特 等/图 彭懿 杨玲玲 阿甲 孙慧阳 白薇 译