代码赏析-什么样的代码能称得上艺术二字
2015-11-09 23:01
316 查看
人类的最原始的认知来源于模仿,而后才是自我创造。可以说绝大多数的人都是如此,天才毕竟不多。在写代码的过程中,也会遵循此过程,优秀的程序员往往都经历过一个过程—阅读优秀的源码。本系列的博客会陆续贴一些我在读到看到的让我眼前一亮的代码供大家赏玩。作为开篇,以SICP的一道习题开始:
练习1.3: 请定义一个过程,它以三个数为参数,返回齐其中较大的两个数之和。
其实,
如果让我来写这段代码,我会这么写:
上面的代码真的就是普普通通、中规中矩,简单的完成了题目所要求的功能,几乎没有任何美感之言。当然从正确性上说,也没考虑结果
下面我们来欣赏下Joe给出的堪称艺术品的代码:
这段代码真的是非常的巧妙,真的是达到了如何判断一件作品是否是艺术的四个标准:
这段代码非人不能写出,富于想象力
这段代码除了实现既定功能外,具有高度的表现力
这段代码传递的美感和思想超越了它自身
总之,这段代码很美
—Joe Marshall
这段代码的巧妙之处在于利用函数调用的栈完成了参数的移动,表现力极强。总之,这段代码很美。我是同意的。
秉着学以致用的原则,我们能从上面这段代码所学的技巧能不能有所用处呢?请读者接着往下看
问题:给定三个数,求其中的最小值。
在编程课上我们绝大多数都做过类似的编程练习,来练习
代码一
这段代码实在是太普通了,我们再看下一段
代码二
比代码一似乎好了些,但是距离我们称之为艺术品的代码还差的很远。我们来模仿下上文提到的堪称艺术品的代码
代码三
以后遇到类似功能的代码,我们也可以炫技一下。
练习1.3: 请定义一个过程,它以三个数为参数,返回齐其中较大的两个数之和。
其实,
SICP在学校的时候就在读,工作后又读过,每每读到第四章章后就被莫名的事情中断。
练习1.3从未吸引过我的注意,记得是在“负暄琐话”的博客中看到的一篇文章让我记忆深刻。时隔几年才开始在
csdn写文章,主要是
csdn以前的编辑器我太不喜欢了,现在支持
markdown语法实在是太开心了。打算重新记录一些有趣的文章。
如果让我来写这段代码,我会这么写:
long sumSquareLargest(int x, int y, int z) { if (x <= y && x <= z) { return y * y + z * z; } else if (y <= x && y <= z) { return x * x + z * z; } else { return x * x + y * y; } }
上面的代码真的就是普普通通、中规中矩,简单的完成了题目所要求的功能,几乎没有任何美感之言。当然从正确性上说,也没考虑结果
overflow的情况。
下面我们来欣赏下Joe给出的堪称艺术品的代码:
long sumSquareLargest(int x, int y, int z) { if (x <= y && x <= z) { return y * y + z * z; } return sumSquareLargest(y, z, x); }
这段代码真的是非常的巧妙,真的是达到了如何判断一件作品是否是艺术的四个标准:
这段代码非人不能写出,富于想象力
这段代码除了实现既定功能外,具有高度的表现力
这段代码传递的美感和思想超越了它自身
总之,这段代码很美
—Joe Marshall
这段代码的巧妙之处在于利用函数调用的栈完成了参数的移动,表现力极强。总之,这段代码很美。我是同意的。
秉着学以致用的原则,我们能从上面这段代码所学的技巧能不能有所用处呢?请读者接着往下看
问题:给定三个数,求其中的最小值。
在编程课上我们绝大多数都做过类似的编程练习,来练习
if
else的使用。通常的代码是这个样子的:
代码一
long min(long x, long y, long z) { if (x <= y && x <= z) { return x; } else if (y <= z && y<= x) { return y; } else { return z; } }
这段代码实在是太普通了,我们再看下一段
代码二
long min(long x, long y) { return x <= y ? x : y; } long min(long x, long y, long z) { return min(min(x, y), z); }
比代码一似乎好了些,但是距离我们称之为艺术品的代码还差的很远。我们来模仿下上文提到的堪称艺术品的代码
代码三
long min(int x, int y, int z) { if (x <= z && x <= y) { return x; } return min(y, z, x); }
以后遇到类似功能的代码,我们也可以炫技一下。
相关文章推荐
- java查看工具jhat-windows
- newmat10库的编译
- 从头认识java-7.8 接口与工厂模式
- java重载与重写的区别+重写父类equals方法的完美实现
- 多线程性能及效率问题
- java中的this关键字的总结
- Perl 多进程与多线程编程
- python 中文字符问题
- 什么是bind函数,为什么要使用bind函数
- 全错位排列问题
- lambda表达式的实质——什么是lambda表达式,为什么要使用lambda表达式
- 第10周-银行类-ArrayList
- 回调函数的实质——什么是回调函数,为什么要使用回调函数
- C语言编写年月日格式时间转换为格林威治时间
- python机器学习《回归 一》
- Python标准库 多线程与同步 (threading包)
- java反射机制(3)---关于Javabean的内省
- java rxtx串口通信遇到Error 0x5 at ..\src\termios.c(892): 拒绝访问
- java获取泛型类型
- POJ 2262 Goldbach's Conjecture