」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 一級抽象:簡潔函數的關鍵

一級抽象:簡潔函數的關鍵

發佈於2024-11-07
瀏覽:740

One Level of Abstraction: The Key to Clean Functions

曾經在看過一個函數後,感到迷失在它的複雜性中嗎?讓我們探討乾淨程式碼的基本原則:函數應該只維護一個抽象層級。

這是在 Web 應用程式中建立使用者的真實範例:

// ❌ A function doing too many things at different abstraction levels
function createUser(userData) {
  // Validate data
  if (!userData.email || !userData.email.includes('@')) {
    return 'Invalid email';
  }
  if (userData.password.length 



這個函數混合了不同層次的抽象:

  • 高階業務邏輯(使用者建立流程)
  • 中階作業(資料驗證、格式化)
  • 低階詳細資料(密碼雜湊)

讓我們以單層抽象原則重構它:

// ✅ Clean version with one level of abstraction
function createUser(userData) {
  const validationError = validateUserData(userData);
  if (validationError) return validationError;

  const securePassword = hashPassword(userData.password);
  const formattedUser = formatUserData(userData.email, securePassword);

  return saveUserToDatabase(formattedUser);
}

function validateUserData({ email, password }) {
  if (!email || !email.includes('@')) return 'Invalid email';
  if (password.length 



這種方法的好處

  1. 可讀性:主要功能讀起來像一個故事,描述了高層發生的事情
  2. 可維護性:每個功能都有單一職責,使變更更安全
  3. 可測試性:可以獨立測試每一段邏輯
  4. 可重複使用性:這些重點功能可以在其他上下文中重複使用

重點

編寫函數時:

  • 讓他們專注於一個抽象層次
  • 將複雜的操作提取到命名良好的函數中
  • 讓main函數說故事
  • 將每個功能視為流程中的一個步驟

記住:如果您在同一個函數中混合“如何”和“什麼”,您可能正在處理多個抽象級別。分開吧!

版本聲明 本文轉載於:https://dev.to/56_kode/one-level-of-abstraction-the-key-to-clean-functions-2ekb?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 Gorilla Websocket 在 Go Websocket 應用程式中向特定用戶端發送目標訊息?
    如何使用 Gorilla Websocket 在 Go Websocket 應用程式中向特定用戶端發送目標訊息?
    Go with Gorilla Websocket 中的特定客戶端訊息傳遞在websocket 通訊領域,向特定客戶端發送訊息的能力對於建立即時應用程式至關重要。然而,預設的 websocket 範例通常會示範同時向所有連線的用戶端廣播訊息。 為了解決這個問題,我們可以採用一種方法,為每個客戶端分配...
    程式設計 發佈於2024-11-08
  • O - 開閉原理 (OCP)
    O - 開閉原理 (OCP)
    What is Open/Closed Principle(OCP)? According to the Open/Closed Principle, "Objects or entities (such as classes, modules, functions, etc.) ...
    程式設計 發佈於2024-11-08
  • C 的力量:創造一個為世界提供動力的系統
    C 的力量:創造一個為世界提供動力的系統
    C 是一種強大的程式語言,因其高效、可移植和低階控製而聞名。它廣泛用於開發關鍵任務系統,如作業系統、嵌入式系統和資料結構。其特點包括:高效率:C 程式碼直接編譯為機器碼,實現更高執行效率。可移植:C 可以跨多種平台運行,方便在各種裝置上部署應用程式。低階訪問:C 提供對硬體和記憶體的低階訪問,允許精...
    程式設計 發佈於2024-11-08
  • Google Sheets 到 MySQL 只需幾分鐘
    Google Sheets 到 MySQL 只需幾分鐘
    Google Sheets 数据导入 MySQL:初学者指南 您是否希望将 Google Sheets 数据转换为 MySQL 数据库?如果是这样,那么您来对地方了!在这个适合初学者的教程中,我们将引导您完成将 Google Sheets 数据导入 MySQL 数据库的过程。 如果您没有编码背景,请...
    程式設計 發佈於2024-11-08
  • 如何在 MySQL 中將紀元數字轉換為人類可讀的日期?
    如何在 MySQL 中將紀元數字轉換為人類可讀的日期?
    在 MySQL 中將紀元數轉換為人類可讀的日期在資料庫管理領域,經常需要將紀元數轉換為人類可讀的日期。紀元編號表示自訂紀元以來的某個時間點,通常用於在 MySQL 等資料庫系統中儲存時態資料。 假設您有一個紀元編號,例如 1389422614485,它代表一個特定的時間點。該值的資料類型是varch...
    程式設計 發佈於2024-11-08
  • 介紹 simpledev.css
    介紹 simpledev.css
    simpledev.css 是一個新的 CSS 框架,我將其描述為大多數無類別框架。我稱之為無類,因為許多程式碼使用類型選擇器,因此您不必添加許多類別來設定網頁樣式。有一些類,但我們盡量將它們保持在最低限度(到目前為止只有大約 42 個類)。 讓我們回顧一下下面的一些功能! 特徵...
    程式設計 發佈於2024-11-08
  • 掌握影像分割:傳統技術如何在數位時代仍然大放異彩
    掌握影像分割:傳統技術如何在數位時代仍然大放異彩
    介绍 图像分割是计算机视觉中最基本的过程之一,它允许系统分解和分析图像内的各个区域。无论您是在处理对象识别、医学成像还是自动驾驶,分割都可以将图像分解为有意义的部分。 尽管深度学习模型在这项任务中越来越受欢迎,但数字图像处理中的传统技术仍然强大且实用。本文回顾的方法包括阈值处理、边...
    程式設計 發佈於2024-11-08
  • 系統整合測試:確保無縫軟體集成
    系統整合測試:確保無縫軟體集成
    在軟體開發的動態環境中,確保系統的各個組件或模組無縫地協同工作對於提供可靠且高效能的軟體解決方案至關重要。這篇部落格文章深入探討了系統整合測試 (SIT),這是軟體測試生命週期中的關鍵階段,用於驗證整合組件之間的交互,確保系統的整體功能和可靠性。 什麼是系統整合測試? 系統整合測試 (SIT) ...
    程式設計 發佈於2024-11-08
  • 掌握 Angular Table 中可調整大小的欄位:開發人員逐步指南
    掌握 Angular Table 中可調整大小的欄位:開發人員逐步指南
    如何在 Angular 表中创建可调整大小的列:分步指南 Angular Material 表提供了一种时尚的数据显示方式。然而,用户通常需要额外的功能,例如调整表列大小以更好地控制数据显示的能力。在本指南中,我们将逐步介绍使用自定义指令在 Angular 表中创建可调整大小的列的...
    程式設計 發佈於2024-11-08
  • 如何依子值升序對多維 PHP 陣列進行排序?
    如何依子值升序對多維 PHP 陣列進行排序?
    PHP:以子值對多維數組進行排序此問題旨在根據「mid」子值對多維 PHP 數組進行排序。為了實現這一點,響應者建議使用 usort 函數,它允許基於比較的排序。 代碼如下:function cmp($a, $b) { return $a["mid"] - $b[...
    程式設計 發佈於2024-11-08
  • 如何在 Django 中創建一個簡單的調度程序
    如何在 Django 中創建一個簡單的調度程序
    如果您需要每X 分鐘/秒等運行一個函數來進行一些清理,觸發一些操作,您可以在線程模組和django 自訂cli 的幫助下執行一個簡單的調度程序命令。 假設我想每 5 秒呼叫一個函數以在外部 API 上發布一些內容。 在您的 django 應用程式中建立一個名為 management 的資料夾/包...
    程式設計 發佈於2024-11-08
  • 引導實用程式
    引導實用程式
    Bootstrap 實用程式是一組功能強大的類,可讓您的網站樣式設定更輕鬆、更快捷,而無需編寫自訂 CSS。讓我們深入了解基礎知識! 什麼是 Bootstrap 實用程式? Bootstrap 實用程式是預先定義的 CSS 類,您可以將它們直接套用於 HTML 元素以控制其外觀或行為。這些實用程...
    程式設計 發佈於2024-11-07
  • 修復下拉式選單/工具提示等隱藏的溢出
    修復下拉式選單/工具提示等隱藏的溢出
    您是否曾嘗試為您的按鈕建立下拉列表,然後選擇但隨後被溢出隱藏阻止? 然後你該怎麼做,然後你使用javascript將元素丟到DOM的根目錄,然後根據觸發元素矩形定位元素,每次佈局更改時重新計算,發生滾動和調整視窗大小,不是很有效的。 首先我想說的是它還沒有完全支持,但現在有一個polyfill可...
    程式設計 發佈於2024-11-07
  • 如何使用中間件方法有效處理 Gin Web 應用程式中的錯誤?
    如何使用中間件方法有效處理 Gin Web 應用程式中的錯誤?
    增強 Gin 中的錯誤處理Gin 的自訂錯誤處理涉及使用中間件來處理錯誤回應。這允許錯誤邏輯與正常流程邏輯分離。 錯誤處理中介軟體type appError struct { Code int Message string } func JSONAppErrorReporter...
    程式設計 發佈於2024-11-07
  • 如何使用 Python 和 Medium API 將文章發佈到 Medium
    如何使用 Python 和 Medium API 將文章發佈到 Medium
    介紹 作為使用 Obsidian 撰寫文章的人,我經常發現自己在發佈到 Medium 時需要手動複製和格式化我的內容。此過程可能非常耗時且重複,尤其是在處理 Markdown 文件時。為了簡化我的工作流程,我決定開發一個 Python 腳本,自動將 Markdown 檔案直接發佈到...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3