設計原則入門:開放封閉原則 Open-Closed Principle

閱讀時間約 1 分鐘

你有沒有遇過這樣的情況?當你設計一個系統時,一開始覺得一切順利,結果過了不久,客戶突然要求增加新功能。問題來了,每次改需求,你的程式碼都變得一團混亂,越改越多錯誤,最後讓你崩潰了。 軟體開發中需求變動是常態,但每次修改都得動到核心程式碼,難免會增加出錯的風險,也讓開發效率大打折扣。今天就要來聊聊「開放封閉原則」(Open-Closed Principle,簡稱 OCP)了。 開放封閉原則是什麼? 簡單來說,這個原則提倡「對擴展開放,對修改封閉」。意思就是當你要新增功能時,不應該去動到原本的程式碼,而是應該用擴展的方式來解決問題。這樣既能避免弄壞現有的功能,也能快速滿足新的需求。 舉個簡單的例子 想像你設計了一個程式,可以畫圖形。一開始只要支援圓形和方形,你的程式運作得很順利。但當客戶要你增加三角形、橢圓形時,你發現每次都要去修改程式碼,甚至得加入更多「如果是這個形狀就畫這樣」的條件。當圖形種類越來越多,程式就變得非常難以維護了。 這樣的做法違反了開放封閉原則,因為每次有新需求,都得去修改原本的邏輯,這樣增加了出錯的風險,也讓系統越來越複雜。 正確的設計應該怎麼做? 按照 OCP,我們應該設計一個架構,讓每種圖形有自己的「畫圖邏輯」。這樣一來當客戶要你新增三角形時,你只需要增加一個「三角形」的類別,不需要去動到畫圖的核心邏輯。這樣既符合 OCP,又讓系統變得更靈活。 為什麼要這麼麻煩? 開放封閉原則的好處在於「系統的穩定性與可擴展性」。當你能在不改動現有程式碼的情況下擴展功能,就能減少錯誤風險,保護現有的系統穩定運作。隨著系統變得越來越複雜,這種設計方式可以幫助你更好地維護程式。 總結一下,OCP 就像一個「保障」,讓你面對需求變更時,能更輕鬆地應對,也不用擔心把原本好好的功能弄壞。特別是在應對頻繁變更的需求時,這種設計原則的優勢會顯現得更為明顯。

設計原則的魅力在哪?參考我今年在iThome鐵人賽寫的文章吧。
https://ithelp.ithome.com.tw/articles/10354752

    avatar-img
    6會員
    83內容數
    對於經營自媒體、部落格或社群媒體感興趣?我專注於提供實用的寫作技巧、數位行銷策略,以及個人成長建議。 每週,我會分享提升寫作技巧、優化部落格經營、有效管理社群媒體、以及投資理財的寶貴知識。追蹤我,獲得實用的工具和建議,讓你的個人品牌和財務管理更上一層樓!
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    ShengYu的沙龍 的其他內容
    在寫程式的過程中,你是否遇過一個類別或模組負責了太多事情,結果導致程式變得難以維護?這類情況經常被稱為「巨石類別 (God Class)」。當我們對這樣的類別做出任何變更時,改動可能會牽一髮動全身影響其他部分,這時候「單一職責原則 (SRP)」便派上用場。 單一職責原則是什麼? 簡單來說,單一
    當你在開發應用程式時,可能會面臨要建立不同物件的需求。這時候簡單工廠模式(Simple Factory Pattern)是一個很實用的解決方案。今天我們就來用特斯拉汽車工廠的例子來解釋這個概念。 什麼是簡單工廠模式? 簡單工廠模式的核心思想是:將物件的建立過程封裝起來,客戶端(也就是使用者)只需要
    在學習設計模式時,可能會讓人感到困惑:「為什麼有這麼多種工廠模式?它們到底解決什麼問題?」工廠方法模式(Factory Method Pattern)提供了一種方式來建立單一物件,這個方法可以在子類中覆寫以產生不同的物件。而抽象工廠模式(Abstract Factory Pattern)在這個基礎上
    想像你是一位探險家,走進了一座神秘古城。這座城裡有著各種各樣的建築:宏偉的宮殿、莊嚴的神廟、熱鬧的市集。每個地方都有它獨特的風格和探索方式。作為探險家,你必須用不同的方法來了解每個地方,但你不需要改變這些建築本身,只要隨著地方變化調整探索的方式。這就是訪問者模式的精髓! 什麼是訪問者模式?
    想像你有一個非常珍愛的玩偶,這個玩偶獨一無二。如果你想要再擁有一個完全相同的玩偶,你會怎麼做呢?自己重新製作一個,可能需要很多時間和心力,但如果有一台神奇的「複製機」,只需按下按鈕,就可以立即產生一個一模一樣的玩偶,這會不會很輕鬆方便?這就是「原型模式(Prototype Pattern)」的核心概
    你有沒有玩過大型多人線上遊戲(MMO)?畫面上常常出現數百甚至數千名玩家,每個人都有不同的外觀和裝備。這時你有沒有想過,遊戲是怎麼在記憶體不爆炸的情況下管理這麼多角色的?其中一個祕密就是「享元模式」! 什麼是享元模式? 享元模式是一種設計模式,專門用來解決當系統中有大量相似物件時,如何有效減
    在寫程式的過程中,你是否遇過一個類別或模組負責了太多事情,結果導致程式變得難以維護?這類情況經常被稱為「巨石類別 (God Class)」。當我們對這樣的類別做出任何變更時,改動可能會牽一髮動全身影響其他部分,這時候「單一職責原則 (SRP)」便派上用場。 單一職責原則是什麼? 簡單來說,單一
    當你在開發應用程式時,可能會面臨要建立不同物件的需求。這時候簡單工廠模式(Simple Factory Pattern)是一個很實用的解決方案。今天我們就來用特斯拉汽車工廠的例子來解釋這個概念。 什麼是簡單工廠模式? 簡單工廠模式的核心思想是:將物件的建立過程封裝起來,客戶端(也就是使用者)只需要
    在學習設計模式時,可能會讓人感到困惑:「為什麼有這麼多種工廠模式?它們到底解決什麼問題?」工廠方法模式(Factory Method Pattern)提供了一種方式來建立單一物件,這個方法可以在子類中覆寫以產生不同的物件。而抽象工廠模式(Abstract Factory Pattern)在這個基礎上
    想像你是一位探險家,走進了一座神秘古城。這座城裡有著各種各樣的建築:宏偉的宮殿、莊嚴的神廟、熱鬧的市集。每個地方都有它獨特的風格和探索方式。作為探險家,你必須用不同的方法來了解每個地方,但你不需要改變這些建築本身,只要隨著地方變化調整探索的方式。這就是訪問者模式的精髓! 什麼是訪問者模式?
    想像你有一個非常珍愛的玩偶,這個玩偶獨一無二。如果你想要再擁有一個完全相同的玩偶,你會怎麼做呢?自己重新製作一個,可能需要很多時間和心力,但如果有一台神奇的「複製機」,只需按下按鈕,就可以立即產生一個一模一樣的玩偶,這會不會很輕鬆方便?這就是「原型模式(Prototype Pattern)」的核心概
    你有沒有玩過大型多人線上遊戲(MMO)?畫面上常常出現數百甚至數千名玩家,每個人都有不同的外觀和裝備。這時你有沒有想過,遊戲是怎麼在記憶體不爆炸的情況下管理這麼多角色的?其中一個祕密就是「享元模式」! 什麼是享元模式? 享元模式是一種設計模式,專門用來解決當系統中有大量相似物件時,如何有效減
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    一款遊戲的開發,肯定伴隨大大小小的修改和調整。 創作者不能怕改。但問題是,改東西需要花時間。一些看似簡單的改動,背後程式邏輯可能要好幾天,甚至幾星期才能修正。 對於不懂程式的人,有時很難判斷東西好不好修。所以今天就來說一下,對程式來說什麼樣的修正會令我們頭痛呢?   先以一個草莓奶油蛋糕為例
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
    物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    一款遊戲的開發,肯定伴隨大大小小的修改和調整。 創作者不能怕改。但問題是,改東西需要花時間。一些看似簡單的改動,背後程式邏輯可能要好幾天,甚至幾星期才能修正。 對於不懂程式的人,有時很難判斷東西好不好修。所以今天就來說一下,對程式來說什麼樣的修正會令我們頭痛呢?   先以一個草莓奶油蛋糕為例
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
    物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val