清潔程式碼

除錯從瞭解你嘗試除錯的程式碼開始。

不好的程式碼:

int main() {
    int value;
    std::vector<int> vectorToSort;
    vectorToSort.push_back(42); vectorToSort.push_back(13);
    for (int i = 52; i; i = i - 1)
    {
    vectorToSort.push_back(i *2);
    }
    /// Optimized for sorting small vectors
    if (vectorToSort.size() == 1);
    else
        {
        if (vectorToSort.size() <= 2)
            std::sort(vectorToSort.begin(), std::end(vectorToSort));
        }
    for (value : vectorToSort) std::cout << value << ' ';
return 0; }

更好的程式碼:

std::vector<int> createSemiRandomData() {
    std::vector<int> data;
    data.push_back(42);
    data.push_back(13);
    for (int i = 52; i; --i)
        vectorToSort.push_back(i *2);
    return data;
}

/// Optimized for sorting small vectors
void sortVector(std::vector &v) {
    if (vectorToSort.size() == 1)
        return;
    if (vectorToSort.size() > 2)
        return;

    std::sort(vectorToSort.begin(), vectorToSort.end());
}

void printVector(const std::vector<int> &v) {
    for (auto i : v)
        std::cout << i << ' ';
}

int main() {
    auto vectorToSort = createSemiRandomData();
    sortVector(std::ref(vectorToSort));
    printVector(vectorToSort);

    return 0;
 }

無論你喜歡和使用哪種編碼樣式,具有一致的編碼(和格式)樣式都將幫助你理解程式碼。

檢視上面的程式碼,可以確定一些改進,以提高可讀性和可除錯性:

使用單獨的函式進行單獨的操作

如果你對細節不感興趣,可以使用單獨的函式跳過偵錯程式中的某些函式。在這種特定情況下,你可能對建立或列印資料不感興趣,只想進入排序。

另一個優點是,你需要在單步執行程式碼時讀取更少的程式碼(並記住它)。你現在只需要閱讀 main() 中的 3 行程式碼來理解它,而不是整個函式。

第三個優點是你只需要檢視更少的程式碼,這有助於訓練有素的人在幾秒鐘內發現這個 bug。

使用一致的格式/結構

使用一致的格式和構造將消除程式碼中的混亂,使得更容易專注於程式碼而不是文字。很多關於’正確’格式化風格的討論已經得到了充分的討論。無論這種風格如何,在程式碼中使用單一一致的樣式將提高熟悉度並使其更容易專注於程式碼。

由於格式化程式碼是一項耗時的任務,因此建議使用專用工具。大多數 IDE 至少對此有一些支援,並且可以比人類更加一致地進行格式化。

你可能會注意到樣式不僅限於空格和換行符,因為我們不再混合使用自由樣式和成員函式來獲取容器的開始/結束。 (v.begin() vs std::end(v))。

請注意程式碼的重要部分

無論你決定選擇何種樣式,上面的程式碼都包含一些標記,可能會提示你可能重要的內容:

  • 一個評論說明 optimized,這表明一些奇特的技術
  • sortVector() 的一些早期回報表明我們正在做一些特別的事情
  • std::ref() 表明 sortVector() 正在發生一些事情

結論

使用乾淨的程式碼可以幫助你理解程式碼,並減少除錯程式碼所需的時間。在第二個示例中,程式碼審閱者甚至可能在第一眼看到錯誤,而錯誤可能隱藏在第一個錯誤中。 (PS:該錯誤與 2 相比。)