類別在物件導向程式設計中至關重要,但設計不當的類別可能會導致有問題的程式碼。
《清潔代碼》第 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:
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}`); } }
現在,每個班級都有一個職責:
採用此結構,電子郵件系統的變更不會影響使用者註冊邏輯,反之亦然。
可維護性: 當一個類別具有單一職責時,更容易定位和修復錯誤。您不需要費力地處理不相關的邏輯。
可擴展性: 隨著專案的發展,遵循 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 中,類別經常在較大的框架或應用程式中使用,遵循這些原則將顯著提高程式碼的品質。
正如《清潔程式碼》一書所解釋的那樣,編寫乾淨的類別不僅僅是組織程式碼,而是創建一個可以不斷發展而又不會成為維護噩夢的系統。
快樂編碼!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3