«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > [Жарка: День — Моя папка `utils`

[Жарка: День — Моя папка `utils`

Опубликовано 27 августа 2024 г.
Просматривать:176

[Roast: Day  - My `utils` Folder

Большая часть сегодняшней работы является продолжением вчерашней работы, а именно реализацией бизнес-логики на маршрутах моего приложения. Итак, я решил сделать перерыв в написании этой статьи и поговорить о трех функциях, которые я создал для выполнения очень конкретных задач в моем приложении.

Что такое папка утилит?

Это каталог, куда вы помещаете все свои маленькие функции, которым трудно найти место, но ваше приложение не может жить без них.

Папка utils — это свалка невоспетых героев многих приложений.

Когда вам нужно выполнить преобразование ваших данных, которое займет больше нескольких строк кода и которые вам придется использовать повторно, рекомендуется поместить его в отдельный файл, который вы можете экспортировать в остальная часть вашего заявления.

Почему бы нам просто не скопировать и вставить? Что ж, это нарушит два принципа программирования: DRY и разделение задач.

Не повторяйтесь

Повторение не только монотонно, но и требует изменений, если вы делали это достаточно на протяжении всего приложения. Представьте себе алгоритм, который вычисляет процентную вероятность дождя сегодня.

Я не знаю, как люди это делают, поэтому не могу показать вам пример. Но если вы скопируете это по всему коду в разные места, которым необходим доступ к этим расчетам, вы будете очень расстроены, когда Очень умный научный комитет по погоде вернется с новым, более точным алгоритмом.

Возьмите повторно используемые части вашего кода и найдите способы упаковать их для использования в нескольких местах, сохраняя при этом обновление в одном месте.

Все функции в моей папке utils используются во многих местах моего приложения!

Разделение интересов

Как программисты, мы также не хотим создавать функции, которые делают МНОГО разных вещей. Мы бы предпочли иметь МНОГО функций, которые выполняли бы одно действие. Почему? Что ж, это делает эти функции более пригодными для повторного использования!

Какое это имеет отношение к папке utils? Что ж, функциям, которые я собираюсь рассмотреть, на самом деле нет места в таких функциях, как getRoastsById, потому что они это не делают! Когда нам нужно сделать что-то еще, мы должны создать для этого функцию. Но когда у нас нет логического места для этой функции, поскольку это «помощник», мы помещаем ее в наш каталог utils!

Моя папка с утилитами

На данный момент у меня есть три пользовательские утилиты:

  • insertStatement
  • обновление
  • objectKeysToCamel

Надеюсь, по названиям понятно, чем они занимаются, но позвольте мне вкратце рассказать о проблеме, которую они решают, и о том, как они работают.

вставкаStatement

Проблема: Во многих различных службах моего приложения мне потребуется выполнить запрос INSERT к моей базе данных. Эти операторы требуют от вас явного указания 1) названий столбцов и 2) значений. Мне не нужно было вводить их в каждый маршрут, поэтому я создал функцию, которая сделает это за меня.

Ввод: Функция принимает два параметра: table — строку, соответствующую имени таблицы в базе данных, и obj — объект Javascript, представляющий модель, которую пользователь хочет добавить в базу данных.

Вывод: Объект с 1) строкой INSERT в формате свойства со значениями-заполнителями и 2) массивом значений, которые будут использоваться в параметризованном запросе.

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;

updateStatement

Проблема: Подобно оператору INSERT, оператор UPDATE требует явного указания как имен столбцов, так и значений в вашем запросе. Этот синтаксис отличается от оператора INSERT. С помощью условной логики я мог бы создать функцию DatabaseQueryGenerator, но это также нарушает разделение задач. Будет ли такая функция решать, какой запрос вам нужен, или генерировать синтаксис на его основе?

Ввод: Функция принимает три параметра. obj — объект JavaScript, представляющий обновленную запись. table — строка, которая должна соответствовать таблице в базе данных. id — целое число, соответствующее записи, которая будет обновлена ​​новой информацией.

Вывод: Объект с 1) строкой UPDATE в формате свойства со значениями-заполнителями и 2) массивом значений, которые будут использоваться в параметризованном запросе.

const { snakeCase } = require('change-case-commonjs');

function updateStatement(obj, table, id) {
  const keys = Object.keys(obj);
  const values = Object.values(obj);
  let statement = `UPDATE ${table} SET `;

  keys.forEach((key, index) => {
    statement  = `${snakeCase(key)} = $${index   1}, `;
  });

  // Remove the last comma and space
  statement = statement.slice(0, -2);

  // Determine the correct ID column based on the table
  const idColumn = table === 'users' ? 'username' : table === 'roasts' ? 'roast_id' : '';

  // Finalize the statement with the WHERE clause
  statement  = ` WHERE ${idColumn} = $${keys.length   1} RETURNING *;`;

  return {
    text: statement,
    values: [...values, id]
  };
}

module.exports = updateStatement

объектKeysToCamel

Проблема: стиль моей базы данных отличается от стиля моего JavaScript. Однако я не желаю идти на компромисс ни в одной из областей. В моих файлах JS в соглашении об именах используется CamelCase, а в моей базе данных — Snake_case. Все имена свойств возвращаемых объектов одинаковы, но имеют разный формат. Чтобы поддерживать этот стандарт регистра, мне пришлось бы обращаться к свойствам моего JS с помощью Snake_case, но мне это не нравится.

Ввод: Функция принимает только один параметр — объект obj JavaScript, ключи которого должны быть преобразованы в формат CamelCase.

Вывод: Тот же объект с ключами в формате CamelCase.

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;

Ознакомьтесь с проектом

Если вы хотите быть в курсе изменений, разветвлять и запускать их локально или даже предлагать изменения в коде, вот ссылка на репозиторий GitHub!

https://github.com/nmiller15/roast

В настоящее время интерфейсное приложение развернуто на Netlify! Если вы хотите поэкспериментировать с некоторыми функциями и увидеть их в действии, просмотрите их на мобильном устройстве ниже.

https://knowyourhomeoast.netlify.app

Примечание. В этом развертывании нет серверного API, поэтому учетные записи и обжарки фактически нигде не сохраняются между сеансами.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/nmiller15/roast-day-16-my-utils-folder-33dm?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3