对象和数据结构

文章目录

  • 前言
  • 一、从链式调用说起
  • 二、数据抽象
  • 三、数据、对象的反对称性
  • 四、得墨忒尔律
  • 五、数据传送对象
  • 总结


前言

代码整洁之道读书随笔,第六章


一、从链式调用说起

面向对象语言中常用的一种调用形式,链式调用,是一种较受推崇的编码风格,如果你调用一个实例的方法,修改了实例的状态,后续需要调用其他方法,进一步改变实例的状态,那么不需要每次都用变量接收返回值,直接链式调用即可。

例如gorm的更新可以这样实现。

result := m.tx.Model(&model.A{}).Where(&model.A{ID: id}).Updates(data)

其中Where的实现为:

// Where return a new relation, filter records with given conditions, accepts `map`, `struct` or `string` as conditions, refer http://jinzhu.github.io/gorm/crud.html#query
func (s *DB) Where(query interface{}, args ...interface{}) *DB {return s.clone().search.Where(query, args...).db
}

二、数据抽象

Java的初级程序员,此处特指刚入行时的本人,喜欢为类的私有成员变量加getter/setter,在很多crud场景,其实也感觉不出有什么问题,直到你的业务场景不再满足简单的crud,例如,书中的示例中给出了一个笛卡尔平面上一个point类的实现。刚好我现在的工作就是为智能机器人做路径规划,所以对这个感触就比较深。
一个点包含X/Y轴,每次改变位置,我们不能只更新单个轴,而是要同时更新,同样,查询也不是只想查询到单个轴,那么分别为每个变量加getter/setter是没有意义的。
getter/setter的根本目的是为了隐藏实现,隐藏实现是为了让用户无需了解实现就可以操作数据本体。

三、数据、对象的反对称性

对象和数据结构之间的二分原理:

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

那么我们可以举例,对于机器人,如果要构造一个类,那么就可以考虑,如果你的抽象级别在机器人上,每个机器人有自己的行为,比如a类机器人是聊天机器人,b类机器人是扫地机器人,那么就做面向对象,你不需要每次增加新功能都为所有机器人增加新函数。
但是如果你们机器人都是扫地机器人,那么把能力进行抽象就是比较正确的选择,走路的能力抽象成接口,让机器人组合能力,对于走路这个能力就成了过程式代码,就算你需要增加新的机器人种类,只需要包含这种能力即可。

四、得墨忒尔律

模块不应了解它所操作对象的内部情形。

更准确的,类C的方法f只应该调用以下对象的方法。

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

书中给出了一个反例:

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

现在和开头我说的链式调用比较一下,链式调用的每次调用返回的都是类C的实例本身,那么是没有违背得墨忒尔律的,但是这个反例中,每次返回的都是不一样的对象,那么对于调用者就需要了解Options、ScratchDir的内部构造结构。

特别需要指出,这里Options、ScratchDir特指拥有行为的对象,如果他们只拥有变量,而不拥有行为,那么作者认为不需要考虑得墨忒尔律。
结合outputDir的使用:

String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);

作者给出了修正结果:

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

把过程隐藏到createScratchFileStream() 中,对于调用者,就不需要了解过多类的细节。

五、数据传送对象

数据传送对象(Data Transfer Objects, DTO)是用于与数据库通信或解析套接字传递的消息等场景中的数据结构,不适合加入业务逻辑。Active Record1是一种特殊的DTO。


总结

这是代码整洁之道第六章的读书随笔,本章已完结。


  1. Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alibaba Nacos注册中心实战

为什么需要注册中心 思考:网络请求,如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化? // 微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢? String ur…

【c++】左值和右值

理解 C/C 中的左值和右值 写得很好 简单定义 左值(lvalue, locator value) 表示一个占据内存中某个可识别得位置(地址)得对象右值(rvalue), 不是左值就是右值, 不表示内存中某个可识别位置的对象的表达式。 举例: int var; va…

【学习笔记】Java安全之动态加载字节码

文章目录 什么是Java的字节码利用URLClassLoader加载远程class文件利用ClassLoader#defineClass直接加载字节码利用TemplatesImpl加载字节码利用BCEL ClassLoader加载字节码 最近在学习Phith0n师傅的知识星球的Java安全漫谈系列,随手记下笔记 什么是Java的字节码 J…

CCRC认证是什么?

什么是CCRC认证? 信息安全服务资质,是信息安全服务机构提供安全服务的一种资格,包括法律地位、资源状况、管理水平、技术能力等方面的要求。 信息安全服务资质(CCRC)是依据国家法律法规、国家标准、行业标准和技术规范…

iOS学习 --- Xcode 15 下载iOS_17.0.1_Simulator失败解决方法

1.去开发者官网下载安装包 https://developer.apple.com/download/all/?qiOS%2017 使用浏览器下载。 2.打开终端通过命令添加到xcode 命令如下: sudo xcode-select -s /Applications/Xcode.app(输入开始密码)xcodebuild -runFirstLaunch (等待一小会)xcrun simctl…

翻译软件Mate Translate mac中文版介绍说明

Mate Translate mac可以帮你翻译超过100种语言的单词和短语,使用文本到语音转换,并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版软件介绍 Mate Translate 可以在你的所有设备之间轻松同步&#x…

人参果

《人参果》 作者/罗光记 千年灵气结人参, 果似珍珠色艳新。 仙界奇珍谁得享, 只留传说在人心。

2023年首届天府杯数学建模国际大赛问题A思路详解与参考代码:大地测量数据中异常现象的特征和识别

地球变形观测是固体潮汐曲线分析和地震前体研究的重要手段,也是地球观测技术的重要组成部分。基于各种精密科学仪器的变形观测点主要集中在洞穴、地下井等易的自然灾害(雷暴、强降雨、降雪等),人工维护、人工爆破等外部条件&#…

基于Vue+SpringBoot的厦门旅游电子商务预订系统 开源项目

项目编号: S 030 ,文末获取源码。 \color{red}{项目编号:S030,文末获取源码。} 项目编号:S030,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…

Zookeeper实战案例(1)

前置知识: Zookeeper学习笔记(1)—— 基础知识-CSDN博客 Zookeeper学习笔记(2)—— Zookeeper API简单操作-CSDN博客 Zookeeper 服务器动态上下线监听案例 需求分析 某分布式系统中,主节点可以有多台&am…

【linux】nmon 工具使用

nmon 介绍 nmon是奈杰尔的性能监视器的缩写,适用于POWER、x86、x86_64、Mainframe和现在的ARM(Raspberry Pi)上的Linux。同样适用于nmon for AIX的工具(与IBM的AIX一起提供)。njmon与之类似,但将数据保存为…

Node.js环境配置级安装vue-cli脚手架

一、下载安装Node.js (略) 二、验证node.js并配置 1、下载安装后,cmd面板输入node -v查询版本、npm -v ,查看npm是否安装成功(有版本号就行了) 2、选择npm镜像(npm config set registry https://registry.npm.taobao.org&…

optee4.0.0 qemu_v8的环境搭建篇(ubuntu20.10)

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈文章目录 前提条件1、拉取代码2、下载工具链3、编译4、运行

kubernetes|云原生| 如何优雅的重启和更新pod---pod生命周期管理实务

前言: kubernetes的管理维护的复杂性体现在了方方面面,例如,pod的管理,服务的管理,用户的管理(RBAC)&#xf…

通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件

与传统证券一样,基于区块链技术发展出来的虚拟资产交易所经历了快速发展而缺乏有效监管的行业早期。除了科技光环加持的各种区块链项目方、造富神话之外,交易所遭到黑客攻击、内部偷窃作恶、甚至经营主体异常而致使投资人血本无归的案例亦令人触目惊心。…

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS 16.2.2 PPDU format16.2.2.1 General16.2.2.2 Long PPDU format16.2.2.3 Short PPDU format 16.3.4 HR/DSSS TXTIME calculation PREV: TBD NEXT: TBD 16.2.2 PPDU format 16.2.2.1 General 定…

ubuntu 20.04安装 Anaconda教程

在安装Anaconda之前需要先安装ros(防止跟conda冲突,先装ros)。提前安装好cuda 和cudnn。 本博客参考:ubuntu20.04配置ros noetic和cuda,cudnn,anaconda,pytorch深度学习的环境 安装完conda后,输入: pyth…

Mysql -常见函数

目录 字符串函数 数值函数 日期函数 流程函数 字符串函数 -- 拼接 SELECT CONCAT(Hello, World); -- 小写 SELECT LOWER(Hello); -- 大写 SELECT UPPER(Hello); -- 左填充 SELECT LPAD(01, 5, -); -- 右填充 SELECT RPAD(01, 5, -); -- 去除空格 SELECT TRIM( Hello World )…

C语言循环结构 while循环

while循环 while循环语句概述while循环输出20个数while循环注意事项 while循环语句概述 作用:满足循环条件,执行循环语句 语法:while(循环条件){ 循环语句 } 解释:只要循环条件的结果为真,就执行循环语句 while循环输…

Flume学习笔记(2)—— Flume进阶

Flume进阶 Flume 事务 事务处理流程如下: Put doPut:将批数据先写入临时缓冲区putListdoCommit:检查channel内存队列是否足够合并。doRollback:channel内存队列空间不足,回滚数据 Take doTake:将数据取…