仔细看看,您会发现需要改进的地方

我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会。 即使您的老板不要求也这样做。 这样做是因为您想要一些激动人心的工作时间。

重构是改变已经可以正常工作的艺术 。 但是要进行重构,您需要一个借口。 可能是设计改进,性能问题,安全角色以及许多其他原因。 您要冒这个风险,以减少应用程序的技术支出,使其更加稳定,并在将来以某种方式提高您的生产率。

这不是与公司或老板相处融洽,而是与自己相处融洽。 为什么? 因为问题往往会累积,在某些时候,您将失去对代码的控制。 您将面临艰难的时期来交付结果,这将毁掉您的职业生涯。

好吧,让我们从一个更光明的角度来看这件事。 在此过程中,您将学到很多东西,并且很快就会意识到,您正在生产比以前更好的代码。 您进行的重构越多,您就变得越聪明,直到达到创新水平为止。 但是,这是什么意思,您怎么知道自己要到达那里?

当您发现自己在做的事情上有明显的改进机会时,就会发现创新,而您意识到到目前为止,没有人做过创新(至少您找不到)。 这并不容易,但是通常发生在您重复做某件事时,并且发现自己在考虑如何做才能更快或更干净地做同一件事。 让我用一个真实的故事来说明。

它与Java中的字符串连接有关:这是多年来许多专家强调的经典问题,如今可能已被忽略。 在JDK 1.5之前,尽管可读性和简单性强,但使用运算符“ +”进行的字符串连接可能会产生非常低效的代码。 在后台,此运算符被替换为等效的字节码
StringBuffer ,实际上实现了串联。 您使用“ +”运算符的次数越多,则在内存中拥有的String和StringBuffer实例将越多,并且需要大量的处理时间来管理所有这些对象。 因此,开发人员被迫立即使用StringBuffer并忽略“ +”运算符。 看下面的例子:

String title = "Mr.";
String name = "John";
String familyName = "Smith";String message = "Dear " + title + " " + name + " " + familyName + ",";

开发人员习惯于这样写,但是他们被迫编写这样的写法:

StringBuffer sb = new StringBuffer();
sb.append("Dear ");
sb.append(title);
sb.append(" ");
sb.append(name);
sb.append(" ");
sb.append(familyName);
sb.append(",");

您可能同意我的观点,第一个示例比第二个示例更具可读性。 开发人员在连接字符串时使用“ +”运算符是很自然的,因此放弃该语法是不公平的。 幸运的是,编译人员为此做了一些工作,确保JDK 1.5可以优化串联。 他们没有使用线程安全的类StringBuffer,而是创建了一个称为StringBuilder的新类(非线程安全的,因此速度更快),并确保它的单个实例可以处理所有串联,如第一个示例所示。 这是一个重要的举措,因为他们更青睐优雅而不是技术。 第一个示例在编译时自动转换为如下形式:

StringBuilder sb = new StringBuilder();
sb.append("Dear ").append(title).append(" ").append(name).append(" ").append(familyName).append(",");

但是,非平凡逻辑中的串联仍然需要您在代码中编写StringBuilder,因为编译器还不那么聪明。 例如:

List<Student> students = studentBean.findStudents();
String intro = "The following students were approved:\n";
String listedNames = "";
String separator = "";
for(Student student: students) {if(student.approved()) {if(!listedNames.isEmpty()) {separator = ", ";}listedNames += separator + student.getName();}
}
String msg = intro + listedNames;
messengerBean.sendMessage(msg);

像这样写会更有效:

List<Student> students = studentBean.findStudents();
String intro = "The following students were approved:\n";
StringBuilder listedNames = new StringBuilder();
String separator = "";
for(Student student: students) {if(student.approved()) {if(!listedNames.length() > 0) {separator = ", ";}listedNames.append(separator).append(student.getName());}
}
String msg = intro + listedNames.toString();
messengerBean.sendMessage(msg);

UPS! 您注意到那里有什么奇怪的东西吗? 乍一看可能并不明显,但是请先看一下它们如何在定义分隔符之前检查变量namedNames是否为空。 String类在JDK 1.6中引入了一个不错的可读方法isEmpty(),但StringBuilder仍然使用这种相当古老的比较方式。 他们为什么不对StringBuilder和StringBuffer也这样做呢?

在core-lib-dev邮件列表中讨论了该问题 ,事实证明,他们之前没有这样做没有明显的原因。 也许他们只是忘记了。 由于进行了大量的重构,试图改善 字符串连接的 低效 使用,因此有可能发现这种不一致 。 我相信他们仍有时间针对明年即将推出的Java 8进行修复。 他们将通过在CharSequence接口中添加isEmpty()方法来解决此问题,以确保其他所有实现都同样出色。

这可能很简单,但是当Java因其过于冗长而受到严厉批评时,每个细节都很重要。 因此,进行一些重构,找到机会来改进代码以及用于编写代码的语言! 让我们前进Java!

参考: 仔细查看它,您会在Hildeberto的Blog博客上找到我们的JCG合作伙伴 Hildeberto Mendonca, 您需要改进 。

翻译自: https://www.javacodegeeks.com/2013/05/look-at-it-carefully-and-you-will-find-something-to-improve.html

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

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

相关文章

idea运行项目时报Error:java无效的源发行版:1.8

如果你安装的是JDK1.7&#xff0c;而在file->project structure中设置的是language level是8的话&#xff0c;就会出现这个错误提示&#xff1a;无效的源发行版&#xff1a;8。 解决办法&#xff1a;将语言级别改为7&#xff0c;或6。即语言级别不能高于你安装的版本。 另外…

0x123C语言,and esp, 0xfffffff0

问题I dont entirely understand the line with comment in it below. I read a few posts on SO and in the gcc manual and learned that it is for stack address alignment but fail to understand how it does so. The code is show below:(gdb) disas mainDump of assemb…

JUnit:在参数化测试中命名单个测试用例

几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&#xff1a; 但是&#…

如何在 React Native 中写一个自定义模块

前言 在 React Native 项目中可以看到 node_modules 文件夹&#xff0c;这是存放 node 模块的地方&#xff0c;Node.js 的包管理器 npm 是全球最大的开源库生态系统。提到npm&#xff0c;一般指两层含义&#xff1a;一是 Node.js 开放式模块登记和管理系统&#xff0c;另一种是…

小程序canvasu真机上数据图片不能使用

canvas遇到的坑 1.文字换行 2.真机不能使用网络数据图片&#xff08;真坑&#xff09; 点击显示效果我就不写了&#xff0c;你们可以自己加一下 全部代码贴出来 css#preview {width: 100%;height: 100%;background: rgba(0, 0, 0, 0.6);position: fixed;z-index: 999;top: 0;ov…

c语言 两条线段位置,C++/STL实现判断平面内两条线段的位置关系代码示例

概念平面内两条线段位置关系的判定在很多领域都有着广泛的应用&#xff0c;比如游戏、CAD、图形处理等&#xff0c;而两线段交点的求解又是该算法中重要的一环。本文将尽可能用通俗的语言详细的描述一种主流且性能较高的判定算法。外积&#xff0c;又称叉积&#xff0c;是向量代…

Thunder团队Beta周贡献分规则

小组名称&#xff1a;Thunder 项目名称&#xff1a;i阅app 组长&#xff1a;王航 成员&#xff1a;李传康、翟宇豪、邹双黛、苗威、宋雨、胡佑蓉、杨梓瑞 分配规则 规则1&#xff1a;基础分&#xff0c;拿出总分的20%&#xff08;8分&#xff09;进行均分&#xff0c;剩下的80%…

SiftingAppender:将不同的线程记录到不同的日志文件中

Logback的一项新颖功能是SiftingAppender &#xff08; JavaDoc &#xff09;。 简而言之&#xff0c;它是一个代理附加器&#xff0c;它为给定运行时属性的每个唯一值创建一个子附加器。 通常&#xff0c;此属性来自MDC 。 这是基于上面链接的官方文档的示例&#xff1a; <…

gulp webpack整合

为什么需要前端工程化&#xff1f; 前端工程化的意义在于让前端这个行业由野蛮时代进化为正规军时代&#xff0c;近年来很多相关的工具和概念诞生。好奇心日报在进行前端工程化的过程中&#xff0c;主要的挑战在于解决如下问题&#xff1a;✦ 如何管理多个项目的前端代码&…

SpringBoot 入门第一章

一、前言 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 本系列以快速入门为主&#xff0c;可当作工具小手册阅…

C语言游戏传递小秘密,C语言的那些小秘密之链表

大多数的读者在学习编程语言的时候都不喜欢那些枯燥的文字描述&#xff0c;包括我自己在开始学习编程的时候也是这样&#xff0c;对于代码的热情远远高于文字&#xff0c;所以我在我写东西的时候也不喜欢用枯燥的文字描述来向读者讲解&#xff0c;更喜欢用代码加上适当的文字描…

【转】 VC++6.0 在Win7 64位下调试,Shift+F5无法退出

Win7 64位VC6.0调试代码无法关闭窗口解决方法  VC6.0 在64位Windows7下调试的时候&#xff0c;再结束调试&#xff0c;程序无法退出&#xff0c;只能关闭VC6.0 IDE环境。  问题描述&#xff1a;当我击F5开始一个项目的调试时&#xff0c;程序在我设置的断点处停止&#xff…

使用Infinispan创建自己的Drools和jBPM持久性

我 在这里发表的原始文章&#xff1a; 您好&#xff0c;欢迎来到我打算向您展示如何创建自己的Drools和jBPM持久性实现的帖子。 我已经为流口水对象开发了基于infinispan的持久性方案&#xff0c;并且在此过程中学到了很多东西。 如果您想做某种事情&#xff0c;我打算给您一些…

Html5 填表 表单(二) input type 各种输入, 各种用户选择,上传等等泛输入用户交互

<input> 无限制输入 type 限制输入 type 如下类型 type 后还可以跟一些属性: 如<input typetext maxlength 10> 限制文本的长度为10字节 list 可以用的时候再来查, list就是当一个建议值不够的时候添加到几个. <form> <input typ…

c语言 输出音频 单片机,单片机播放WAV格式音频的理解

CSDN账号注册了3年&#xff0c;一直没有上来过&#xff0c;更不用说写博客了。我不知道博客的具体用途&#xff0c;我只想把它当做一种心得来发表&#xff0c;可能是一些技术上的理解或者生活上的小故事。好了&#xff0c;下面我将记录我对WAV播放器的理解。很久以前就看到过某…

UVALive3989 Ladies' Choice —— 稳定婚姻问题 Gale - Shapely算法

题目链接&#xff1a;https://vjudge.net/problem/UVALive-3989 题解&#xff1a; 题意&#xff1a;有n个男生和n个女生。每个女生对男神都有个好感度排行&#xff0c;同时每个男生对每个女生也有一个好感度排行。问&#xff1a;怎样配对&#xff0c;才能使的每个女生尽可能幸福…

通过命令行界面使用AWS ElasticMapReduce

在本文中&#xff0c;我将通过针对EMR的CLI使用AWS MapReduce服务&#xff08;称为ElasticMapReduce &#xff09;。 使用EMR的过程可以大致分为三个步骤&#xff1a; 设置并填充S3存储桶 创建并运行EMR作业 从S3存储桶中获取结果 在开始这三个高级步骤之前&#xff0c;还…

sublime 快捷键

Ctrl / 注释代码 <!-- <a href"http://www.baidu.com" target"_blank">百度</a> --> Tab 自动补全 <html tab 补全 html的全部基本标签 <a tab 自动补全为<a href…></a> 还有, 比如你忘记加<…

[UE4]关卡蓝图

转载于:https://www.cnblogs.com/timy/p/9053876.html

android 自定义 theme,Android使用Theme自定义Activity进入退出动画的方法

本文实例讲述了Android使用Theme自定义Activity进入退出动画的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;有没有觉得Activity的默认动画太快了或者太难看了。。我原来使用Activity.overridePendingTransition来自定义Activity的进入动画&#xff0c;却发现没…