- 博客(278)
- 收藏
- 关注
原创 【Code】《代码整洁之道》笔记-附录B-org.jfree.date.SerialDate
代码清单B-15 SpreadsheetDateFactory.java(最终版本)代码清单B-16 SpreadsheetDate.java(最终版本)代码清单B-14 DayDateFactory.java(最终版本)代码清单B-10 DateInterval.java(最终版本)代码清单B-12 WeekdayRange.java(最终版本)代码清单B-11 WeekInMonth.java(最终版本)代码清单B-13 DateUtil.java(最终版本)
2025-04-16 10:39:39
267
原创 【Code】《代码整洁之道》笔记-附录A-并发编程II
本附录扩充了第13章的内容,由一组相互独立的主题组成,你可以按随意顺序阅读。为了实现这样的阅读方式,节与节之间存在一些重复内容。
2025-04-16 10:38:43
1159
原创 【Code】《代码整洁之道》笔记-Chapter17-味道与启发
Martin Fowler在其大作《重构:改善既有代码的设计》(Refactoring: Improving the Design of Existing Code)中指出了许多不同的“代码的坏味道”。下面的清单包括很多Martin指出的“坏味道”,还添加了更多我自己提出的“坏味道”,也包括我借以历练本业的其他珍宝与启发。我借由遍览和重构几个不同的程序总结出这个清单。每次修改,我都问自己为什么要这样改,把修改的原因写下来,结果就得到相当长的清单,该清单列出了在读代码时让我闻起来不舒服的味道。
2025-04-15 17:43:48
1056
原创 【Code】《代码整洁之道》笔记-Chapter16-重构SerialDate
如果你找到JCommon类库,深入该类库,其中有个名为的程序包。在该程序包中,有个名为SerialDate的类,我们即将剖析这个类。SerialDate的作者是David Gilbert。David显然是一位经验丰富、能力很强的程序员。如我们将看到的,他在代码中展示了极高的专业性和原则性。无论怎么说,SerialDate都是“好代码”,而我将把它撕成碎片。这并非恶意的行为,我也不认为自己比David强许多,有权对他的代码说三道四。其实,如果你看过我的代码,我敢说你也会发现好些该埋怨的东西。
2025-04-15 17:42:49
1157
原创 【Code】《代码整洁之道》笔记-Chapter15-JUnit内幕
JUnit是最有名的Java框架之一。就像别的框架一样,它概念简单,定义精确,实现优雅。但它的代码是怎样的呢?本章将研判来自JUnit框架的一个代码例子。
2025-04-14 10:05:38
941
原创 【Code】《代码整洁之道》笔记-Chapter14-逐步改进
本章研究一个逐步改进的案例。你将看到一个开始还不错,但规模扩大后即出问题的模块。你还将看到这个模块是如何被重构得整洁起来的。我们中的大多数人都会遇到解析命令行参数的情况。如果没有就手的工具,就得遍历传入main函数的字符串数组。有一些不同来源的好工具,但没有一个是最符合要求的。所以,我当然要自己写一个,我把它叫作Args。Args非常易于使用。你只要简单地用输入参数和格式化字符串构造Args类,再向Args实体询问参数值即可。看看代码清单14-1中给出的简单例子。代码清单14-1 Args的简单用法。
2025-04-14 10:02:36
826
原创 【Code】《代码整洁之道》笔记-Chapter13-并发编程
对象是过程的抽象。线程是调度的抽象。编写整洁的并发程序很难——非常难,而编写在单线程中执行的代码却简单得多。编写表面上看似不错、深入进去却支离破碎的多线程代码也简单,但是系统一旦遭受压力,这种代码就扛不住了。本章将讨论并发编程的需求及其困难之处,并给出一些应对这些难点、编写整洁的并发代码的建议。最后,我们将讨论与测试并发代码有关的问题。整洁的并发编程是个复杂话题,值得用一整本书来讨论。本书只做概览,并在附录A中提供更详细的指引。如果你只是对并发好奇,阅读本章就足够了。
2025-04-12 12:51:31
1111
原创 【Code】《代码整洁之道》笔记-Chapter12-迭进
假使有4条简单的规则,跟着做就能帮助你创建优良的设计,会如何?假使遵循这些规则,你就能洞见代码的结构和设计,更能轻易地应用SRP和DIP之类的原则,便会如何?假使这4条规则有利于良好的设计“浮现”出来,又会如何?我们中的许多人认为,Kent Beck关于简单设计的4条规则,对于创建具有良好设计的软件有着莫大的帮助。据Kent所述,只要遵循以下规则,设计就能变得“简单”:运行所有测试;不可重复;表达了程序员的意图;尽可能减少类和方法的数量。以上规则按其重要程度排列。
2025-04-12 12:49:44
715
原创 【Code】《代码整洁之道》笔记-Chapter10-类
到目前为止,本书一直在讨论如何编写良好的代码行和代码块。我们深入研究了函数的恰当构成,以及函数之间如何互相关联。尽管讨论了这么多关于代码语句及由代码语句形成的函数的表达力,但是,除非我们将注意力放到代码组织的更高层面,否则始终不能得到整洁的代码。
2025-04-11 08:53:30
880
原创 【Code】《代码整洁之道》笔记-Chapter9-单元测试
过去十年以来,编程专业领域进步很大。1997年时,没人听说过测试驱动开发。对于我们之中的大多数人来说,单元测试是那种用来确保程序“可运行”的用过即扔的短代码。我们辛勤地编写类和方法,再弄出一些特殊代码来测试它们。通常这些代码会是一种简单的驱动式程序,让我们能够手工与自己编写的程序交互。我记得在20世纪90年代曾为一套嵌入式实时系统编写过C++程序。想法很简单;到达指定毫秒数时,在一个新线程中执行Command的execute方法。问题在于如何测试它。我随便写了个简单的驱动式程序,聆听来自键盘的动作。
2025-04-10 08:56:25
1095
原创 【Code】《代码整洁之道》笔记-Chapter8-边界
我们很少能控制系统中的全部软件。有时我们购买第三方程序包或使用开放源代码,有时我们依靠公司中其他团队打造组件或子系统。不管是哪种情况,我们都得将外来代码干净利落地整合进自己的代码中。本章将介绍一些保持软件边界整洁的实践手段和技巧。
2025-04-10 08:53:46
832
原创 【Code】《代码整洁之道》笔记-Chapter7-错误处理
对异常分类有很多方式。可以依其来源分类:是来自组件还是其他地方?也可以依其类型分类:是设备错误、网络错误还是编程错误?不过,当我们在应用程序中定义异常类时,最重要的考虑应该是它们如何被捕获。我们来看一个不太好的异常分类的例子。下面的语句是对某个第三方代码库的调用。try {语句包含了一大堆重复代码,这并不出奇。在大多数异常处理中,不管真实原因如何,我们总是做相对标准的处理。我们得记录错误,确保能继续工作。
2025-04-09 08:59:36
930
原创 【Code】《代码整洁之道》笔记-Chapter6-对象和数据结构
我们将变量设置为私有(private)有一个理由:不想让其他人依赖这些变量。我们还想在心血来潮时能自由修改其类型或实现。那么,为什么还是有那么多程序员不假思索就给对象添加赋值器(setter)和取值器(getter),将私有变量公之于众,如同它们是公共变量一般呢?
2025-04-09 08:58:58
1260
原创 【Code】《代码整洁之道》笔记-Chapter5-格式
当有人查看底层代码实现时,我们希望他们为代码的整洁、一致及所感知到的对细节的关注而震惊。我们希望他们高高扬起眉毛,一路看下去。我们希望他们感受到专业人士们的劳作。但若他们看到的只是一堆像是由酒醉的水手写出的鬼画符,那他们多半会得出结论,认为项目其他任何部分也同样对细节漠不关心。你应该保持良好的代码格式。你应该选用一套管理代码格式的简单规则,然后贯彻这些规则。如果你在团队中工作,则团队应该一致同意采用一套简单的格式规则,所有成员都要遵从这套规则。使用能帮你应用这套格式规则的自动化工具会很有帮助。
2025-04-08 08:49:05
746
原创 【Code】《代码整洁之道》笔记-Chapter4-注释
什么也比不上放置良好的注释来得有用。什么也不会比乱七八糟的注释更有本事搞乱一个模块。什么也不会比陈旧、提供错误信息的注释更有破坏性。注释并不像辛德勒的名单。它们并不“纯然地好”。实际上,注释最多也就是一种必需的恶。若编程语言足够有表达力,或者我们长于用这些语言来表达意图,就不那么需要注释——也许根本不需要。注释的恰当用法是弥补我们在用代码表达意图时遭遇的失败。注意,我用了“ 失败”一词,我是说真的,注释总是一种失败。我们总无法找到不用注释就能表达自我的方法,所以总要有注释,这并不值得庆贺。
2025-04-08 08:47:32
751
原创 【Code】《代码整洁之道》笔记-Chapter3-函数
在编程的早期岁月,系统由程序和子程序组成。后来,到Fortran和PL/1的年代,系统由程序、子程序和函数组成。如今,只有函数存活下来。函数是所有程序中的第一组代码。本章将讨论如何写好函数。请看代码清单3-1。在FitNesse中,很难找到长函数,不过我还是搜寻到一个。它不光长,而且很复杂,有大量字符串、怪异且不显见的数据类型和API。花3分钟时间,你能读懂多少?代码清单3-1 HtmlUtil.java(FitNesse 20070619)读懂这个函数了吗?大概没有。
2025-04-07 09:24:30
774
原创 【Code】《代码整洁之道》笔记-Chapter2-有意义的命名
起好名字最难的地方在于需要良好的描述技巧和共有文化背景。与其说这是一种技术、商业或管理问题,还不如说是一种教学问题。其结果是,这个领域内的许多人都没能学会做得很好。我们有时会担心其他开发者反对重命名。讨论一下就会知道,如果名称改得更好,那大家真的会感激你。多数时候我们并不记忆类名和方法名,而使用现代工具应对这些细节,好让自己集中精力把代码写得像词句篇章,至少像是表和数据结构(词句并非总是呈现数据的最佳手段)。改名可能会让某些人吃惊,就像你做到其他代码改善工作一样。别让这种事阻碍你前进的步伐。
2025-04-07 09:21:41
855
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库
读者已经跟着本书实践了很多零零散散的实例,应该能够熟练使用CMake来构建C和C++程序了吧!不过,前面的实例往往都是针对某个特定功能编写的,我们可能很难将它们综合起来实现一个完成度较高的项目。不必担心,本章就带领大家使用C++语言实现一个完整的动态库,以及调用该库的可执行文件——手写数字识别库和手写数字识别命令行工具。相信经过本章的实践,读者一定可以将前面所学的知识融会贯通,应用于中大型项目中了!
2025-04-06 19:52:46
1101
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter10-策略与向后兼容
CMake相当重视向后兼容性,并且受益于此,能够持续不断地改进和增加新特性,而几乎不会破坏古老的代码仓库。这一点在第2章介绍CMake的特点时已经提到过。CMake的策略机制就是为解决向后兼容问题而生的。有了策略机制,CMake可以基本确保基于旧版本CMake编写的目录程序可以被新版本的CMake配置生成,同时,如果程序中使用了已经弃用的特性,它也能针对性地给出警告信息,鼓励或要求用户重构CMake程序。
2025-04-05 10:58:08
565
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter9-模块
尽管CMake内置了相当多软件包的查找模块,但难免还会有特殊的需求。本节将介绍如何自己编写一个查找模块。在查找模块的实现中,往往需要查找软件包所需的可执行文件、库文件、头文件目录等路径。CMake提供了一系列命令用以辅助完成这些工作。下面先介绍这些命令。
2025-04-05 10:56:52
962
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter8-生成器表达式
关于这两个命令中的哪些参数支持生成器表达式,第7章中均已介绍,这里不再赘述。
2025-04-04 21:13:56
1008
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter7-构建目标和属性
属性用于定义编译(预处理)C和C++程序时所用到的宏。该属性值为列表字符串,每一个元素都代表一个宏定义。其元素格式为<宏名称>或<宏名称>=<值>。属性用于定义库目标对使用者的宏定义要求。任何构建目标,若链接到具有该属性的库目标,都会定义该属性所要求的宏。换句话说,该属性作为使用要求,会被自动传递给依赖者的构建要求。该传递过程由CMake在配置生成阶段隐式地完成,并不会改变依赖者的属性。属性仅包含为目标自身定义的构建要求,不包含传递过来的构建要求。
2025-04-04 21:10:20
852
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter6-CMake构建初探
从本章开始,我们不再仅仅停留在CMake脚本程序中,而是开始将CMake看作一个用于构建项目的利器了。在了解CMake的具体用法之前,先要清楚地掌握CMake项目的构建流程。换句话说,就是要清楚地掌握CMake项目的生命周期——从源程序和CMake目录程序,到构建好的二进制文件,再到这些二进制文件的安装和打包分发,最终到其他项目的源程序借助CMake使用这些二进制文件提供的功能。本章会说明CMake是怎样实现这样一个生命周期的,重点介绍其构建项目过程中的6个阶段,尤其是与构建紧密相关的阶段。
2025-04-03 09:17:55
1090
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter5-实践:CMake快速排序
到这里,终于将CMake中比较常用的命令都讲解完了。本章是本书中第一个实践章节。实践章节不会介绍任何的新内容,而是通过一个具体的项目来实战演练前面学习到的知识。鉴于之前我们一直把CMake当作通用脚本语言来学习,本章也不会含糊,直接实现一个经典算法:快速排序!快速排序的基本原理很简单:找到数列的一个基准值,将数列分成比该值小和比该值大的两部分子数列;变量,分别代表CMake脚本模式下命令行参数的个数及第N个参数的值(包括cmake命令行名称本身)。如果希望传递自定义参数到CMake脚本程序中,可以在调用。
2025-04-03 09:14:53
162
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter4-常用命令
CMake主要为构建服务,因此提供了专门生成宏定义的模板,可以非常方便地用于代码生成。例如,可以将定义在CMake程序中的版本号等信息以宏定义的形式生成到头文件中,并最终构建到可执行文件中。宏定义模板主要分为两种形式:一种是值为0或1的宏定义,另一种是自定义值的宏定义。后一种形式的自定义值可为空值,用于表示存在性。#cmakedefine01 <变量>#cmakedefine <变量> [<值>]#define <变量> 0/* #undef <变量> */如下所示中是一个实例。
2025-04-02 08:54:03
679
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter3-基础语法
CMake中有很多预定义的普通变量和环境变量,它们一般以“CMAKE_”开头,即属于保留标识符。预定义变量往往与系统配置、运行环境、构建行为、编译工具链、编程语言等信息相关。CMake中的预定义变量全部可以在其官方文档中找到,本书也会陆续涉及很多常用的预定义变量。在此先简单看一些预定义变量的例子。CMAKE_ARGC表示CMake脚本程序在被cmake -P命令行调用执行时,命令行传递的参数个数。表示CMake脚本程序在被命令行调用执行时,命令行传递的第一个、第二个参数。
2025-04-02 08:51:25
828
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter2-CMake简介
CMake官网给出了如下的定义:CMake是一个跨平台开源工具家族,用于构建、测试和打包软件。CMake通过简单的平台无关且编译器无关的配置文件来控制软件的编译流程,并能够生成原生的Makefile和工作空间,以便用于用户所选择的编译环境。为了满足开源项目对强大的跨平台构建工具的需求,Kitware公司创建了CMake工具套装。定义中,“跨平台”和“开源”这两个特性不必多说,要注意的是“工具家族”这个说法。
2025-04-01 09:07:56
673
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter1-构建之旅
结合前两个例程能够发现,使用要求在被传递时存在多种可能性:1.传递到使用者的构建要求;2.传递到使用者的使用要求;3.同时传递到使用者的构建要求和使用要求。前面两个例程分别对应第一种情况和第三种情况。第二种情况一般在当头文件(接口)使用了某个库,而源程序(实现)中并没有使用这个库时才会用到,多见于伪构建目标。举个另类但还算实用的例子:当希望引用一个接口库就可以自动链接多个库时,实际上就是要将多个链接库的使用要求传递给这个接口库的使用要求。接口库是伪构建目标,不需要编译,也就不存在构建要求。
2025-04-01 09:06:31
899
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录D-JavaScript 工具
Emscripten 与 LLVM。构建工具、自动化系统和任务运行器。编译/转译工具及静态类型系统。JavaScript 工具。
2025-03-07 00:00:00
952
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录C-JavaScript 库和框架
JavaScript 库和框架。
2025-03-06 00:00:00
760
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录A-ES2018 和 ES2019
处理异步迭代器的 reject()对象字面量的剩余操作符和扩展操作符。ES2018 和 ES2019。使用 next()手动异步迭代。Unicode 属性转义。可选的 catch 绑定。创建并使用异步迭代器。
2025-03-04 00:00:00
795
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter28-最佳实践
这里有 6 次属性查找:3 次是为查找 window.location.href.substring(),3 次是为查找window.location.href.indexOf()。第一次仍然要用 O(n)的复杂度去访问这个属性,但后续每次访问就都是 O(1),这样就是质的提升了。另外,如果实现某个需求既可以使用数组的数值索引,又可以使用命名属性(比如 NodeList 对象),那就都应该使用数值索引。常量值或 O(1),指字面量和保存在变量中的值,表示读取常量值所需的时间不会因值的多少而变化。
2025-03-03 00:00:00
983
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter27-工作者线程
建立的连接会在页面的生命周期内持续存在,只有当页面销毁且没有连接时,浏览器才会终止共享线程。在共享线程端口(稍后讨论)上调用 close()时,只要还有一个端口连接到该线程就不会真的终止线程。如上表所示,标签页 2 和标签页 3 再次调用 new SharedWorker()会连接到已有线程。随着连接的增加和移除,浏览器会记录连接总数。共享工作者线程的生命周期具有与专用工作者线程相同的阶段的特性。不同之处在于,专用工作者线程只跟一个页面绑定,而共享工作者线程只要还有一个上下文连接就会持续存在。
2025-03-02 00:00:00
1383
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter25-客户端存储
JavaScript 中的 cookie。sessionStorage 对象。使用 cookie 的注意事项。localStorage 对象。cookie 的构成。Storage 类型。
2025-02-28 00:00:00
908
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter24-网络请求与远程资源
Response 类还有两个用于生成 Response 对象的静态方法:Response.redirect()和 Response.error()。大多数情况下,产生 Response 对象的主要方式是调用 fetch(),它返回一个最后会解决为Response 对象的期约,这个 Response 对象代表实际的 HTTP 响应。另一个静态方法 Response.error()用于产生表示网络错误的 Response 对象(网络错误会导致fetch()期约被拒绝)。创建 Response 对象。
2025-02-27 00:00:00
971
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人