”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > [Roast:Day - 我的“utils”文件夹

[Roast:Day - 我的“utils”文件夹

发布于2024-08-27
浏览:532

[Roast: Day  - My `utils` Folder

今天的大部分工作都是昨天工作的延续,只是在我的应用程序的路径上实现业务逻辑。因此,我想我应该在撰写此内容时休息一下,谈谈我创建的三个函数,这些函数是为了在我的应用程序中执行非常具体的事情。

什么是 utils 文件夹?

这是您放置所有很难找到家的小功能的目录,但您的应用程序没有它们就无法生存。

utils 文件夹是许多应用程序中无名英雄的垃圾场。

当您必须执行数据转换而需要多行代码且必须重复使用时,最好将其放入自己的文件中,您可以将其导出到您的申请的其余部分。

为什么我们不直接复制粘贴呢?好吧,这违反了两个编程原则:DRY 和关注点分离。

不要重复自己

重复自己不仅单调,而且如果你在整个申请过程中做得足够多,那么也很难改变。想象一个计算今天下雨的百分比的算法。

我不知道人们是如何做到这一点的,所以我无法向您展示一个例子。但是,如果您将这些内容复制到需要访问此计算的不同位置的整个代码中,那么当非常智能科学天气委员会带着新的、更准确的算法回来时,您会感到非常沮丧。 &&&]

获取代码中重复使用的部分,并找到方法将它们打包以便在多个地方使用,同时仍然在一个地方进行更新。

我的 utils 文件夹中的所有函数都在我的应用程序的许多地方使用!

关注点分离

作为程序员,我们也不想创建做很多不同事情的函数。我们宁愿有很多功能都只做一件事。为什么?嗯,它使这些函数更加可重用!

这与 utils 文件夹有什么关系?好吧,我要介绍的函数在 getRoastsById 这样的函数中并没有真正的位置,因为这不是它们所做的!当我们需要做其他事情时,我们应该为其创建一个函数。但是,当我们没有该函数的逻辑位置时,因为它是一个“助手”,我们将它放在我们的 utils 目录中!

我的 utils 文件夹

到目前为止我有三个自定义实用程序:

    插入语句
  • 更新语句
  • objectKeysToCamel
希望通过他们的名字就可以清楚地了解他们的工作,但让我简要分享一下他们解决的问题以及他们的工作方式。

插入语句

问题: 在我的应用程序的许多不同服务中,我将需要对我的数据库执行 INSERT 查询。这些语句要求您明确列出 1) 列的名称和 2) 值。我不必在每条路线中输入这些内容,因此我创建了一个函数来为我执行此操作。

输入: 该函数采用两个参数,table 是与数据库中表名称匹配的字符串,obj 是一个 Javascript 对象,表示用户想要添加到数据库的模型。

输出: 一个对象,其中包含 1) 具有占位符值的属性格式化 INSERT 字符串和 2) 要在参数化查询中使用的值的数组。

const { SnakeCase } = require('change-case-commonjs'); 函数 insertStatement(表, obj) { const 键 = Object.keys(obj); const 值 = Object.values(obj); let 语句 = `INSERT INTO ${table} (`; // 将snake_case键添加到语句中 const keyString = keys.map((key, i) => SnakeCase(key)).join(', '); 语句 = `${keyString}) VALUES (`; // 为值添加占位符 const 占位符 =keys.map((_, i) => `$${i 1}`).join(', '); 语句 = `${占位符}) 返回 *;`; // 返回查询字符串和值数组 返回 { 文本:声明, 价值观:价值观 }; } module.exports = insertStatement;
const { snakeCase } = require('change-case-commonjs');

function insertStatement(table, obj) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);

  let statement = `INSERT INTO ${table} (`;

  // Add snake_case keys to the statement
  const keyString = keys.map((key, i) => snakeCase(key)).join(', ');
  statement  = `${keyString}) VALUES (`;

  // Add placeholders for the values
  const placeholders = keys.map((_, i) => `$${i   1}`).join(', ');
  statement  = `${placeholders}) RETURNING *;`;

  // Return the query string and the values array
  return {
    text: statement,
    values: values
  };
}

module.exports = insertStatement;
更新语句

问题: 与 INSERT 语句类似,UPDATE 语句要求您在查询中明确说明列名和值。此语法与 INSERT 语句不同。通过条件逻辑,我可以创建一个databaseQueryGenerator函数,但这似乎也违反了关注点分离。像这样的函数会决定你想要什么样的查询,或者基于它生成语法吗?

输入: 该函数采用三个参数。 obj,表示更新记录的 JavaScript 对象。 table ,一个应与数据库中的表匹配的字符串。 id ,一个与要使用新信息更新的记录匹配的整数。

输出: 一个对象,具有 1) 具有占位符值的属性格式化 UPDATE 字符串和 2) 要在参数化查询中使用的值的数组。

const { SnakeCase } = require('change-case-commonjs'); 函数 updateStatement(obj, 表, id) { const 键 = Object.keys(obj); const 值 = Object.values(obj); let 语句 = `UPDATE ${table} SET `; key.forEach((键, 索引) => { 语句 = `${snakeCase(key)} = $${index 1}, `; }); // 删除最后一个逗号和空格 语句 = 语句.slice(0, -2); // 根据表确定正确的ID列 const idColumn = 表 === '用户' ? '用户名' : 表 === '烤肉' ? '烤_id':''; // 使用 WHERE 子句完成语句 语句 = ` WHERE ${idColumn} = $${keys.length 1} RETURNING *;`; 返回 { 文本:声明, 值:[...值,id] }; } module.exports = updateStatement
const { snakeCase } = require('change-case-commonjs');

function insertStatement(table, obj) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);

  let statement = `INSERT INTO ${table} (`;

  // Add snake_case keys to the statement
  const keyString = keys.map((key, i) => snakeCase(key)).join(', ');
  statement  = `${keyString}) VALUES (`;

  // Add placeholders for the values
  const placeholders = keys.map((_, i) => `$${i   1}`).join(', ');
  statement  = `${placeholders}) RETURNING *;`;

  // Return the query string and the values array
  return {
    text: statement,
    values: values
  };
}

module.exports = insertStatement;
对象键到骆驼

问题:我的数据库风格与我的JavaScript风格不同。然而,我不愿意在这两个方面做出妥协。在我的 JS 文件中,我的命名约定使用camelCase,而在我的数据库中它使用snake_case。返回对象的所有属性名称都相同,但格式不同。为了维持这种情况标准,我必须使用 Snake_case 访问 JS 中的属性,但我不喜欢这样。

输入: 该函数仅接受一个参数,即一个 obj JavaScript 对象,该对象的键应转换为驼峰格式。

输出: 相同的对象,具有驼峰格式的键。

const { 驼峰命名法 } = require('change-case-commonjs'); 函数 objectKeysToCamel(obj) { // 提取键和值 const 键 = Object.keys(obj); const 值 = Object.values(obj); 让骆驼= {} // 更改每个键的格式,为其分配正确的值 键.forEach((键, i) => { const CamelKey = 驼峰命名法(key); 骆驼[camelKey] = 值[i] }) // 返回新对象 返回骆驼; } module.exports = objectKeysToCamel;
const { camelCase } = require('change-case-commonjs');

function objectKeysToCamel(obj) {
  // Extract the keys and values
  const keys = Object.keys(obj);
  const values = Object.values(obj);
  let camel = {}

  // Change the formatting of each key, assigning it the proper value
  keys.forEach((key, i) => {
    const camelKey = camelCase(key);
    camel[camelKey] = values[i]
  })

  // Return the new object
  return camel;
}

module.exports = objectKeysToCamel;

查看项目

如果您想跟上更改、fork 并在本地运行,甚至建议更改代码,这里有一个 GitHub 存储库的链接!

https://github.com/nmiller15/roast

前端应用程序目前部署在 Netlify 上!如果您想尝试一些功能并查看其实际效果,请在下面的移动设备上查看。

https://knowyourhomeroast.netlify.app

注意:此部署没有后端 api,因此帐户和烘焙实际上不会在会话之间的任何位置保存。

版本声明 本文转载于:https://dev.to/nmiller15/roast-day-16-my-utils-folder-33dm?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Go 中的并发模式;工作池和扇出/扇入
    Go 中的并发模式;工作池和扇出/扇入
    Go 以其卓越的并发模型而闻名,但许多开发人员只关注 goroutine 和通道。然而,工作池和扇出/扇入等并发模式提供了真正的效率。 本文将介绍这些高级概念,帮助您最大限度地提高 Go 应用程序的吞吐量。 为什么并发很重要 并发允许程序高效地执行任务,特别是在处理 I/O 操作、...
    编程 发布于2024-11-06
  • 如何在 C++ 中将单个字符转换为 std::string?
    如何在 C++ 中将单个字符转换为 std::string?
    从单个字符创建字符串人们可能会遇到需要将表示为 char 数据类型的单个字符转换为std::string。从字符串中获取字符很简单,只需在所需位置索引字符串即可。然而,相反的过程需要不同的方法。要从单个字符创建 std::string,可以使用多种方法:使用 std::string参数计数为 1:c...
    编程 发布于2024-11-06
  • JavaScript 变量名称中美元符号的含义是什么?
    JavaScript 变量名称中美元符号的含义是什么?
    JavaScript 变量名称中美元符号的意义在编程领域,命名约定的使用对于增强代码至关重要可读性并遵循最佳实践。在 JavaScript 中,美元符号 ($) 通常作为变量名称的前缀出现,特别是引用 jQuery 对象的变量名称。美元符号的用途是什么?与流行的看法相反,JavaScript 变量名...
    编程 发布于2024-11-06
  • 如何重新排列 CSS 网格布局中的列以实现移动响应?
    如何重新排列 CSS 网格布局中的列以实现移动响应?
    在 CSS 网格布局中重新排序列在 CSS 网格布局中,有多种技术可以修改列的顺序以实现具体布局。本问题探讨了重新排列移动布局列的可能性,例如将列移动到底部,同时在桌面布局上保持所需的列顺序。解决方案选项:grid-template-areas: 此属性允许您在网格内定义命名区域,然后将网格项分配给...
    编程 发布于2024-11-06
  • Hacktoberfest 周在线拍卖系统
    Hacktoberfest 周在线拍卖系统
    概述 在 Hacktoberfest 的第三周,我决定为一个较小但有前途的项目做出贡献:在线拍卖系统。尽管该项目仍处于早期阶段,但它已经显示出增长潜力,而且我看到了帮助改进其代码库的机会。我的任务是通过减少冗余代码和改进整体结构来重构项目,使其更具可维护性和可扩展性。 ...
    编程 发布于2024-11-06
  • 如何使用“exception_ptr”在 C++ 线程之间传播异常?
    如何使用“exception_ptr”在 C++ 线程之间传播异常?
    在 C 中的线程之间传播异常 当从主线程调用的函数生成多个线程时,就会出现在 C 中的线程之间传播异常的任务用于 CPU 密集型工作的工作线程。挑战在于处理工作线程上可能发生的异常并将其传播回主线程​​以进行正确处理。传统方法一种常见方法是手动捕获工作线程上的各种异常,记录它们的详细信息,然后在主线...
    编程 发布于2024-11-06
  • 如何使用 3D CSS 变换修复 Firefox 中的锯齿状边缘?
    如何使用 3D CSS 变换修复 Firefox 中的锯齿状边缘?
    使用 3D CSS 变换时 Firefox 中的锯齿状边缘与 Chrome 中使用 CSS 变换时的锯齿状边缘问题类似,Firefox 在 3D 变换中也出现了这个问题。背面可见性作为 Chrome 中的潜在解决方案,在 Firefox 中被证明无效。解决方法:要在 Firefox 中缓解此问题,您...
    编程 发布于2024-11-06
  • 为什么 PHP 的 mail() 函数给电子邮件发送带来挑战?
    为什么 PHP 的 mail() 函数给电子邮件发送带来挑战?
    为什么 PHP 的 mail() 函数达不到要求:限制和陷阱虽然 PHP 提供了 mail() 函数用于发送电子邮件,但它却失败了与专用库或扩展相比较短。以下是与使用 mail() 相关的缺点和限制的全面检查:格式问题:mail() 可能会遇到以下问题:标题和内容格式,尤其是操作系统之间的换行符差异...
    编程 发布于2024-11-06
  • 使用 npyConverter 简化 NumPy 文件转换
    使用 npyConverter 简化 NumPy 文件转换
    如果您使用 NumPy 的 .npy 文件并需要将其转换为 .mat (MATLAB) 或 .csv 格式,npyConverter 就是适合您的工具!这个简单的基于 GUI 的工具通过干净且用户友好的界面提供 .npy 文件的批量转换。 主要特点 批量转换:将目录下所有.npy文件...
    编程 发布于2024-11-06
  • 如何禁用特定线路的 Eslint 规则?
    如何禁用特定线路的 Eslint 规则?
    禁用特定行的 Eslint 规则在 JSHint 中,可以使用语法禁用特定行的 linting 规则: /* jshint ignore:start */ $scope.someVar = ConstructorFunction(); /* jshint ignore:end */对于 eslint...
    编程 发布于2024-11-06
  • 如何在没有错误的情况下将列表插入 Pandas DataFrame 单元格?
    如何在没有错误的情况下将列表插入 Pandas DataFrame 单元格?
    将列表插入 Pandas 单元格问题在 Python 中,尝试将列表插入 Pandas DataFrame 的单元格可能会导致错误或意想不到的结果。例如,当尝试将列表插入 DataFrame df 的单元格 1B 时:df = pd.DataFrame({'A': [12, 23], 'B': [n...
    编程 发布于2024-11-06
  • Matplotlib 中的“plt.plot”、“ax.plot”和“figure.add_subplot”之间的主要区别是什么?
    Matplotlib 中的“plt.plot”、“ax.plot”和“figure.add_subplot”之间的主要区别是什么?
    Matplotlib 中绘图、轴和图形之间的差异Matplotlib 是一个用于创建可视化的面向对象的 Python 库。它使用三个主要对象:图形、轴和绘图。图形图形表示将在其中显示可视化的整个画布或窗口。它定义画布的整体大小和布局,包括边距、背景颜色和任何其他全局属性。轴轴表示图中绘制数据的特定区...
    编程 发布于2024-11-06
  • FireDucks:以零学习成本获得超越 pandas 的性能!
    FireDucks:以零学习成本获得超越 pandas 的性能!
    Pandas 是最受欢迎的库之一,当我在寻找一种更简单的方法来加速其性能时,我发现了 FireDucks 并对它产生了兴趣! 与 pandas 的比较:为什么选择 FireDucks? Pandas 程序可能会遇到严重的性能问题,具体取决于其编写方式。然而,作为一名数据科学家,我想花...
    编程 发布于2024-11-06
  • CSS 网格:嵌套网格布局
    CSS 网格:嵌套网格布局
    介绍 CSS Grid 是一种布局系统,因其在创建多列布局方面的灵活性和效率而迅速受到 Web 开发人员的欢迎。它最有用的功能之一是能够创建嵌套网格布局。嵌套网格可以在设计复杂网页时提供更多控制和精确度。在本文中,我们将探讨在 CSS Grid 中使用嵌套网格布局的优点、缺点和主要...
    编程 发布于2024-11-06
  • 适用于 Java 的 Jupyter 笔记本
    适用于 Java 的 Jupyter 笔记本
    Jupyter Notebook 的强大 Jupyter Notebooks 是一个出色的工具,最初是为了帮助数据科学家和工程师使用 python 编程语言简化数据处理工作而开发的。事实上,笔记本的交互性使其非常适合快速查看代码结果,而无需搭建开发环境、编译、打包等。此功能对于数据...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3