Taste of programmer——GAD

来源:互联网 发布:40x10÷1.25的简便算法 编辑:程序博客网 时间:2024/06/06 21:56

1:Linux Torvalds对于good taste的分享:

poor taste:


good taste:

2:这是一个关于初始化网格边缘的算法。

下面所写的是一个用来初始化网格边缘的算法,网格 grid 以一个二维数组表示:grid[行][列] 。

再次说明,这段代码的目的只是用来初始化位于 grid 边缘的点的值,所以,只需要给最上方一行、最下方一行、最左边一列以及最右边一列赋值即可。

为了完成这件事,我通过循环遍历 grid 中的每一个点,然后使用条件语句来测试该点是否位于边缘。代码看起来就是下面这样:

for (r = 0; r < GRID_SIZE; ++r) {    for (c = 0; c < GRID_SIZE; ++c) {        // Top Edge        if (r == 0)            grid[r][c] = 0;        // Left Edge        if (c == 0)            grid[r][c] = 0;        // Right Edge        if (c == GRID_SIZE - 1)            grid[r][c] = 0;        // Bottom Edge        if (r == GRID_SIZE - 1)            grid[r][c] = 0;    }}

虽然这样做是对的,但回过头来看,这个结构存在一些问题。

  1. 复杂性 — 在双层循环里面使用 4 个条件语句似乎过于复杂。
  2. 高效性 — 假设 GRID_SIZE 的值为 64,那么这个循环需要执行 4096 次,但需要进行赋值的只有位于边缘的 256 个点。

用 Linus 的眼光来看,将会认为这段代码没有 “good taste” 。

所以,我对上面的问题进行了一下思考。经过一番思考,我把复杂度减少为包含四个条件语句的单层 for 循环。虽然只是稍微改进了一下复杂性,但在性能上也有了极大的提高,因为它只是沿着边缘的点进行了 256 次循环。

for (i = 0; i < GRID_SIZE * 4; ++i) {    // Top Edge    if (i < GRID_SIZE)        grid[0][i] = 0;    // Right Edge    else if (i < GRID_SIZE * 2)        grid[i - GRID_SIZE][GRID_SIZE - 1] = 0;    // Left Edge    else if (i < GRID_SIZE * 3)        grid[i - (GRID_SIZE * 2)][0] = 0;    // Bottom Edge    else        grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0;}

的确是一个很大的提高。但是它看起来很丑,并不是易于阅读理解的代码。基于这一点,我并不满意。

我继续思考,是否可以进一步改进呢?事实上,答案是 YES!最后,我想出了一个非常简单且优雅的算法,老实说,我不敢相信我会花了那么长时间才发现这个算法。

下面是这段代码的最后版本。它只有一层 for 循环并且没有条件语句。另外。循环只执行了 64 次迭代,极大的改善了复杂性和高效性。

for (i = 0; i < GRID_SIZE; ++i) {    // Top Edge    grid[0][i] = 0;    // Bottom Edge    grid[GRID_SIZE - 1][i] = 0;    // Left Edge    grid[i][0] = 0;    // Right Edge    grid[i][GRID_SIZE - 1] = 0;}

这段代码通过每次循环迭代来初始化四条边缘上的点。它并不复杂,而且非常高效,易于阅读。和原始的版本,甚至是第二个版本相比,都有天壤之别。

至此,我已经非常满意了。

那么,我是一个有 “good taste” 的开发者么?

我觉得我是,但是这并不是因为我上面提供的这个例子,也不是因为我在这篇文章中没有提到的其它代码……而是因为具有 “good taste” 的编码工作远非一段代码所能代表。Linus 自己也说他所提供的这段代码不足以表达他的观点。

我明白 Linus 的意思,也明白那些具有 “good taste” 的程序员虽各有不同,但是他们都是会将他们之前开发的代码花费时间重构的人。他们明确界定了所开发的组件的边界,以及是如何与其它组件之间的交互。他们试着确保每一样工作都完美、优雅。

其结果就是类似于 Linus 的 “good taste” 的例子,或者像我的例子一样,不过是千千万万个 “good taste”。

原创粉丝点击