仔细看看
我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会。 即使老板没有要求也要这样做。 这样做是因为您想要一些激动人心的工作时间。
重构是改变已经可以正常工作的艺术 。 但是要进行重构,您需要一个借口。 可能是设计改进,性能问题,安全角色以及许多其他原因。 您要冒这个风险,以减少应用程序的技术支出,使其更加稳定,并在将来以某种方式提高您的生产率。
这不是与公司或老板相处融洽,而是与自己相处融洽。 为什么? 因为问题往往会累积,在某些时候,您将失去对代码的控制。 您将面临艰难的时期来交付结果,这将毁掉您的职业。
好吧,让我们从一个更光明的角度来看这件事。 您将在该过程中学到很多东西,并且很快就会意识到自己正在生产比以前更好的代码。 您进行的重构越多,您就变得越聪明,直到达到创新水平为止。 但是,这是什么意思,您怎么知道自己要到达那里?
当您发现自己在做的事情上有明显的改进机会时,就会发现创新,而您意识到到目前为止没有人做过(至少您找不到)。 这并不容易,但是通常发生在您重复做某件事时,并且发现自己在考虑如何做才能更快或更干净地做同一件事。 让我用一个真实的故事来说明。
它与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
仔细看看