✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Стремитесь разбить программу на более мелкие компоненты

24

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

Но не так уж редко можно увидеть монолитные функции с большим количеством комментариев кода, помогающих объяснить, что происходит в программе.

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

  • Какой у него был бюджет при создании программы?
  • Сколько времени было отведено на выполнение проекта?
  • Много ли людей работало над проектом?
  • Давалось ли программисту время на написание кода, чтобы он мог его протестировать, провести рефакторинг или просто сделать его более удобным для чтения?

Короче говоря, есть много причин — я считаю — что мы можем читать «плохой код», и это не всегда должно быть ошибкой программиста (просто это самое естественное, что мы должны отбросить, когда читаем код). что-то нам не нравится).

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

Разбивайте программы на более мелкие компоненты

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

«Давайте конкретизируем, Боб».

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

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

Общий пример

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

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

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

  1. получить идентификатор клиента текущего пользователя,
  2. получить все идентификационные номера заказов для клиента
  3. определить, какие способы оплаты использовались для каждого заказа
  4. получить указанные способы оплаты, а затем отправить информацию клиенту

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

Но если вы работали с электронной коммерцией в WordPress и различных плагинах, вы знаете, что это не всегда так просто.

Вместо этого вы смотрите на что-то вроде:

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

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

Это может привести к чему-то вроде этого :

<?php

// First, read the user ID and meta value to get authorization information
global $wpdb;
$results = $wpdb->get_results(
    $wpdb->prepare(
        "
        SELECT
            user_id, meta_value
        FROM $wpdb->usermeta
        WHERE meta_key LIKE %s
        AND user_id = %d
        ",
        '%customer_profile_id%',
        filter_input(INPUT_GET, 'customer_id')
    ),
    ARRAY_A
);

$result = isset($results[0])? array_column($results[0], 'meta_value'): [];
if (empty($result)) {
    return $result;
}

// Get the ID of the current customer.
$customers = $wpdb->get_results(
    $wpdb->prepare(
        "", // Your custom query goes here.
        filter_input(INPUT_GET, 'customer_id')
    ),
    ARRAY_A
);

$customer = isset($customers[0])? array_column($customers[0], 'customer_id'): [];
if (empty($customer)) {
    return $customer;
}

// Get all of the order IDs from the set of orders returned from the previous query.
$orderIds = $wpdb->get_results(
    $wpdb->prepare(
        "", // Your custom query goes here.
        $customer
    ),
    ARRAY_A
);

return $orderIds;

// Finally, get all of the payment methods for the orders based on their Ids.
$orders = [];
foreach ($orderIds as $orderId) {
    $results = $wpdb->get_results(
        $wpdb->prepare(
            "" // The query for retrieving various payment method information based on the $orderId
        ),
        ARRAY_A
    );

    if (empty($results)) {
        continue;
    }

    $orders[$orderId] = $results;
}

// Now send the information back to the user.
wp_send_json_success($orders);

Но это не должно быть так.

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

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

Возможно, окончательный результат может выглядеть примерно так :

<?php

public function getPaymentMethods()
{
  $authInfo = $this->getAuthorizationInformation();
  $currentCustomerId = $this->getCurrentCustomerId($authInfo);
  $orders = $this->getCustomerOrders($currentCustomerId);
  $paymentMethods = $this->getPaymentMethodsFromOrders($orders);
  wp_send_json_success($orders);
}

private function getAuthorizationInformation()
{
  global $wpdb;
  $authInfo = $wpdb->get_results(
      $wpdb->prepare(
          "
          SELECT
              user_id, meta_value
          FROM $wpdb->usermeta
          WHERE meta_key LIKE %s
          AND user_id = %d
          ",
          '%customer_profile_id%',
          filter_input(INPUT_GET, 'customer_id')
      ),
      ARRAY_A
  );

  return isset($authInfo[0])? array_column($authInfo[0], 'meta_value'): [];
}

private function getCurrentCustomerIdFromAuthInfo($authInfo)
{
  global $wpdb;
  $customers = $wpdb->get_results(
      $wpdb->prepare(
          "", // Your custom query goes here.
          $authInfo;
      ),
      ARRAY_A
  );

  return isset($customerId[0])? array_column($customerId[0], 'meta_value'): [];
}

private function getCustomerOrders($customerId)
{
  global $wpdb;
  $orderIds = $wpdb->get_results(
      $wpdb->prepare(
          "", // Your custom query goes here.
          $customerId
      ),
      ARRAY_A
  );

  return empty($orderIds)? []: $orderIds;
}

private function getPaymentMethodsFromOrders($orderIds)
{
  $paymentMethods = [];
  foreach ($orderIds as $orderId) {
      $results = $wpdb->get_results(
          $wpdb->prepare(
              "" // The query for retrieving various payment method information based on the $orderId
          ),
          ARRAY_A
      );

      if (empty($results)) {
          continue;
      }

      $paymentMethods[$orderId] = $results;
  }

  return $paymentMethods;
}

Конечно, я не могу показать реальный SQL — ну, по крайней мере, не везде — потому что я не знаю общей настройки и не знаю точно, с какими плагинами или схемами вы работаете.

Но это никогда не было целью этого поста.

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

Источник записи: tommcfarlin.com

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