现在,有一个计算面积的需求,其中一种实现如下:

class Square{public $side;
}
class Geometry{public function area($shape){if($shape instanceof Square){return $shape->side * $shape->side;}return 0;}
}

有人看了,你这抽象的有问题啊,很明显是面向过程的,如果新加一个类型,Geometry类中的所有方法都要修改。嗯,却是是这样,但反过来想,如果新加一个方法,所有现有的形状类都不用动,只要在Geometry类中添加方法就行了。

当然了,还有一种多态的实现方式:

class Square implements Shape{private $side;public function area(){return $this->side * $this->side;}
}

你以为这样就万事大吉了?并没有。确实这样实现,添加新的类型,只要新鞋一个类实现方法即可,很简单。但是如果要添加一个新的函数,那不好意思,所有的类都要进行修改。

简单总结下,就是说:

  • 过程式代码便于在不改动现由数据结构的前提下添加新的函数,面向对象便于在不改动现由函数的前提先添加新的类型
  • 过程式代码难以添加新的数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类
  • 对象暴露行为,隐藏数据。便于添加新的数据类型而无需修改现有行为,同时也难以在现有对象中添加新的行为
  • 数据结构(上面的第一种实现)暴露数据,没有明显的行为。便于向现有数据结构添加新行为,同时也难以向现有函数添加新的数据结构。

当然,具体使用哪一种还是应该灵活选择,不必拘泥。

如果希望灵活添加新行为,就使用数据结构的方式。如果希望灵活添加新类型,就使用面向对象的方式。

代码整洁之道-对象和数据结构相关推荐

  1. 《代码整洁之道》——(5)对象和数据结构

    <代码整洁之道>--(5)对象和数据结构 5.1.数据抽象 隐藏实现并非只是在变量之间放上一个函数层简单.隐藏实现关乎抽象!类并不简单的用取值器和赋值器将其变量推向外间,而是曝露抽象接口, ...

  2. 重读【代码整洁之道】

    一.前言 [代码整洁之道]很经典,但也有些过时,翻译上也有些啰嗦,但总体上是好书.通过对本书核心内容的摘抄,结合自己的经验,整理了一些精简的点,这样你就省的去啃那本400多页的书了. 软件质量 = 架 ...

  3. 2015年第11本:代码整洁之道Clean Code

    前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...

  4. 《代码整洁之道 Clean Architecture》-读书笔记

    大家好,我是烤鸭: 关于<代码整洁之道>,记录一下读书笔记. 代码整洁之道 第一章 整洁代码 整洁代码的艺术 第二章 有意义的命名 避免误导 有意义的区分 使用读得出来和可搜索的名字 避免 ...

  5. [读书笔记] 代码整洁之道

    书的示例是Java语言编写的,虽说不会影响阅读,但是后面几章讲应用这套方法论的时候,大篇幅的Java代码分析还是挺难受的,而且连java测试框架Junit都要细讲,对于非Java系的开发者来说,一些内 ...

  6. 【苦练基本功】代码整洁之道 pt2(第4章-第6章)

    代码整洁之道 pt2(第4章-第6章) 4 注释 4.1 注释不能美化糟糕的代码 4.2 用代码来阐述 4.3 好注释 4.3.1 法律信息 4.3.2 提供信息的注释 4.3.3 对意图的解释 4. ...

  7. 浪漫主义计算机科学家的真知灼见——《代码整洁之道》

    熟悉我的人都知道我每次写文章都要敬从当涂太白墓请来的李白三杯酒,很多人问我为什么写文章之前不拜韩愈或者苏轼反而拜成就在诗不在文的李白呢?我每次都要解释:李白是捞月的诗人,Monkey是捞月的动物,李白 ...

  8. 代码整洁之道 Clean Code 读书笔记

    目录 代码整洁之道 Clean Code 第一章 整洁代码 第二 三章 命名与函数 第四 五章注释与格式 第六章 对象和数据结构 第七章 错误处理 第八章 边界 第九章 单元测试 第十章 类 第十一章 ...

  9. 《代码整洁之道》目录—导读

    版权声明 代码整洁之道 Authorized translation from the English language edition, entitled Clean Code: A Handboo ...

最新文章

  1. 如何使用Nsight Compute?
  2. java接口的定义及使用细节
  3. 转 docker的下载与安装
  4. php实现鼠标悬停显示下拉菜单,Html中鼠标悬停显示二级菜单的两种方法
  5. PyCairo 中的文本
  6. How to determine if SAP CRM UI is extensible
  7. 如何使用SAP Analytics Cloud统计C4C系统每天新建的Lead个数和预测趋势
  8. 新入职了一个卷王 , 天天加班12点!张口闭口就手写spring , 太让人崩溃了......
  9. Orace用户创建及权限分配
  10. 深入分析MVC中通过IOC实现Controller依赖注入的原理
  11. LaTeX数学符号表
  12. SPECT、PET、CT与MRI成像原理及其特点的比较
  13. Nacos 2.0原理解析(一):Distro协议
  14. 小刘的刷题日记——day1 【CSES】Weird Algorithm
  15. Springboot开启APR模式
  16. tensorflow中的正则化函数在_『TensorFlow』正则化添加方法整理
  17. 【Natural Language Processing】语言模型训练工具Srilm的安装及使用简介
  18. X710网卡接收丢包
  19. Windows 10 系统精简方案参考
  20. Qt入门01 创建第一个Qt程序

热门文章

  1. 最优化学习笔记(三)最速下降法
  2. android icon 圆角半径,iOS和安卓APP启动图标的尺寸和圆角值详解
  3. hana 表空间_oracle currentval
  4. 邻接矩阵和邻接表_[力扣743] 带权邻接表的单源最短路
  5. linux 邮件日志,linux下如何建立邮件日志
  6. c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介
  7. cario java_Cairo图形库 概述
  8. cnn生成图像显著图_基于CNN与图像前背景分离的显著目标检测
  9. php二维数组 xml,xml 怎样通过php解析到二维数组里面
  10. android_secure写权限,android.permission.WRITE_SECURE_SETTINGS权限报错