首页  >  文章  >  web前端  >  了解干净的代码:类 ⚡️

了解干净的代码:类 ⚡️

王林
王林原创
2024-09-10 11:09:02891浏览

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