仔细看看,您会发现需要改进的地方
我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会。 即使您的老板不要求也这样做。 这样做是因为您想要一些激动人心的工作时间。
重构是改变已经可以正常工作的艺术 。 但是要进行重构,您需要一个借口。 可能是设计改进,性能问题,安全角色以及许多其他原因。 您要冒这个风险,以减少应用程序的技术支出,使其更加稳定,并在将来以某种方式提高您的生产率。
这不是与公司或老板相处融洽,而是与自己相处融洽。 为什么? 因为问题往往会累积,在某些时候,您将失去对代码的控制。 您将面临艰难的时期来交付结果,这将毁掉您的职业生涯。
好吧,让我们从一个更光明的角度来看这件事。 在此过程中,您将学到很多东西,并且很快就会意识到,您正在生产比以前更好的代码。 您进行的重构越多,您就变得越聪明,直到达到创新水平为止。 但是,这是什么意思,您怎么知道自己要到达那里?
当您发现自己在做的事情上有明显的改进机会时,就会发现创新,而您意识到到目前为止,没有人做过创新(至少您找不到)。 这并不容易,但是通常发生在您重复做某件事时,并且发现自己在考虑如何做才能更快或更干净地做同一件事。 让我用一个真实的故事来说明。
它与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!
翻译自: https://www.javacodegeeks.com/2013/05/look-at-it-carefully-and-you-will-find-something-to-improve.html
仔细看看,您会发现需要改进的地方相关推荐
- 仔细看看_仔细看看,您会发现需要改进的地方
仔细看看 我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会. 即使老板没有要求也要这样做. 这样做是因为您想要一些激动人心的工作时间. 重构是改变已经可以正常工作的艺术 ...
- 工作中发现 需要改进的地方
1.不够积极主动,发现问题 没有主动去处理,被动的被推进.比如:异常汇总统计.知道job跑的慢了,没有主动去想办法处理问题,而是被动.数据量的评估问题.查找思路处理的问题.先看SQL是否满.加索引,增 ...
- [vue] 你期待vue3.0有什么功能或者改进的地方?
[vue] 你期待vue3.0有什么功能或者改进的地方? 用尤大的话说就是各种速度提升n倍.我希望在依赖node_modules能够做出调整,文件数目太多,开启项目每次都要下载 个人简介 我是歌谣,欢 ...
- Clojure的并发(六)Agent可以改进的地方
Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析 Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和A ...
- c语言c11标准用得多吗,C语言的C11 标准有哪些改进的地方?C11 为何不如 C++11 流行?...
1. C语言的C11 标准有哪些改进的地方?会对各类C项目起到哪些帮助? 1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 . 2. _Noreturn 函 ...
- 求生之路2服务器ip直连,寝室无法通过ip直连,而且进入游戏后发现一些奇怪的地方……求帮助...
进入游戏后,打开控制台会发现,有些行很奇怪.而且通过控制台建图后仍然无法通过ip直接联机,我下载的版本是2.3g的2042的那个 不管是谁建主机都是这样,求帮助! Parent cvar in ser ...
- 苹果5s变砖_苹果砖的故事以及可以改进的地方
苹果5s变砖 Even since I can remember I've always been curious about trying out all kinds of software, ch ...
- 原始代理需要改进的地方
1.目标类的所有方法都添加了横向切面的逻辑,而有时我们仅仅只需要对某些特定的方法添加切面逻辑 2.织入点的切面逻辑采用了硬编码的方式 3.为不同的类要编写不同的程序代码,无法实现通用. 转载于:htt ...
- PhoneGap工作原理及需改进的地方(转)
PhoneGap是目前最被看好的: 兼容性:完全做到了Written Once,Run Everywhere! 标准化:PhoneGap采用W3C标准,Web App直接运行! 采用普通web开发技术 ...
最新文章
- 各种 Optimizer 梯度下降优化算法回顾和总结
- Linux怎么关闭ssh和ftp服务,linux ftp启用和停用及vsftpd安装 ssh 启用和停用命令及ssh的安装...
- kubernetes node节点失效 调度
- poj3061尺取法/前缀和 二分(java)
- 笔记-中项案例题-2020年下-质量管理
- 三国大将风云java_三国正史四大猛将:临阵斩杀敌方大将,连吕布和马超也做不到...
- python查找指定字符串并替换_python 查找字符串并将其替换
- 高级cmd攻击命令_一步一步学习DVWA渗透测试(Command Injection命令行注入)-第七次课...
- Java—重入锁的理解
- Cmder 设置默认打开目录、解决中文乱码
- Android中将EditText里面的内容设置成任意想要的状
- android c 内存泄露,内存泄漏弄个明白
- linux自启动配置文件,linux 开机自启动设置
- Sqlite3 stmt 机制操作
- Win10内存占用过高但是实际没有多少进程
- C 不常见的一些晦涩语法
- HDU6348 Buy and Resell
- ubuntu docker的cron定时任务不执行
- 过滤器实现用户访问记录日志记录
- RIP、OSPF、BGP、动态路由选路协议、自治域AS
热门文章
- java中两个map的融合(两个map有相同字段)
- ibatis(2)ibatis是什么
- java线程同步——竞争条件的荔枝+锁对象
- HDU2049(错列排序)
- Spring boot(八):RabbitMQ详解
- java switch语句_Java 14:查看更新的switch语句
- openjdk8 项目结构_OpenJDK织机和结构化并发
- openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答
- javafx swing_Swing应用程序中的JavaFX 8 DatePicker
- 销毁AWS资源:Cloud-Nuke还是AWS-Nuke?