首頁 >web前端 >js教程 >了解乾淨的程式碼:類別 ⚡️

了解乾淨的程式碼:類別 ⚡️

王林
王林原創
2024-09-10 11:09:02910瀏覽

Understanding Clean Code: Classes ⚡️

類別在物件導向程式設計中至關重要,但設計不當的類別可能會導致有問題的程式碼。

《整潔代碼》第 10 章強調了具有單一職責的內聚類的重要性。

在本文中,我們將分享關鍵見解並示範它們在 JavaScript 中的應用。


?什麼是階級凝聚力?

內聚度是指類的職責之間的緊密程度。

有凝聚力的班級專注於單一目標,並具有自然契合的職責。

這使得類別簡單、可讀且易於維護。

範例:低內聚力

class User {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  // Handles user registration
  register() {
    // Registration logic
  }

  // Sends email to user
  sendEmail(message) {
    // Email sending logic
  }

  // Logs activity of the user
  logActivity(activity) {
    console.log(`${this.name} performed: ${activity}`);
  }
}

在上面的範例中,User 類別有三個不相關的職責:使用者註冊、傳送電子郵件和記錄活動。

這個類別缺乏凝聚力,因為它試圖同時做太多事情。


?單一職責原則 (SRP)

單一職責原則規定,一個類別應該有一個且只有一個更改的理由。這意味著每個類別都應該專注於一個問題。

如果一個類別具有多個職責,則一個區域的變更可能會破壞另一個區域的功能。

⚡️ SRP 重構

讓我們重構上面的範例以遵守 SRP:

class User {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }
}

class UserRegistrationService {
  register(user) {
    // Registration logic
  }
}

class EmailService {
  sendEmail(user, message) {
    // Email sending logic
  }
}

class ActivityLogger {
  logActivity(user, activity) {
    console.log(`${user.name} performed: ${activity}`);
  }
}

現在,每個類別都有一個職責:

  • User:代表使用者對象,儲存資料。
  • UserRegistrationService:處理使用者註冊。
  • EmailService:處理發送電子郵件。
  • ActivityLogger:處理記錄使用者活動。

採用這種結構,電子郵件系統的變更不會影響使用者註冊邏輯,反之亦然。


? SRP 和凝聚力的好處

  • 可維護性:當一個類別具有單一職責時,更容易找到和修復錯誤。您不需要費力地處理不相關的邏輯。

  • 可擴充性:隨著專案的發展,遵守 SRP 可以更輕鬆地增加新功能。可以在新類別中新增功能,而無需觸及現有功能。

  • 可測試性:具有單一職責的類別更容易測試。每個類別都有有限的範圍,因此單元測試可以專注於各個功能。


?識別責任重疊

為了確保您的班級具有凝聚力,請尋找多個職責相結合的區域。

通常,一個類別一開始很簡單,但隨著功能的添加,它可以累積額外的職責。

範例:重建支付系統

假設我們有一個 PaymentProcessor 類別來處理多個任務:

class PaymentProcessor {
  constructor() {
    this.paymentGateway = new PaymentGateway();
  }

  processPayment(paymentDetails) {
    // Payment processing logic
  }

  validatePaymentDetails(paymentDetails) {
    // Validation logic
  }

  logTransaction(paymentDetails) {
    console.log(`Payment processed: ${JSON.stringify(paymentDetails)}`);
  }
}

在這裡,PaymentProcessor 負責處理付款、驗證詳細資訊和記錄交易。

這是重構與分割職責的機會:

class PaymentProcessor {
  constructor(paymentGateway, validator, logger) {
    this.paymentGateway = paymentGateway;
    this.validator = validator;
    this.logger = logger;
  }

  processPayment(paymentDetails) {
    if (this.validator.isValid(paymentDetails)) {
      this.paymentGateway.process(paymentDetails);
      this.logger.logTransaction(paymentDetails);
    }
  }
}

class PaymentValidator {
  isValid(paymentDetails) {
    // Validation logic
    return true; // Simplified for example
  }
}

class PaymentLogger {
  logTransaction(paymentDetails) {
    console.log(`Payment processed: ${JSON.stringify(paymentDetails)}`);
  }
}

現在,PaymentProcessor 類別只有一個職責:處理付款。

驗證和日誌記錄已移至單獨的類別(PaymentValidator 和 PaymentLogger)。


⚡️結論

設計具有內聚性的類別並遵守單一職責原則可確保您的程式碼庫保持靈活、可維護且易於理解。

透過將職責劃分為單獨的、集中的類,您可以降低各個組件的複雜性,並使您的系統更加健壯。

在 JavaScript 中,類別經常在較大的框架或應用程式中使用,遵循這些原則將顯著提高程式碼的品質。

正如《清潔程式碼》一書所解釋的那樣,編寫乾淨的類別不僅僅是組織程式碼,而是創建一個可以不斷發展而又不會成為維護噩夢的系統。


快樂編碼!

以上是了解乾淨的程式碼:類別 ⚡️的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn