《代码整洁之道》阅读笔记 6对象和数据结构

合理抽象,暴露行为,隐藏细节(实现过程)
在这里插入图片描述
将变量设置为私有(private)有一个理由:我们不想其他人依赖这些变量。我们还想在心血来潮时能自由修改其类型或实现。那么,为什么还是有那么多程序员给对象自动添加赋值器和取值器,将私有变量公之于众、如同它们根本就是公共变量一般呢?

1.数据抽象

1.隐藏实现关乎抽象,类并不简单地用取值器和赋值器将其变量推向外部,而是 曝露抽象接口以便用户无需了解数据的实现就能操作数据本体

// 具象点
public class Point {
    public double x;
    public double y;
}
/***************************************************/
// 抽象点
public interface Point {
    double getX();
    double getY();
    void setCartesian(double x, double y);
    double getR();
    double getTheta();
    void setPolar(double r, double theta);
}

比较两份代码,我们更喜欢第二份代码,为什么呢,因为它就是把点进行了抽象(隐藏了数据细节),我们实际上并不知道这个点是二维笛卡尔坐标的形式存储,还是极坐标形式,或者两者都不是。但是这不影响我们使用它!每次对它进行的修改操作都是一个合法的原子操作,这样也就是暴露了接口而不是数据

在这里插入图片描述

2.数据、对象的反对称性

1.对象把数据隐藏于抽象之后,曝露操作数据的函数。|| 数据结构曝露其数据,并没有提供有意义的函数

2.对象与数据结构之间的二分原理:

  • 过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类
  • 过程式代码难以添加新数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类

示例
在这里插入图片描述
在这里插入图片描述

3.得墨忒耳律

1.得墨忒耳律(The Law of Demeter):模块不应了解它所操作对象的内部情形,意味着 对象不应通过存取器曝露其内部结构 ,因为这样更像是曝露而非隐藏其内部结构

德墨忒尔律认为,类C的方法f只应调用以下对象的方法:

  • C
  • 由f创建的对象
  • 作为参数传递给f的对象
  • 由C的实体变量持有的对象

下列代码就违反了该定律:

String outputDir = context.getOptions().getScratchDir().getAbsolutePath();

方法不应调用由任何函数返回的对象的方法。换言之, 只跟朋友谈话,不与陌生人谈话

稍微改进一些但是还是违背德墨忒尔律的代码

Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

转换成传入参数的形式:

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

2.混合结构,一半是对象,一半是数据结构,应避免这种结构

这种结构拥有执行操作的函数,也有公共变量或公共访问器及改值器。无论出于怎样的初衷,公共访问器及改值器都把私有变量公开化,诱导外部函数以过程式程序使用数据结构的方式使用这些变量。

此类混杂增加了添加新函数的难度,也增加了添加新数据结构的难度,两面不讨好。应该避免创造这种结构。它们的出现,展示了一种乱七八糟的设计,其作者不确定——或者更糟糕,完全无视——他们是否需要函数或类型保护。

4.数据传送对象

1.最为精练的数据结构,是一个只有公共变量、没有函数的类,这种被称为数据传送对象,或DTO(Data Transfer Objects)。在与数据库通信、或解析套接字传递的消息之类场景中
是排头兵。

2.JavaBean或Active Record


Active Record维基百科解释:

在软件工程中,主动记录模式(active record pattern)是一种架构模式 ,可见于在关系数据库中存储内存中对象的软件中。它在Martin Fowler的2003年著《企业应用架构的模式》书中命名[1]。符合这个模式的对象的接口将包括函数比如插入、更新和删除,加上直接对应于在底层数据库表格中列的或多或少的属性。

主动记录模式是访问在数据库中的数据的一种方式。数据库表或视图被包装入类。因此,对象实例被链接到这个表格的一个单一行。在一个对象创建之后,在保存时将一个新行增加到表格中。加载的任何对象都从数据库得到它的信息。在一个对象被更新的时候,在表格中对应的行也被更新。包装类为在表格或视图中的每个列都实现访问器方法或属性。

这个模式常用于对象持久化工具和对象关系映射(ORM)之中。典型的,外键联系也通过一个属性而被显露为适当类型的一个对象实例


3.不要塞进业务规则方法,把Active Record当做数据结构,并创建包含业务规则、隐藏内部数据(可能就是Active Record的实体)的独立对象

5.小结

对象曝露行为,隐藏数据。便于添加新对象类型而不误修改既有行为,同时也难以在既有对象中添加新行为。

数据结构曝露数据,没有明显的行为。便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。

6.参考文献

《代码整洁之道》
https://www.jianshu.com/p/c44eca6add14
https://cloud.tencent.com/developer/article/1481406

在这里插入图片描述

本公众号分享自己从程序员小白到经历春招秋招斩获10几个offer的面试笔试经验,其中包括【Java】、【操作系统】、【计算机网络】、【设计模式】、【数据结构与算法】、【大厂面经】、【数据库】期待你加入!!!

1.计算机网络----三次握手四次挥手
2.梦想成真-----项目自我介绍
3.你们要的设计模式来了
4.一字一句教你面试“个人简介”
5.接近30场面试分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haikuotiankongdong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值