类在面向对象编程中至关重要,但设计不当的类可能会导致有问题的代码。
《清洁代码》第 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