函數與類:如何選擇使用哪個?為什麼?

閱讀時間約 9 分鐘
在程式設計中,我們通常會遇到一個問題: 何時應該使用具有方法的類別,何時應該在模組中使用函式? 如果選擇不當,你的程式碼可能比需要的更複雜,這使得維護更困難
首先,我們需要更好地理解函式和類別的差異。
  • 函式接收輸入參數,然後進行一些操作,並返回結果。你可以將這個結果傳遞給其他函式。在像Haskell這樣的函式語言中,甚至允許你將函式傳遞給函式,或讓函式返回其他函式。(Python 中的 Callable)
  • 在面向對象(物件導向)的程式語言,如Java,一切都圍繞著狀態(物件的狀態)。你有一些變數被組織成對象,這些對象是其他對象的一部分,形成一種階層結構。你甚至可以使用繼承來擴展這些對象結構的定義。
本文靈感來自:Functions vs Classes: When to Use Which and Why
以下範例程式均為 Python

當你的程式碼以行動為重點時,請使用函式

在這個例子中,我們有一個簡單的函式來分析數據:
def load_data(file_path):
# 載入數據的實作...
pass

def analyze_data(data):
# 分析數據的實作...
pass

def print_results(results):
# 打印結果的實作...
pass

# 使用函式
data = load_data('data.txt')
results = analyze_data(data)
print_results(results)
以一個分析數據的簡單應用程序為例,這是一個典型的以行動為主導的程序。我們從載入數據開始,然後進行分析,然後再進行第二次分析,並打印該信息。在這種情況下,函式是一種很好的組織程式碼的方式。

當你的程式碼以狀態為重點時,請使用類別

在這個例子中,我們有一個模擬銀行帳戶的類別:
class BankAccount:
def __init__(self, initial_balance):
self.balance = initial_balance

def deposit(self, amount):
self.balance += amount

def withdraw(self, amount):
if amount > self.balance:
raise ValueError("Insufficient balance!")
self.balance -= amount
銀行帳戶代表著一種狀態,並且我們可以創建該類的多個對象,即多個銀行帳戶。我們可以進行存款和提款操作,這些操作都會改變帳戶的狀態:
account = BankAccount(1000)
account.deposit(500)
account.withdraw(200)
更複雜的範例(多個帳戶互相操作)
class BankAccount:
def __init__(self, initial_balance):
self.balance = initial_balance

def deposit(self, amount):
self.balance += amount

def withdraw(self, amount):
if amount > self.balance:
raise ValueError("Insufficient balance!")
self.balance -= amount

def transfer(self, other_account: BankAccount, amount):
"""從此帳戶轉移金額到另一個帳戶"""
if amount > self.balance:
raise ValueError("Insufficient balance!")
self.withdraw(amount)
other_account.deposit(amount)

# 創建兩個帳戶
account1 = BankAccount(1000)
account2 = BankAccount(500)

# 從 account1 轉移 200 到 account2
account1.transfer(
other_account=account2,
amount=200
)
如果我們用函式來解決這個問題,將會更為複雜,因為銀行帳戶更注重狀態而非行動。這就是一種更適合用面向對象程式設計的情況。
的多個對象,即多個銀行帳戶。如果我們用函式來解決這個問題,將會更為複雜,因為銀行帳戶更注重狀態而非行動。這就是一種更適合用面向對象程式設計的情況。
我和其他的文章不一樣,既然說不好,就是要舉例啊
以下是使用函式的範例
使用函式來實現銀行帳戶互轉的功能,可以把帳戶的餘額存放在一個 dictionary 中,然後設計一些函式來對這些帳戶進行操作。以下是一個可能的實現:
def create_account(accounts, name, initial_balance):
accounts[name] = initial_balance

def deposit(accounts, name, amount):
accounts[name] += amount

def withdraw(accounts, name, amount):
if amount > accounts[name]:
raise ValueError("Insufficient balance!")
accounts[name] -= amount

def transfer(accounts, from_name, to_name, amount):
if amount > accounts[from_name]:
raise ValueError("Insufficient balance!")
withdraw(accounts, from_name, amount)
deposit(accounts, to_name, amount)

# 創建兩個帳戶
accounts = {}
create_account(accounts, 'account1', 1000)
create_account(accounts, 'account2', 500)

# 從 account1 轉移 200 到 account2
transfer(accounts, 'account1', 'account2', 200)
這種設計的優點和缺點:
優點:
  • 簡單:這種設計很簡單,我們只需要一個 dictionary 和一些操作帳戶的函式。
  • 與語言無關:這種設計可以在不支持面向對象程式設計的語言中使用。
缺點:
  • 難以管理複雜的情況:如果我們需要管理更複雜的帳戶,例如支持信用卡帳戶和儲蓄帳戶,那麼使用這種設計就變得更困難。我們可能需要添加更多的函式,或者更改現有的函式,這可能導致程式碼變得難以維護。
  • 無法利用面向對象的特性:這種設計無法利用面向對象程式設計的一些特性,例如封裝、繼承和多型性。例如,我們無法為帳戶添加新的屬性或方法,除非我們更改所有的函式。
看起來好像也沒有複雜很多對吧
對!因為以太坊區塊鏈的貨幣轉移就是這樣運作的,人家運做的很好啊
但假設你考慮進去很多因素:
ex
  • 一個帳號有台幣/美金/日圓
  • 每天有提領上限
  • 有 VIP 客戶有特殊權限
可能就會覺得用函數去發想有點複雜了吧
這邊我覺得任何程式的寫法都是一種取捨
沒有一定好壞之分
只有在你的情況下,哪種寫法比較適合你
總的來說,如果你的應用程式足夠簡單,使用函式來實現銀行帳戶互轉可能是一種好的選擇。然而,如果你需要管理更複雜的帳戶,或者你想要利用面向對象程式設計的特性,那麼使用類別可能是更好的選擇。
當然,Python 等語言可以靈活地使用這兩種方法。在許多情況下,使用函式和類別的組合會更有意義。如果你的程序更關注信息的流動,那麼使用更多的函式會更好;如果你的程序更關注狀態,那麼使用更多的類別會更好。
但也別忘了,實驗並嘗試不同的方法,可以幫助你更好地理解,並最終獲得更好的結果。
我是很喜歡用不同方式寫同一種東西啦,但在工作上有時間壓力又是另一回事了!
為什麼會看到廣告
對我來說 人生就是一個遊戲 活得開心,活得漂亮,活得成功,活得有意義 都是這場遊戲的一個個任務 我想要把這個遊戲打通關 在這裡我會分享一些我自己的經驗 把遊戲打通關的一些技巧 打通關的過程 和我自己發現的小 bug,或捷徑 遇到的喜怒哀樂 遇到的困難 遇到的挫折 歡迎大家一起來摸透和想受 這場人生遊戲
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
這篇文章介紹了一個在 Excel 中將郵遞區號加上括號的公式,並分析了公式的原理。這是一篇對於 Excel 公式拆解感興趣的人有價值的文章。
兩個看似八竿子打不著的事情 不過其實流程蠻像的 前幾天上到巢狀函數 老師教了三個流程 1.由想要的結果,來判斷會用到的函數有哪些 2.再判斷函數間的運算順序 3.把運算順序倒置,就是建立公式的程序
Thumbnail
上次有介紹EXCEL多組數據快速合併使用合併彙算快速將數據統計與分析,今天用相同的資料,但使用含數的方式來完成這項任務。 這次會用到的函數必須要是365版本的EXCEL才能使用唷!! 資料分為兩個部分: 品項:因為有3個月份,所以要將3個月份合併起來,我們會使用到VSTACK函數 月份的
Thumbnail
講到韓文數字,就不得不說生活中用的「物品」,大部分都會使用韓文數字,比如:點餐、購物這類的情況,跟人、事、物有關的,用韓文數字比較多,當然這只是概略的記憶法,細節分類還是要好好學習喲! 關於韓文數字的算法,在【我的第32堂韓語課】數字進階篇 已經講過了,這邊也不多贅述,今天想告訴你哪些句子裡常出現
Thumbnail
高效生活,幫助你找回更多自己的時間 哈囉,這裡是 AL 的 Googlesheet 學習筆記 本系列文章,會帶你認識各種函數,學習並應用於日常,加速生活與工作、提升效率 今天要介紹的函數是 if 和 ifs
Thumbnail
再經過了大約兩個禮拜的斡旋之後,威廉還是答應了這份工作。 初次在(或說終於在)韓國工作的威廉,原本該是新鮮且興奮的工作, 在威廉眼皮底下不知不覺地變了調。
Thumbnail
They are in the air. -Artist Suji Park 前陣子拜訪紐西蘭時,邀約了韓裔紐西蘭藝術家Suji Park共同談話,在來紐西蘭之前,因把主題定位在亞洲紐西蘭人的議題上,而連絡上了Suji。
Thumbnail
接著,筆者會教頂點怎麼求,也就是二次函數的整理,一開始「絕對不會直接用代數上課」,筆者一律用實際題目去講解,絕對不教y=ax^2+bx+c,理由相信大家都懂,對中上程度以下的人來說,多一個未知數都要花時間了,更何況全部都是代數。
Thumbnail
國三下數學,快解脫了同學們。下學期數學重點,嚴格說只有二次函數,後面是統計與機率、立體圖形,筆者應該會分兩部分,二次函數跟其他。因為二次函數的問題較多,統計與機率大致上還好,立體圖形也是,因為都接近會考,故以會考的角度來說,題目不會出太難,頂多一題,從投報率來說也不建議花太多功夫。 二次函數嚴格說
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
這篇文章介紹了一個在 Excel 中將郵遞區號加上括號的公式,並分析了公式的原理。這是一篇對於 Excel 公式拆解感興趣的人有價值的文章。
兩個看似八竿子打不著的事情 不過其實流程蠻像的 前幾天上到巢狀函數 老師教了三個流程 1.由想要的結果,來判斷會用到的函數有哪些 2.再判斷函數間的運算順序 3.把運算順序倒置,就是建立公式的程序
Thumbnail
上次有介紹EXCEL多組數據快速合併使用合併彙算快速將數據統計與分析,今天用相同的資料,但使用含數的方式來完成這項任務。 這次會用到的函數必須要是365版本的EXCEL才能使用唷!! 資料分為兩個部分: 品項:因為有3個月份,所以要將3個月份合併起來,我們會使用到VSTACK函數 月份的
Thumbnail
講到韓文數字,就不得不說生活中用的「物品」,大部分都會使用韓文數字,比如:點餐、購物這類的情況,跟人、事、物有關的,用韓文數字比較多,當然這只是概略的記憶法,細節分類還是要好好學習喲! 關於韓文數字的算法,在【我的第32堂韓語課】數字進階篇 已經講過了,這邊也不多贅述,今天想告訴你哪些句子裡常出現
Thumbnail
高效生活,幫助你找回更多自己的時間 哈囉,這裡是 AL 的 Googlesheet 學習筆記 本系列文章,會帶你認識各種函數,學習並應用於日常,加速生活與工作、提升效率 今天要介紹的函數是 if 和 ifs
Thumbnail
再經過了大約兩個禮拜的斡旋之後,威廉還是答應了這份工作。 初次在(或說終於在)韓國工作的威廉,原本該是新鮮且興奮的工作, 在威廉眼皮底下不知不覺地變了調。
Thumbnail
They are in the air. -Artist Suji Park 前陣子拜訪紐西蘭時,邀約了韓裔紐西蘭藝術家Suji Park共同談話,在來紐西蘭之前,因把主題定位在亞洲紐西蘭人的議題上,而連絡上了Suji。
Thumbnail
接著,筆者會教頂點怎麼求,也就是二次函數的整理,一開始「絕對不會直接用代數上課」,筆者一律用實際題目去講解,絕對不教y=ax^2+bx+c,理由相信大家都懂,對中上程度以下的人來說,多一個未知數都要花時間了,更何況全部都是代數。
Thumbnail
國三下數學,快解脫了同學們。下學期數學重點,嚴格說只有二次函數,後面是統計與機率、立體圖形,筆者應該會分兩部分,二次函數跟其他。因為二次函數的問題較多,統計與機率大致上還好,立體圖形也是,因為都接近會考,故以會考的角度來說,題目不會出太難,頂多一題,從投報率來說也不建議花太多功夫。 二次函數嚴格說