在软件开发中,函数是任何应用程序的构建块。它们是我们构建逻辑、封装行为以及将复杂任务划分为可管理部分的主要方式。
然而,并非所有函数都是一样的。在《整洁代码》的第 3 章中,重点是编写小任务、重点突出并做好一件事。
在本文中,我们将深入研究这些原则并探索如何在 JavaScript 中应用它们。
干净代码的一个核心原则是函数应该很小。
但是在这种情况下“小”意味着什么?作者主张函数通常只有几行长。
这个想法是小函数更容易理解、测试和维护。
让我们看一个 JavaScript 示例:
// Bad Example: A large, unfocused function function processOrder(order) { applyDiscount(order); calculateShipping(order); calculateTax(order); generateInvoice(order); sendConfirmationEmail(order); updateInventory(order); }
这个函数虽然看似简单,但作用太多。这些任务中的每一个都可以而且应该分解为自己的功能。
// Good Example: Small, focused functions function processOrder(order) { applyDiscount(order); calculateShipping(order); calculateTax(order); generateInvoice(order); sendConfirmationEmail(order); updateInventory(order); } function applyDiscount(order) { // Discount logic } function calculateShipping(order) { // Shipping calculation logic } function calculateTax(order) { // Tax calculation logic } function generateInvoice(order) { // Invoice generation logic } function sendConfirmationEmail(order) { // Email sending logic } function updateInventory(order) { // Inventory update logic }
在修改后的示例中,每个函数只做一件事情,使代码更易于阅读和维护。
processOrder 函数现在充当高级协调器,而更小、更集中的函数则处理细节。
一个函数应该做一件事并且把它做好。如果您发现自己正在编写一个执行多个任务的函数,则表明您应该将其重构为更小的函数。
这是一个例子:
// Bad Example: A function doing multiple things function formatAndSendEmail(email, subject, message) { const formattedMessage = `<html><body>${message}</body></html>`; sendEmail(email, subject, formattedMessage); }
虽然这个函数看起来很简洁,但它做了两件事:格式化消息和发送电子邮件。相反,将其分解:
// Good Example: Functions doing one thing function formatMessage(message) { return `<html><body>${message}</body></html>`; } function sendFormattedEmail(email, subject, message) { const formattedMessage = formatMessage(message); sendEmail(email, subject, formattedMessage); }
现在,每个函数都有一个职责,这使得代码更易于测试和重用。
formatMessage 函数可以独立于电子邮件发送逻辑进行测试。
函数应该最大限度地减少副作用,这意味着它们不应该以意想不到的方式改变系统的状态。有副作用的函数可能更难调试和推理。
这是一个例子:
// Bad Example: A function with a side effect let globalCounter = 0; function incrementCounter() { globalCounter++; }
incrementCounter 函数会更改全局状态,如果不仔细管理,可能会导致错误。
更好的方法是返回一个新值并让调用者决定如何处理它:
// Good Example: Avoiding side effects function incrementCounter(counter) { return counter + 1; } globalCounter = incrementCounter(globalCounter);
通过避免副作用,您可以使您的函数更加可预测且更易于使用。
函数应该在单一抽象级别上运行。在同一函数中混合不同级别的细节可能会使其更难以理解。
例如:
// Bad Example: Mixed levels of abstraction function getUserData(userId) { const user = database.fetchUserById(userId); // Low-level return `${user.firstName} ${user.lastName} (${user.email})`; // High-level }
这里,该函数将低级数据库获取与用户数据的高级格式化混合在一起。
最好将这些问题分开:
// Good Example: Single level of abstraction function getUser(userId) { return database.fetchUserById(userId); } function formatUserData(user) { return `${user.firstName} ${user.lastName} (${user.email})`; } const user = getUser(userId); const formattedUserData = formatUserData(user);
现在,每个函数都在单一抽象级别上运行,使代码更清晰且更易于维护。
编写干净的函数是编写可维护代码的基石。
通过保持函数较小、确保它们只做一件事、避免副作用以及维护单一抽象级别,您可以创建更易于阅读、理解和维护的代码。
当您继续磨练 JavaScript 技能时,请牢记干净代码中的这些原则,以编写真正体现简单性和清晰性艺术的函数。
以上是了解干净的代码:函数 ⚡的详细内容。更多信息请关注PHP中文网其他相关文章!