ABAP設計模式之---“簡單設計原則(Simple Design)”

“Simple Design”(簡單設計)是軟件開發中的一個重要理念,倡導以最簡單的方式實現軟件功能,以確保代碼清晰易懂、易維護,并在項目需求變化時能夠快速適應。

其核心目標是避免復雜過度設計,遵循“讓事情保持簡單”的原則,同時滿足當前的需求,而不過分關注遙遠、不確定的未來需求。

在這里插入圖片描述

Simple Design 應遵循的核心原則

Simple Design 通常與“XP(Extreme Programming,極限編程)”中的四個原則密切相關:

  1. 通過所有測試(Passes all tests)

    • 代碼應該是正確的,能夠滿足當前的功能需求。
    • 示例:如果需要實現一個用戶注冊功能,設計的代碼必須能夠通過所有相關的單元測試和功能測試,確保注冊邏輯無誤。
  2. 具有清晰表達力(Expresses intent clearly)

    • 代碼應該清晰易懂,能直觀地表達開發者的意圖。
    • 示例:變量命名、函數命名都應該有意義,一個名為 calculateTotalPrice 的函數比 doStuff 更清晰地說明其用途。
  3. 沒有重復(No duplication)

    • 消除代碼中的重復內容。重復會讓代碼臃腫,且隨著需求變化,重復代碼可能導致更多維護成本。
    • 示例:如果你在多個地方實現了類似的日期轉換邏輯,應該提取為一個通用的工具函數,不必重復編寫。
  4. 最少的類和方法(Minimal classes and methods)

    • 避免臃腫的類和方法設計。代碼應保持最少的結構來實現功能,而不是過度設計復雜的層次。
    • 示例:除非業務邏輯明確需要,盡量避免創建過多的小類來過早抽象或拆分邏輯。

軟件開發中應考慮的方面

在實踐“Simple Design”時,我們需要從以下幾個方面考慮以確保落地效果:

1. 避免過早優化
  • 優化是有成本的,尤其是過早優化可能使代碼變得復雜,且可能優化的地方并非性能瓶頸。
  • 示例:如果目前系統用戶并不多,不需要設計一個復雜的緩存系統。在需要時,再進行優化即可。
2. 聚焦當前需求
  • 避免“設計未來”的誘惑,僅為當前需求服務。在實際需求發生變化之前,不要為“可能發生”的需求特意設計。
  • 示例:如果當前只有“商品展示”功能,不需要為未來可能的“商品對比”功能提前設計復雜的結構。
3. 尋求代碼易讀性
  • 代碼寫給人看,最終由機器執行。確保同事能夠快速理解、擴展或者維護代碼。
  • 示例:一個復雜的算法實現,可以通過添加注釋、拆分方法或引入中間變量名稱來提升其可讀性。
4. 小步迭代和持續重構
  • 通過小步迭代驗證代碼的有效性,并定期重構來保持代碼的簡單性和清晰性。
  • 示例:使用 TDD(測試驅動開發),先通過精確的測試定義需求,然后一步步補充實現,并隨著復雜度增加,拆分為更清晰的模塊。
5. 盡量依賴高抽象工具
  • 充分利用框架、庫和通用抽象,而不是從頭造輪子。
  • 示例:如果需要處理 JSON 數據,可以使用現成的成熟庫(如 Java 的 Jackson 或 Python 的 json 模塊),而不是自己實現底層序列化和反序列化邏輯。

示例:用戶注冊功能中的 Simple Design 實踐

假設我們需要實現一個用戶注冊功能,我們可能的初步需求是:

  1. 用戶提交用戶名和密碼進行注冊;
  2. 系統驗證用戶名未被占用;
  3. 將用戶信息存儲到數據庫。
實現 Simple Design 的做法
  1. 初始設計代碼以盡量滿足需求為目標,不做過度設計:

    def register_user(username, password):if is_username_taken(username):raise ValueError("Username is already taken")hashed_password = hash_password(password)save_to_database(username, hashed_password)
    
  2. 避免重復:如果散布多處都實現了密碼加密邏輯,可以在單獨的工具模塊中實現:

    def hash_password(password):# 使用已有的成熟密碼哈希庫,如 bcryptimport bcryptsalt = bcrypt.gensalt()return bcrypt.hashpw(password.encode('utf-8'), salt)
    
  3. 明確表達意圖:為代碼命名賦予明確語義,避免含糊的實現,比如:

    • is_username_taken 而不是 check_user
    • save_to_database 而不是 add_user
  4. 聚焦當前需求:考慮到需求變更的可能性,我們應暫時忽略復雜的擴展比如“用戶郵箱驗證”或“多語言支持”,這些不是現階段的核心需求。

  5. 定期重構:隨著需求擴張,比如加入用戶郵箱驗證、用戶名生成策略時,可以逐步通過重構來保持設計的簡單性:

    class UserService:def register_user(self, username, password):if self._is_username_taken(username):raise ValueError("Username is already taken")hashed_password = self._hash_password(password)self._save_to_database(username, hashed_password)def _is_username_taken(self, username):# 邏輯...passdef _hash_password(self, password):# 邏輯...passdef _save_to_database(self, username, hashed_password):# 邏輯...pass
    

總結

Simple Design 強調在軟件開發中,以實現當前需求為目標,采用清晰、簡潔的方式完成設計。通過持續的小步迭代重構,逐步優化軟件結構,保證系統可維護、可擴展而沒有冗余復雜性。

牢記這四個原則:“通過所有測試、清晰表達意圖、沒有重復、最少的類和方法”,它們是 Simple Design 的主旋律,會在實際開發中為你指明方向。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83828.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多模態大語言模型arxiv論文略讀(105)

UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ?? 論文標題:UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ?? 論文作者:Zhaowei…

SQLServer中的存儲過程與事務

一、存儲過程的概念 1. 定義 存儲過程(Stored Procedure)是一組預編譯的 SQL 語句的集合,它們被存儲在數據庫中,可以通過指定存儲過程的名稱并執行來調用它們。存儲過程可以接受輸入參數、輸出參數,并且可以返回執行…

使用UDP連接ssh

使用UDP連接ssh mosh簡介兩端安裝moshWindows安裝mosh 放行端口使用mosh登錄Linuxdebug mosh簡介 Mosh最大的特點是基于UDP方式傳輸,支持在服務端創建一個臨時的Key供客戶端一次性連接,退出后失效;也支持通過SSH的配置進行認證,但…

軟件功能模塊歸屬論證方法

文章目錄 **一、核心設計原則****二、論證方法****三、常見決策模式****四、驗證方法****五、反模式警示****總結** 在討論軟件功能點應該歸屬哪些模塊時,并沒有放之四海而皆準的固定方法,但可以通過系統化的論證和設計原則來做出合理決策。以下是常見的…

ServBay 1.13.0 更新,新增第三方反向代理/內網穿透

ServBay 作為一款簡化本地開發環境搭建與管理的強大工具,致力于打造一個開箱即用、穩定可靠的本地開發平臺,讓用戶專注于代碼編寫,提升開發效率。 ServBay 1.13.0 正式發布!本次更新聚焦于提升本地開發項目的外部可訪問性、增強國…

如何利用樂維網管進行IP管理

IP管理是網絡管理中的關鍵環節,對于保障網絡的正常運行、提升資源利用效率以及保障網絡安全等方面都具有不可忽視的重要性。樂維網管在IP管理方面具有多種實用功能,以下從IP規劃與分配、IP狀態監測、IP沖突處理、IP審計與報表生成四個方面,介…

Go語言學習-->go的跨平臺編譯

Go語言學習–>go的跨平臺編譯 默認我們go build的可執行文件都是當前操作系統可執行的文件,Go語言支持跨平臺編譯——在當前平臺下編譯其他平臺的可執行文件。 eg:在windows界面的代碼,編譯完成后在linux上面運行 實現方式&#…

SpringBoot自動配置原理深度解析

一、引言 SpringBoot的"約定優于配置"理念極大地簡化了Spring應用的開發流程,而其核心魔法就是自動配置(Auto-Configuration)。本文將深入剖析自動配置的實現原理,幫助開發者更好地理解和定制SpringBoot應用。 二、自動配置核心機制 1. Ena…

使用阿里云百煉embeddings+langchain+Milvus實現簡單RAG

使用阿里云百煉embeddingslangchainMilvus實現簡單RAG 注意測試時,替換其中的key、文檔等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…

事件監聽 ——CAD C#二次開發

一、AutoCAD .NET API 事件機制 1. 事件監聽核心 - Database.ModifyObjects 事件 當數據庫中的實體(如圖形對象)發生修改時觸發,包括: - 幾何屬性變更(移動、縮放、旋轉)。 - 非幾何屬性變更&#xff08…

動量及在機器人控制中的應用

動量是物理學中的一個基本概念,在機器人學中也有重要應用。以下是詳細解釋: 1. 動量的基本定義 動量(Momentum)是描述物體運動狀態的物理量,定義為: 線性動量:$ p mv $ $ m $ 為質量&#xf…

LeetCode 2434.使用機器人打印字典序最小的字符串:貪心(棧)——清晰題解

【LetMeFly】2434.使用機器人打印字典序最小的字符串:貪心(棧)——清晰題解 力扣題目鏈接:https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/ 給你一個字符串 s 和一個機器人,機器人當前有一個…

影樓精修-AI衣服祛褶皺算法解析

注:為避免侵權,本文所用圖像均為AIGC生成或無版權網站提供; 衣服祛褶皺功能,目前在像素蛋糕、美圖云修、百度網盤AI修圖、阿里云都有相關的功能支持,它的價值就是將不平整的衣服圖像,變得整齊平整&#xf…

Celery 核心概念詳解及示例

Celery 核心概念詳解及示例 Celery 是一個簡單、靈活且可靠的分布式系統,用于處理大量消息,提供對任務隊列的操作,并支持任務的調度和異步執行。它常用于深度優化 Web 應用的性能和響應速度,通過將耗時的操作移到后臺異步執行&am…

智能對聯網頁小程序的倉頡之旅

#傳統楹聯遇上AI智能體:我的Cangjie Magic開發紀實 引言:一場跨越千年的數字對話 "云對雨,雪對風,晚照對晴空"。昨天晚上星空璀璨,當我用倉頡語言寫下第一個智能對聯網頁小程序的Agent DSL代碼時&#xff0…

《ERP原理與應用教程》第3版習題和答案

ERP原理與應用教程是一門系統介紹企業資源計劃(Enterprise Resource Planning, ERP)系統核心理論、技術架構及實施應用的綜合性課程。它主要面向管理類、信息類、工程類等專業學生及企業管理者,旨在培養對現代企業信息化管理的理解與實踐能力。以下是該課程的詳細解析: 一…

SOC-ESP32S3部分:32-LVGL顯示框架

飛書文檔https://x509p6c8to.feishu.cn/wiki/Ly6ywvphqi6HZlk38vHcz2OgnXg LVGL是一個開源的顯示框架,使用它可以加速我們開發帶顯示屏交互的應用。 IDF對于LVGL的支持一直有更新的,我們可以很方便在組件庫中搜索到對應版本的LVGL,并把它添…

原理圖與 PCB 設計流程及注意事項

原理圖與 PCB 設計流程及注意事項 一、原理圖設計 1. 首先,需要創建一個新的項目,在此項目中建立原理圖。 2. 接著,在原理圖中添加元件和芯片。可以從元件庫中挑選所需的元件,如電阻、電容等。既可以在元件庫中進行搜索查找&…

LeetCode--23.合并k個升序鏈表

解題思路: 1.獲取信息: 給出了多個升序鏈表,要求合并成一個升序鏈表,返回首元結點 2.分析題目: 外面在21題的時候,講了怎樣合并兩個升序鏈表為一個升序鏈表,不了解的,建議去看一下21…

【國產化適配】如何選擇高效合規的安全數據交換系統?

一、安全數據交換系統的核心價值與國產化需求 在數字化轉型浪潮中,企業數據流動的頻率與規模呈指數級增長,跨網文件傳輸已成為日常運營的剛需,所以安全數據交換系統也是企業必備的工具。然而,數據泄露事件頻發、行業合規要求趨嚴…