Taste of programmer——GAD

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”。

發佈了136 篇原創文章 · 獲贊 25 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章