69. 放下鼠标,离开键盘

放下鼠标,离开键盘

        你已经专注于某个难缠的问题几个小时了,还没有找到解决方法。于是你起身,伸伸腿,或者捶一下自动售卖机,接着在回来的路上答案突然就清晰了明了了。
        这个场景听起来熟悉不?有想过为什么会发生吗?奥秘在于当你编码时,大脑的逻辑性部分很活跃,而创造性部分则停止了,在逻辑部分中断之前不会产生任何东西。
        这是一个亲身经历的例子:我在清理一些遗留的代码,进入了一个“有趣的”方法。它设计用于检查一个字符串是否包含有效的时间,其他格式是“hh:mm:ss xx”,其中“hh”表示小时,“mm”表示分钟,“ss”表示秒,“xx”是“AM”或者“PM”。
        这个访求使用了下面的代码来把两个字符(代表小时)转换成一个数字,并检查它是否属于正确的范围:

try {
    Integer.parseInt(time.substring(0, 2));
} catch (Exception x) {
    return false;
}

if (Integer.parseInt(time.substring(0, 2)) > 12) {
    return false;
}

        同样的代码还出现了两次,使用了适当的字符偏移和上限,用于检查分和秒。方法的结尾是下面检查AM或PM的代码:

if (!time.substring(9, 11).equals("AM") &
    !time.substring(9, 11).equals("PM")) {
    return false;
}

        如果这一序列的比较中没有失败,即返回false,则整个方法返回true。
        如果前面的代码看起来冗长且难以理解,不要担心,我也是这么想的,这意味着我发现了里面一些要清理的东西。我重构了它并写了一些单元测试,确保它仍能正常工作。
       当我完成了,我对结果很满意。新的版本很容易看懂,只有一半的大小,并且更精确了,因为原来的代码只检查了时、分、秒的上界。
        当我准备第二天的工作时,一个想法出现在我的脑海中:为什么不使用一个正则表达式来检查字符串呢?几分钟的输入后,我有了一个可以工作的实现,只用了一行代码,如下所示:

public static boolean validateTime(String time) {
    return time.matches("(0[1-9]|1[0-2]):[0-5][0-9]:[0-5][0-9] ([AP]M)");
}

        这个故事主要想说的不是我用一行代码代替了超过30行的,而是在我离开电脑之前,我一直觉得先前的做法是最好的解法。
        所以,下次你遇到一个麻烦的问题时,帮自己一下吧。一旦你了解了问题之后,解决过程中使用一下大脑的创造性部分:勾勒出问题,听一点音乐,或者就走房间。有些时候,解决一个问题的最好办法是放下鼠标,离开键盘。

原文:Put the Mouse Down and Step Away from the Keyboard by Burk Hufnagel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值