更新时间:2021-11-22 09:16:30
“丢失了一个钉子,坏了一只蹄铁;坏了一只蹄铁,折了一匹战马;折了一匹战马,伤了一位骑士;伤了一位骑士,输了一场战斗;输了一场战斗,亡了一个帝国。”这是西方流传的民谣,传智播客石家庄校区教研部冀老师对这此颇有感慨。“失之毫厘,差之千里”,是冀老师对这首民谣的概括。
不积跬步无以至千里,不积小流无以成江海。想要成就一番大事业,就要从点滴小事做起,把控好过程中的每一个细节。这是冀老师对自己的要求,也是他在传智播客做教学工作的行为标准。
冀老师认为,IT项目产品的研发实施,更是需要注意细节。因为每个细节的把控程度直接关乎项目运行结果的准确度。对细节的疏忽,可能会导致系统瘫痪,影响用户体验。纵使产品已经过千锤百炼,每个交易代码的编写仍不能大意疏忽。冀老师分享一些在工作中体现细节重要性的具体的案例代码。
案例
有一个很简单的应用场景:商店中一只碳素笔标价1.10元,用一张2元人民币购买,应该找多少零钱?
下面是一个试图解决上述问题的程序,它会打印出什么呢?
public static void main(String args[]) {
System.out.println(2.00 - 1.10);
}
很多人可能天真地认为会打印出0.90,但如果你运行此程序就会发现它最终的执行结果是:0.8999999999999999。
在货币计算中,如果我们向客户展示这样的数据,一定会贻笑大方,而且很难做出合理的解释。如果截断两位数字显示,便直接丢掉一分钱,这就是典型的细节考虑不到位。
问题的解决方案请参考Java中BigDicamal类的用法。
案例
列举一个简单的业务场景:求一天有多少毫秒及多少微秒?
程序如下:
public static void main(String args[]) {
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MILLIS_PER_DAY);
final long MICORS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
System.out.println(MICORS_PER_DAY);
}
分析业务场景,求每天的微秒数,业务公式为(24小时/每天*60分钟/小时*60秒/分钟*1000毫秒/秒*1000微秒/毫秒),每天毫秒数只是少了最后一个因子1000,执行上述程序会发现求得微秒数时计算结果比正确结果小了200倍,而毫秒数的计算结果是正确的。
这是为什么?我们可以看到表达式右侧的所有因子均为int型数据,根据Java语言的特性,两个int型数据相乘结果为int类型,而求得微秒数的计算结果显然已经超出int类型数据的最大边界,导致内存溢出。
解决方案请参考Java变量及数据类型、Java自动类型转换、Java常用表达式。
案例
再举一个程序案例,其虽不会导致运行结果的错误,但是一定会令人一头雾水,不知其所以然。
看下面的代码:
public static void main(String args[]) {
System.out.println("kayak");
http: // www.baidu.com
System.out.println("hello");
}
这是一个存在争议的问题,如果正常地输出“kayak hello”,有人可能认为程序无法通过编译,并煞费苦心地进行调试,甚至还有人准备重启电脑。其实程序中URL的前半部分是Java中的一个语句标号(参考Java中的goto语句),后面是行尾注释,因此程序中没有任何非法语句,是可以正常运行的。
冀老师在传智播客的教学过程中尤其重视细节,他把每一个细节都讲的清晰透彻,让学员真正理解运用。
冀老师并不是单纯地讲解Java的三个知识点,而是通过这些例子说明细节的疏忽会导致运算结果的南辕北辙。冀老师告诫初学者,不要好高骛远、一味地追求软件架构或者最时髦的技术,而是要时刻牢记最基础的才是最核心的,成绩与荣誉都是一点一滴累积起来的。
把握好工作中的每个细节,是传智播客每一位讲师的教学责任,他们严格要求自己,也严格要求学员。酝酿奋斗过程中的细节之美,灵活运用细节带来的财富,从而使自己即使置身瓦砾之中,也能闪烁出钻石般的光芒!