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

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

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

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

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

它与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

仔细看看,您会发现需要改进的地方相关推荐

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

    仔细看看 我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会. 即使老板没有要求也要这样做. 这样做是因为您想要一些激动人心的工作时间. 重构是改变已经可以正常工作的艺术 ...

  2. 工作中发现 需要改进的地方

    1.不够积极主动,发现问题 没有主动去处理,被动的被推进.比如:异常汇总统计.知道job跑的慢了,没有主动去想办法处理问题,而是被动.数据量的评估问题.查找思路处理的问题.先看SQL是否满.加索引,增 ...

  3. [vue] 你期待vue3.0有什么功能或者改进的地方?

    [vue] 你期待vue3.0有什么功能或者改进的地方? 用尤大的话说就是各种速度提升n倍.我希望在依赖node_modules能够做出调整,文件数目太多,开启项目每次都要下载 个人简介 我是歌谣,欢 ...

  4. Clojure的并发(六)Agent可以改进的地方

    Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析 Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和A ...

  5. c语言c11标准用得多吗,C语言的C11 标准有哪些改进的地方?C11 为何不如 C++11 流行?...

    1.   C语言的C11 标准有哪些改进的地方?会对各类C项目起到哪些帮助? 1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 . 2. _Noreturn 函 ...

  6. 求生之路2服务器ip直连,寝室无法通过ip直连,而且进入游戏后发现一些奇怪的地方……求帮助...

    进入游戏后,打开控制台会发现,有些行很奇怪.而且通过控制台建图后仍然无法通过ip直接联机,我下载的版本是2.3g的2042的那个 不管是谁建主机都是这样,求帮助! Parent cvar in ser ...

  7. 苹果5s变砖_苹果砖的故事以及可以改进的地方

    苹果5s变砖 Even since I can remember I've always been curious about trying out all kinds of software, ch ...

  8. 原始代理需要改进的地方

    1.目标类的所有方法都添加了横向切面的逻辑,而有时我们仅仅只需要对某些特定的方法添加切面逻辑 2.织入点的切面逻辑采用了硬编码的方式 3.为不同的类要编写不同的程序代码,无法实现通用. 转载于:htt ...

  9. PhoneGap工作原理及需改进的地方(转)

    PhoneGap是目前最被看好的: 兼容性:完全做到了Written Once,Run Everywhere! 标准化:PhoneGap采用W3C标准,Web App直接运行! 采用普通web开发技术 ...

最新文章

  1. 各种 Optimizer 梯度下降优化算法回顾和总结
  2. Linux怎么关闭ssh和ftp服务,linux ftp启用和停用及vsftpd安装 ssh 启用和停用命令及ssh的安装...
  3. kubernetes node节点失效 调度
  4. poj3061尺取法/前缀和 二分(java)
  5. 笔记-中项案例题-2020年下-质量管理
  6. 三国大将风云java_三国正史四大猛将:临阵斩杀敌方大将,连吕布和马超也做不到...
  7. python查找指定字符串并替换_python 查找字符串并将其替换
  8. 高级cmd攻击命令_一步一步学习DVWA渗透测试(Command Injection命令行注入)-第七次课...
  9. Java—重入锁的理解
  10. Cmder 设置默认打开目录、解决中文乱码
  11. Android中将EditText里面的内容设置成任意想要的状
  12. android c 内存泄露,内存泄漏弄个明白
  13. linux自启动配置文件,linux 开机自启动设置
  14. Sqlite3 stmt 机制操作
  15. Win10内存占用过高但是实际没有多少进程
  16. C 不常见的一些晦涩语法
  17. HDU6348 Buy and Resell
  18. ubuntu docker的cron定时任务不执行
  19. 过滤器实现用户访问记录日志记录
  20. RIP、OSPF、BGP、动态路由选路协议、自治域AS

热门文章

  1. java中两个map的融合(两个map有相同字段)
  2. ibatis(2)ibatis是什么
  3. java线程同步——竞争条件的荔枝+锁对象
  4. HDU2049(错列排序)
  5. Spring boot(八):RabbitMQ详解
  6. java switch语句_Java 14:查看更新的switch语句
  7. openjdk8 项目结构_OpenJDK织机和结构化并发
  8. openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答
  9. javafx swing_Swing应用程序中的JavaFX 8 DatePicker
  10. 销毁AWS资源:Cloud-Nuke还是AWS-Nuke?