优雅的对象

最近一口气读完了二百多页的《Elegant Objects》。可能因为整理自博客所以排版一般,而且才二百多页定价却40多刀。但读过之后发现超值,甚至还想去买第二卷。作者观点大多比较激进,对自己的理念异常坚定,所以经常使用诸如“绝对不要使用XXX”、“记住XXX,就这样,句号”。但作者绝不故弄玄虚,在批判之后,一定会给出自己的建议和代码示例。除去个别章节个人觉得很有争议,大部分内容读过之后都是很震撼的。另外原书观点较为零散,为了方便感兴趣的同学继续阅读学习,本文重点部分都标注了与原书章节的对应。

Elegant Object


1.面向对象思想

面向对象思想与此前“远古”时期编程思想的不同就是:我们站在更高的抽象上思考问题,从问题领域出发定义概念和概念间的关系,而不再是以机器指令为中心,想尽各种办法指挥机器去做事。作者极力想要扭转我们的思想,不要被机器同化,总是从它的角度来思考问题,而是忘记具体的底层架构、指令、编程语言,让以我们要解决的问题为中心。

此外书中作者反复强调的一点就是:一切都是为了可维护性。这可能是工程里的编程与科学里的计算的主要区别之一。作为软件工程的一环,除了基本的正确性外,最重要的一点就是可维护性了。因为现实世界的不确定,需求的反复变化,代码量巨大等问题,没有良好的可维护性的话。以可维护性为中心出发,作者指出了面向对象的三大癌症:可变性、静态方法、NULL。就像《黑客帝国》里说的人类是地球的癌症,这三者就是我们日常开发的混乱之源。而且某种程度上,三者背后的思想都根植于面向过程编程。


2.概念的封装

对象不是一堆由我们调用者决定调用顺序的函数集合,依次调用操作其内部封装的数据。作者反复用拟人的方式强调,这种指手画脚地方式是对“别人”的不尊重。我们去餐厅点菜,不会跟厨师说你得先做这个再做那个,这样做出来才好吃。现实中我们直接说,请给我来一份这个菜,厨师会自己决定如何烹饪。跟一个对象打交道也是如此,对象是一个自洽的、能自己做决定并自己行动的实体,就像一个能自给自足(self-sufficient)的生物一样。所以说,对象与对象之间相互“尊重信任”的关系是面向对象思想的核心

2.1 设计者:隐藏好你的抽象

从对象设计者角度,要自重,不要泄漏你的实现细节,不要泄漏任何内部抽象。从这个角度来说,setter/getter也是邪恶的(原书3.5节)。你可能会说,setter/getter不是远好于直接暴露成员变量吗?而且它还是Java Bean的标准,我们还可以在里面添加数据验证、甚至改变存储内容方式等逻辑。但这都不重要,重要的是对于调用者来说这与直接的数据访问没什么区别。比如下面Cash类中如果加上一个getDollars()方法,那就好像让调用者对自己说:“去成员数据里找,看看有没有一个叫dollars的,把它返回给我”。而dollars()则会好一些,仿佛在说:“请告诉我你有多少美元?”(另可参考原书的2.4节 Choose method names carefully,作者对方法起名的见解)。

此外也不要返回NULL造成空指针异常,失去调用者对你的信任(原书4.1节 Never return NULL)。返回NULL的最常见情况就是找不到调用者想要的对象,那么可选的其他方式有返回空列表/集合,如果只是要返回一个单一对象的话则可采用空对象设计模式,或者在必要时抛出异常。更深层的原因是NULL不应该出现在面向对象的世界里(原书3.3节 Never accept NULL arguments)。

也不要因为方便而对外提供成员常量,比如public static final String CRLF = "\r\n",看似很常见却破坏了面向对象的理念(原书2.5节 Don’t use public constants)。下面将这部分逻辑封装到CRLFString类中,我们再也不用担心明天要为不同平台添加不同的换行符了。但这会导致很多类不是么,参见第三部分关于短小而简单的类设计理念的讨论。

class CRLFString {private final String src;CRLFString(String src) {this.src = src;}String toString() {if (/* this is windows */) {//...}return String.format("%s\r\n", src);}
}

2.2 使用者:Show Your Respect

从使用者角度,不要去偷窥,比如利用反射技术在运行时获取对象内部的信息,比如最常用的instanceof判断对象是否是某个具体的子类等等(原书3.7节 Avoid type introspection and casting)。可能你会说你很少用反射,也可以尽量不用,但单元测试里的mock技术是无人不知、无人不晓的。mock难道不是很好的技术吗?现在已经有了很多非常棒的mock框架。

class Cash {private final Exchange exchange;private final int cents;public Cash(Exchange exchange, int cents) {this.exchange = exchange;

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Java 8 Lambda

关于 深入理解 Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)深入理解 Java 8 Lambda(类库篇——Streams API,Collector 和并行)深入理解 Java 8 Lambda(原理篇——…

自然语言处理中注意力机制综述

https://www.toutiao.com/a6655120292144218637/ 目录 1.写在前面 2.Seq2Seq 模型 3.NLP中注意力机制起源 4.NLP中的注意力机制 5.Hierarchical Attention 6.Self-Attention 7.Memory-based Attention 8.Soft/Hard Attention 9.Global/Local Attention 10.评价指标 11.写在后面…

【深度学习基础】从零开始的炼丹生活00——机器学习数学基础以及数值计算数值优化方法

正值假期,决定恶补机器学习、深度学习及相关领域(顺便开个博客)。首先学习一下数学基础以及数值计算的方法(主要参考《深度学习》) 一、数学基础 这里简单复习一下机器学习相关的数学1.线性代数 范数 衡量一个向量的…

“泰迪杯”挑战赛 -利用非侵入式负荷检测进行高效率数据挖掘(完整数学模型)

目录 1 研究背景与意义 2 变量说明 3 问题分析 4 问题一 4.1 数据预处理 4.1.1 降噪处理 4.1.2 数据变换 4.2 负荷特征分析 4.2.1 暂态特征 4.2.2 稳态特征 5 问题二 5.1 相似度与权系数 5.2 模型建立 5.3 模型求解 6 问题三 6.1 事件检测算法 6.2 模型建立 6.3 模型求解…

37%原则如何优化我们做决定的时间

当需要百(千,万…)里挑一时,需要权衡最优解和效率,有一个37%原则比较有趣。 整个择优过程分为两个阶段: 观望:在前面 k k k个候选者中冒泡记录最优者 p p p,其分数为 V p V_p Vp​,但并不选择…

清风数学建模学习笔记——层次分析法

目录 一、模型简介 二、建模步骤 三、模型总结 一、层次分析法——模型简介 层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨…

Attention is all you need ---Transformer

大语言模型已经在很多领域大显身手,其应用包括只能写作、音乐创作、知识问答、聊天、客服、广告文案、论文、新闻、小说创作、润色、会议/文章摘要等等领域。在商业上模型即产品、服务即产品、插件即产品,任何形态的用户可触及的都可以是产品&#xff0c…

you-get下载速度慢解决方法

Python版本:3.10 运行环境:Windows10 问题描述:在使用you-get下载X站视频时网速很慢,并一直限制在某个值,通过以下办法即可恢复正常网速 解决办法: 进入windows 安全中心-病毒和威胁防护-管理设置点击添加或删除排…

Microsoft store下载速度过慢

最开始是进入Microsoft store点击安装后一直无响应,后来知道这是因为Microsoft store下载速度过慢。下边几个步骤都尝试了,个人认为最重要的是Windows Update设置步骤,刚开始可能一直没有正确打开 修改DNS 右键任务栏网络图标->打开“网…

Linux网络编程 socket编程篇(一) socket编程基础

目录 一、预备知识 1.IP地址 2.端口号 3.网络通信 4.TCP协议简介 5.UDP协议简介 6.网络字节序 二、socket 1.什么是socket(套接字)? 2.为什么要有套接字? 3.套接字的主要类型 拓】网络套接字 三、socket API 1.socket API是什么? 2.为什么…

如何预防ssl中间人攻击?

当我们连上公共WiFi打开网页或邮箱时,殊不知此时可能有人正在监视着我们的各种网络活动。打开账户网页那一瞬间,不法分子可能已经盗取了我们的银行凭证、家庭住址、电子邮件和联系人信息,而这一切我们却毫不知情。这是一种网络上常见的“中间…

[保研/考研机试] KY3 约数的个数 清华大学复试上机题 C++实现

题目链接&#xff1a; KY3 约数的个数 https://www.nowcoder.com/share/jump/437195121691716950188 描述 输入n个整数,依次输出每个数的约数的个数 输入描述&#xff1a; 输入的第一行为N&#xff0c;即数组的个数(N<1000) 接下来的1行包括N个整数&#xff0c;其中每个…

wsl2安装mysql环境

安装完mysql后通过如下命令启动mysql service mysql start 会显示如下错误&#xff1a; mysql: unrecognized service 实际上上面显示的错误是由于mysql没有启动成功造成的 我们要想办法成功启动mysql才可以 1.通过如下操作就可以跳过密码直接进入mysql环境 2.如果想找到my…

nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04

本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改&#xff0c;对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

关于电脑连接好WiFi却无法使用浏览器上网的一种解决方法

如果你的电脑的网络设置里选项是自动获取ip地址的话&#xff0c;那么大概率适用此方法。&#xff08;我这个已经是填好的&#xff0c;之前是自动获取&#xff09; 方法步骤&#xff1a;这里分两步 &#xff08;1&#xff09;首先确定无法使用浏览器上网的原因。&#xff08;比…

windows11连接上WiFi但是无法上网

电脑经常会出现网络等问题&#xff0c;win11在连接到WiFi&#xff0c;但是无法正常上网。进行网络诊断显示“该设备或资源&#xff08;Web代理&#xff09;未设置为接收端口7890”。借鉴过网络上许多方法都没有解决。可以尝试使用以下这种方式解决&#xff0c;本人亲测已解决。…

电脑显示wifi连接但是不能上网(dns无法连接)

网络问题 电脑显示wifi连接但是不能上网 1.使用手机等其它设备&#xff0c;连接同一个wifi&#xff0c;检查是否出现问题 如果其它设备也不能使用&#xff0c;则为网络本身的问题 如果不是&#xff0c;在继续检查电脑的问题 2.诊断问题 打开 “网络和Internet设置”找到下…

WIFI已连接,无法上网

wifi已经连接但显示无网络访问权限&#xff0c;查看IP&#xff0c;没有获取到IP。 解决方法&#xff1a; 1、在左下角Windows开始处打开【设置】界面 2、选择【更新和安全】 3、点击左侧窗格中的【恢复】。 4、点击【重置此电脑】下方的【开始】按钮。 5、删除所有内容 重置…

函数的模拟实现

题一&#xff1a; 模拟实现strncpy #include <stdio.h>void my_strncpy(char* arr2, char* arr1, size_t num){int i 0;for (i 0; i < num; i){*(arr2 i) *(arr1 i);}}int main(){char arr1[] "hello liangzai";char arr2[10] { 0 };//strncpy(ar…