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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值