写好代码
文章平均质量分 89
蜜糖的代码注释
这个作者很懒,什么都没留下…
展开
-
如何写好一个Java类?
混沌之初在进行程序开发的过程中,我们有时会看到这样的Java类: 有上百个公共方法 单个方法好几百行 整个Java文件几千行 先下结论,这样的类显然是不好的。尽管他勉强能维持当前功能的运行。但实际上它已经无法在进行功能上的扩展了。我们对他能做的只有保守治疗,在危楼上再添砖加瓦。尽管大家都不愿意承认自己是一片混沌的制造者,但实际上每一个巨型类的代码都是由你我亲手或间接缔造的。但是当有一天我们意识到,这个类已经太过巨大,需要进行重构的时候,我们需要一些方法论与准则来帮助原创 2022-02-28 08:00:00 · 376 阅读 · 0 评论 -
领域模型设计该如何落地到数据库设计?
早期项目设计在比较早期的软件程序设计中,或者说,当软件需求十分简单的时候。我们往往会按照如下的方式进行设计:分析需求文档。根据需求文档中设计到的数据进行库表设计。根据库表设计结合业务,进行程序设计。这样的操作流程是直观的,往往在进行第二步库表设计的时候,对应数据库字段中的内容就是需要展示的“列表”、“详情页“或者”表单“等内容。但是在这样的流程操作加,我们实际上是有两次对需求中的业务数据进行了两次全量分析,第一次是在进行数据库设计的时候,而第二次是在进行程序设计的时候。两次对需求原创 2022-02-10 08:00:00 · 939 阅读 · 0 评论 -
你使用的是数据结构还是对象?
你编写的是数据结构还是对象写Java的人都会自豪的说我是面向对象编程(或许没有那么自豪)。但我们在实际大型网络项目中进行开发的时候,我们最经常编写的各种对象,他们设计的是否真的妥当。如果你学过C语言的话应该知道,C语言中允许用户自己指定多个数据并用struct关键字将数据组合为一个整体,而称这种数据结构为结构体。,例如定义一个学生信息结构体:struct student{ char name[20]; int age;};我们不难发现因为C语言是面向过程的,结构体中只能有各种数原创 2022-02-09 09:40:48 · 489 阅读 · 0 评论 -
Java11 特性 - 效能翻倍的 HttpClient
古老的背景从JDK1.1开始,JDK中就有HttpURLConnection来提供了网络连接的能力,但是由于实现的比较古早,其有很多的局限性。比如HttpURLConnection是通过底层提供的socket连接来进行通信,而每一个HttpURLConnection实例只能发送一个请求,之后只能通过close()释放请求的网络资源,或在持久化连接时用disconnect()来关闭关闭底层socket。而其基类URLConnection是为了支持很多协议而设计的,但诸如FTP这种协议已经不咋用了。Http原创 2022-02-08 13:33:04 · 1146 阅读 · 0 评论 -
了解一下DDD领域驱动设计
为什么需要领域驱动在一个项目的生命周期中,随着项目需求的变动,我们需要不断地改变、扩展项目中软件的功能。在之前的文章《如何阻止软件退化》我们了解到,如果在不改变原有功能框架的前提下,对功能进行直接的添加,那么软件会虽然功能的增加很快就被腐化。这是因为,我们在最开始进行框架设计的时候,是根据最初提出的客观世界规律来设计的,而并没有根据新的、更细节的客观规律进行设计。而为了避免这种腐化,我们需要在进行新的功能开发前,先对原有功能根据新的需求进行结构上的调整,然后在这个基础上在进行新功能的编写,也就是我们的前原创 2022-02-07 08:00:00 · 1337 阅读 · 0 评论 -
如何写出格式清晰的代码?
代码格式的意义代码是用来描述业务逻辑的表达语言。而代码的格式则是为了更精准地表达业务逻辑。有的人可能会认为,无论多么的难以阅读,只要能完成产品预定的业务逻辑,就是好的代码。我认为这个想法是不对的。主要原因在于,在大型项目和持续维护的过程中,以及其他人在进行backup的时候,比起当时的业务逻辑是否准确,能否让人理解你的意图更加重要。而代码格式便是服务于此:为代码提供额外的上下文信息。尽管当前各种现代IDE提供了方便的格式化操作。但是这种格式化主要是针对一些简单的格式比如: 元素之间的空原创 2022-02-06 11:05:57 · 336 阅读 · 2 评论 -
如何阻止软件退化?
从软件退化说起软件开发行业,尤其是互联网相关行业中,软件工程的首要职责是对于利益点、风口业务的支持与落地。而这两者都是有着与时间相关的属性的。也就是说,同样的一件事,如果没有在正确的时间内做到,那可能也就没有意义了。所以软件行业是一个争分夺秒的行业。那么当真的风口到来时,软件工程的开发是否能快速跟上目标呢?希望总是好的,但是现实是很骨感的。当新的目标出现的时候,你会发现总有那么多的额外逻辑拖慢了脚步。项目工程什么时候是最优秀的时候呢?如果你是一个认真负责的开发人员的话,那么这个答案理应是当这个软原创 2022-02-05 09:47:36 · 317 阅读 · 0 评论 -
如何写好代码注释?
注释的本质对于代码注释来说,在不同的教程或者原则中有不同的规定或者解释。有的原则是需要使用JavaDoc来描写每个方法,而有的原则是要求每一个属性标注命名。我愿意相信每一份看起来不那么妥当的注释都是出于一些善意的目的,这就是注释的本质:对未能自行解释的代码做出解释。在进行代码工作的时候我们多多少少会有一些陈旧的、与业务无关的逻辑在代码中运行。有时候并不是一个变量名或者一个方法名就能阐述清楚产品同学所期望的业务内容。我们希望将代码外的逻辑也加入到其中,但是一篇长篇大论的注释似乎也不那么妥当,所以对于注释原创 2022-02-04 10:50:09 · 590 阅读 · 0 评论 -
JDK9响应式流使用详解
上文中咱们简单提到了JDK9中Flow接口中的静态内部类实现了响应式流的JAVA API,并且提供了一个一个Publisher的实现类SubmissionPublisher。本文将先梳理一下接口中具体的处理流程,然后再以几个调用者的例子来帮助大家理解。JDK9中的实现再放上一下上文中的响应式流的交互流程:订阅者向发布者发送订阅请求。发布者根据订阅请求生成令牌发送给订阅者。订阅者根据令牌向发布者发送请求N个数据。发送者根据订阅者的请求数量返回M(M<=N)个数据重复3,4数据发送完毕后原创 2022-02-03 10:06:08 · 480 阅读 · 0 评论 -
Java响应式编程基础-响应式流
什么是流形象的比喻来说就是如同水一样绵绵不绝的数据形式。而抽象点来说,是有一个生产者(source)产生,由一个或者多个消费者(sink)消费的数据元素(item)序列。那从这个抽象的描述就可以看出,使用流来承担数据交互的模式就是咱们经常说的生产者/消费者模型,而这种模型也可以称之为发布者/订阅者模型(后文将使用这个名字,因为JDK中使用的是这个名字)。对于流数据来说,一般有两种的数据流转方式:拉(pull)数据模式:订阅者向发布者索要数据。推(push)数据模式:发布者向订阅者推送数据(push原创 2022-02-02 01:40:48 · 307 阅读 · 0 评论 -
JAVA新特性的入场券-函数式接口
从Java8的“新”特性说起说到Java中的函数式编程,就不得不说到Java8中引入的lambda表达式、stream API等特性。它们与函数式接口一起支撑起了Java的函数式编程。函数式编程有较高的可读性与更好扩展性。而也正因为此,在后续版本Java的各种API中,充斥着各种通过函数式接口进行能力扩展的功能。所以,可以说理解函数式接口(编程)是进行后续高级特性学习的第一步。本文将从概念上引入函数式接口的意义,以及着重针对Java8新提供函数式接口进行功能汇总,并不对lambda表达式与stream原创 2022-01-31 10:11:23 · 594 阅读 · 0 评论 -
如何写好一个Java方法?
什么样的方法才是最好的方法要回答这个问题,我们首先要确定的是我们需要什么样子的方法。无论我们出于什么样子的目的产生对方法的需求,我可以说精准地满足我们需求的方法就是好方法。精准的含义是不过也不少。那么我们需要什么样的方法呢?就我个人的理解而言,我们对于方法的需求源于软件系统本身,系统是为需求服务的,而方法则为系统服务。所以我们的方法是为了更好地实现需求。那么对于项目需求而言,能够满足需求的设计、实现、迭代的方法就是最好的方法。但往往在进行代码开发时候,我们更关注的是功能上线,从而忽略了后续的迭代部分(当原创 2022-01-30 10:25:41 · 615 阅读 · 0 评论 -
值得学习的Java17新特性——密封类 Sealed Classes
尽管不同语言中的密封类的概念各不相同,但总的来说都是对子类的继承进行了限制,只不过这个继承的限制范围和程度各不一样。原创 2022-01-29 08:00:00 · 2541 阅读 · 0 评论 -
写了这么多年后端,你知道事务脚本模式吗?
什么是事务脚本模式事务脚本模式(Transaction Script)可以简称TS模式,这个模式本身的核心思想就是名称中的两个词,即:事务与脚本。事务可以理解为实际需要执行的一段原子业务;脚本则是指的一组原子业务的编排方式。而通常来说脚本的编排会直接映射到用户的一个行为动作上。事务脚本本身可以理解是用户动作的一次任务编排,而触发的方式一般直接与用户的行为建立联系。由于使用的是脚本的编排方式,所以事务的组织是面向过程的。而对于事务脚本模式,不同关联用户动作的脚本所编排的事务之间一般是相互隔离的原创 2022-01-28 08:00:00 · 1260 阅读 · 0 评论 -
为什么需要闭包?闭包是什么概念?
什么是闭包闭包的英文对应的是Closure,如果要单纯的讨论这个概念的话就要提到和图灵机起名的大名鼎鼎的lambda演算(lamdba calculus)。尽管lamdba的概念并不是本文的重点,但是闭包概念的目的便是支持lamdba的实现。如果你单独地在百度对进行搜索闭包的话,你会发现大部分都是js相关的内容,主要是js本身就只用闭包的这个概念。但是闭包并不仅限于js,而是一个通用的概念。借用wiki中有点抽象的定义来说的话,闭包就是:在计算机科学中,闭包(英语:Closure),又称词法闭包(L原创 2022-01-27 08:00:00 · 414 阅读 · 0 评论 -
全栈工程师?你知道全流程工程师吗?
你是全栈工程师吗?在更早的几年中,你是否经常听到全栈工程师的这个概念。十分仰慕,但是自己可能后端技术或者前端技术还是半吊子的情况下也仅仅是只能对全栈工程师这个概念感到向往。全栈似乎是和大牛画上等号。而在那段时间中,全球的一线国际大厂,如谷歌微软,的招聘岗位中更多地有全栈的这一概念,更有甚者则只有全栈这一岗位。让全栈工程师的这一概念更加的神圣化。但是你有没有思考过这么一个问题,全栈相比一般的前端后端程序员来说,他们有什么样的优势?全栈工程师的优势全栈工程师,我们广义上的理解,一般理解成他对前端、后端、原创 2022-01-26 09:59:41 · 236 阅读 · 0 评论 -
一线开发人员,你对项目了解多少?
对于一个程序开发人员来说,对项目的熟悉程度意味着你对工作内容的掌握程度。那么你是否可以问一下自己,你对你的项目了解吗?原创 2022-01-26 01:29:34 · 241 阅读 · 0 评论 -
起个变量名,好的代码应该是这样的
先起一个名字在进行项目编写的过程中,免不了的就是要进行各种方法、变量的命名。你一定经历过对变量命名无比困难的时候。而有的时候命名就看起来很轻松,比如对新增一个领域实体的时候。那用户(user)来举例子,可能还没有进行更多的思考,但 addUser的方法就已经创建了。工作完成,可喜可贺。但真的是这样吗?有多少同学在进行后续的代码翻阅的时候,反而发现别的同学的接口出现了 saveXxx的方法?该跟他保持一致吗?还是继续我行我素?如果在团队中的命名规范不明确的话,这种确实会出现。而比表面上看起来更严重的问题原创 2022-01-24 10:42:40 · 376 阅读 · 0 评论