軟體工程筆記 | 文件註解與類型提示:提升Python程式碼的可讀性與可維護性

閱讀時間約 7 分鐘
本文靈感來自:How to Document Your Code Like a Pro
以下範例程式均為 Python
推薦插件:better comment

前言

程式碼的有效文件化是編程最重要的部分之一
Python 提升可讀性有以下方式:
  • 註釋
  • 類型提示
  • 文檔字串
這些實踐可以提高程式碼的可讀性和可維護性,並可以幫助開發者更好地理解和調試程式碼。

寫註釋心法

  • 解釋複雜的部分:如果你的代碼包含了複雜的算法或者技巧,你應該加註釋來解釋。
  • 描述大的代碼塊:如果一段代碼完成了一個特定的任務,應該在其開始處添加註釋,描述它的功能和作用。
  • 使用標準格式:許多程式語言都有標準的註釋格式,例如Java的Javadoc和Python的docstring。使用這些標準格式可以使得你的註釋更容易理解和使用。
  • 避免過度註釋:不必對每一行代碼都寫註釋。如果代碼清晰易讀,則無需再添加註釋。(理論上是希望寫的都可讀性很好不需要註釋啦,但包含較複雜業務邏輯是無可必免)
  • 寫註釋時思考閱讀者怎麼讀(換位思考):當你寫註釋時,試著想像讀者的角度。他們可能不熟悉你的代碼,所以確保你的註釋足夠清晰和完整。
實際上,如何好的代碼註釋在碼中起著重要的角色,它可以幫助開發者理解和維護代碼。以下是一些特徵來定義什麼是好的代碼註釋:
  • 明確:註釋應該清楚地解釋代碼的目的。如果代碼的功能或行為不清楚,註釋應該提供解釋。
  • 簡潔:註釋不應該冗長。如果可以用更少的文字表達相同的概念,那就應該這樣做。
  • 準確:註釋應該準確地描述代碼的行為。如果代碼的行為改變了,註釋也應該隨之更新。
  • 必要:不是所有的代碼都需要註釋。如果代碼已經足夠清晰,那麼添加註釋可能只會變得更加混亂。

註釋

註釋是程式碼中的文字說明,對於理解特定的程式碼段非常有用。然而,需要注意的是,過多的註釋可能導致程式碼變得混亂,因此要專注於解釋為什麼進行某些操作,而不僅僅是如何進行。

舉例一

好的註釋:
# 用戶輸入一個數字,該函數將回傳該數字的平方
def square(number):
return number * number
在這個例子中,註釋對這段程式碼的功能做出了明確的解釋,它解釋了該函數的目的並說明了輸入值的預期型別。
不好的註釋:
# 計算平方
def square(number):
return number * number
在這個例子中,註釋只是簡單地重複了函數名稱,並沒有提供額外的解釋或說明。這種情況下的註釋並不有用,因為它並沒有提供任何新的、有價值的信息。

舉例二 (複雜版)

def fibonacci(n):
"""
計算並返回斐波那契數列的第n個數字。

Parameters:
n (int): 需要計算的斐波那契數列元素的數量

Returns:
int: 斐波那契數列的第n個元素
"""

# 遞迴調用函數本身,直到n為0或1
if n <= 0:
return 0
elif n == 1:
return 1
else:
# n 大於1時,計算前兩個元素的和
return fibonacci(n-1) + fibonacci(n-2)


def sum_fibonacci(n):
"""
計算並Returns斐波那契數列的前n個數字之和。

Parameters:
n (int): 需要計算的斐波那契數列元素的數量

Returns:
int: 斐波那契數列的前n個元素之和
"""
total = 0
for i in range(n):
# 累加從第一個元素到第n個元素的值
total += fibonacci(i)
return total
註釋應該用來解釋程式碼的功能和目的,並澄清可能存在的任何模糊或複雜的部分。如果註釋只是重複程式碼本身的內容,那麼它就沒有發揮其應有的作用。

類型提示

(這個算是 Python 獨有的,因為 Python 是動態語言不需要類型提示,但是如果有類型提示,可以讓程式碼更好閱讀,我自己是都會加上類型提示)
類型提示是Python 3.5之後引入的特性,它們提供了一種明確指定變量和函數Returns值類型的方式。這不僅使得程式碼更清晰,而且還可以幫助防止錯誤的發生。例如,在執行銀行轉帳操作時,將金額明確定義為整數可以避免混淆和可能的錯誤。
from typing import List, Tuple

def calculate_sum_and_product(numbers: List[int]) -> Tuple[int, int]:
"""
計算一個整數列表的總和和乘積。

Parameters:
numbers (List[int]): 一個整數列表

Returns:
Tuple[int, int]: 包含總和和乘積的元組
"""
sum_of_numbers = sum(numbers)
product_of_numbers = 1
for num in numbers:
product_of_numbers *= num

return sum_of_numbers, product_of_numbers
在這個例子中,calculate_sum_and_product函數有一個Parametersnumbers,它的類型被註明為List[int],表示它應該是一個整數列表。此函數的Returns類型被註明為Tuple[int, int],表示它將Returns一個包含兩個整數的元組。
這樣的類型提示讓我們在編寫或閱讀程式碼時就能了解每個函數的輸入和輸出類型,這對於理解程式碼的運作方式,以及避免因類型錯誤導致的bug非常有幫助。

文檔字串

以上舉例中在 """ """ 之間的文字就是 docstrings
文檔字串是對函數、方法、類和模組進行詳細說明的工具。使用文檔字串,開發者可以生成詳細的文檔網站,方便其他開發者或使用者查閱。VS Code的Auto Docstring擴展和GitHub Copilot等工具可以自動生成文檔字串,節省開發者的時間和精力。然而,需要注意的是,這些工具可能會生成過多的文檔,導致程式碼變得冗長。
文檔字串也能幫助生成文件,可以透過 “mkdocstrings” 來直接使用 Python 的 docstrings 生成文檔。該插件能夠自動解析你的 Python 程式碼中的 docstrings,然後將其轉換為 MkDocs 格式。

結論

編寫清晰、組織良好的程式碼是比寫大量的註釋和文檔更有效的方式。
良好的命名和組織可以使你的程式碼更易於理解,並減少需要大量文件化的需要。
因此,我們應將焦點放在編寫高質量的程式碼,而不僅僅是文件化。
為什麼會看到廣告
    對我來說 人生就是一個遊戲 活得開心,活得漂亮,活得成功,活得有意義 都是這場遊戲的一個個任務 我想要把這個遊戲打通關 在這裡我會分享一些我自己的經驗 把遊戲打通關的一些技巧 打通關的過程 和我自己發現的小 bug,或捷徑 遇到的喜怒哀樂 遇到的困難 遇到的挫折 歡迎大家一起來摸透和想受 這場人生遊戲
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    在程式設計中,我們通常會遇到一個問題: 何時應該使用具有方法的類別,何時應該在模組中使用函式? 如果選擇不當,你的程式碼可能比需要的更複雜,這使得維護更困難 首先,我們需要更好地理解函式和類別的差異。 函式接收輸入參數,然後進行一些操作,並返回結果。你可以將這個結果傳遞給其他函式。在像Haskell
    在程式設計中,我們通常會遇到一個問題: 何時應該使用具有方法的類別,何時應該在模組中使用函式? 如果選擇不當,你的程式碼可能比需要的更複雜,這使得維護更困難 首先,我們需要更好地理解函式和類別的差異。 函式接收輸入參數,然後進行一些操作,並返回結果。你可以將這個結果傳遞給其他函式。在像Haskell
    你可能也想看
    Google News 追蹤
    Thumbnail
    在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
    Thumbnail
    在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
    Thumbnail
    本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
    Thumbnail
    Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
    Thumbnail
    今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
    對於程序式編程來說,程式是由一系列的指令組成,例如計算數值、印出訊息、修改變數、呼叫子程序、配置變數的記憶體空間等。定義函式是為了讓一些程序可以重複利用,因此稱為子程序,其中參數為子程序中特別的變數,讓我們能夠透過它們控制子程序的行為。函式的回傳值只是一種方便將結果帶回來的方法,但一般只能回傳一個值
    Thumbnail
    Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
    Thumbnail
    本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
    Thumbnail
    宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
    Thumbnail
    本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
    Thumbnail
    在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
    Thumbnail
    在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
    Thumbnail
    本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
    Thumbnail
    Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
    Thumbnail
    今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
    對於程序式編程來說,程式是由一系列的指令組成,例如計算數值、印出訊息、修改變數、呼叫子程序、配置變數的記憶體空間等。定義函式是為了讓一些程序可以重複利用,因此稱為子程序,其中參數為子程序中特別的變數,讓我們能夠透過它們控制子程序的行為。函式的回傳值只是一種方便將結果帶回來的方法,但一般只能回傳一個值
    Thumbnail
    Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
    Thumbnail
    本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
    Thumbnail
    宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
    Thumbnail
    本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。