Запах кода 154 — Слишком много переменных

Вы отлаживаете код и видите слишком много объявленных и активных переменных.

TL;DR: Переменные должны быть как можно более локальными

Проблемы

  • Читабельность

  • Повторное использование кода

Решения

  1. Метод извлечения

  2. Удалите неиспользуемые переменные

Контекст

Наш код должен быть грязным при программировании и быстром написании тестовых примеров.

После получения хорошего покрытия нам необходимо провести рефакторинг и сократить методы.

Код примера

Неправильный

<?

function retrieveImagesFrom(array $imageUrls) {
  foreach ($imageUrls as $index=>$imageFilename) {
    $imageName = $imageNames[$index];
    $fullImageName = $this->directory() . "\" . $imageFilename;
    if (!file_exists($fullImageName)) {
      if (str_starts_with($imageFilename, 'https://cdn.example.com/')) {
          // TODO: Remove Hardcode
          $url = $imageFilename;
          // This variable duplication is no really necesary 
          // When we scope variables        
          $saveto= "c:\temp"."\".basename($imageFilename);
          // TODO: Remove Hardcode
          $ch = curl_init ($url);
          curl_setopt($ch, CURLOPT_HEADER, 0);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          $raw = curl_exec($ch);
          curl_close ($ch);
          if(file_exists($saveto)){
               unlink($saveto);
          }
          $fp = fopen($saveto,'x');
          fwrite($fp, $raw);
          fclose($fp);
          $sha1 = sha1_file($saveto);
          $found = false;
          $files = array_diff(scandir($this->directory()), array('.', '..'));
          foreach ($files as $file){
              if ($sha1 == sha1_file($this->directory()."\".$file)) {                         
                  $images[$imageName]['remote'] = $imageFilename;
                  $images[$imageName]['local'] = $file;
                  $imageFilename = $file;
                  $found = true;
                  // Iteration keeps going on even after we found it
              }
          }
          if (!$found){
            throw new Exception('We couldnt find image');
         }
        // Debugging at this point our context is polluted with variables
        // from previous executions no longer needed
        // for example: the curl handler
  }
Вход в полноэкранный режим Выйти из полноэкранного режима

Правильно

<?php

function retrieveImagesFrom(string imageUrls) {
  foreach ($imageUrls as $index => $imageFilename) {
    $imageName = $imageNames[$index];
    $fullImageName = $this->directory() . "\" . $imageFilename;
    if (!file_exists($fullImageName)) {
        if ($this->isRemoteFileName($imageFilename)) {
            $temporaryFilename = $this->temporaryLocalPlaceFor($imageFilename);
            $this->retrieveFileAndSaveIt($imageFilename, $temporaryFilename);
            $localFileSha1 = sha1_file($temporaryFilename);
            list($found, $images, $imageFilename) = $this->tryToFindFile($localFileSha1, $imageFilename, $images, $imageName);
            if (!$found) {
                throw new Exception('File not found locally ('.$imageFilename.'). Need to retrieve it and store it');
            }
        } else {
            throw new Exception('Image does not exist on directory ' . $fullImageName);
        }
    }
Войти в полноэкранный режим Выход из полноэкранного режима

Обнаружение

[X] Автоматическое

Большинство линтеров могут предложить использовать длинные методы.

Это предупреждение также указывает нам на необходимость разбиения и расширения наших переменных.

Теги

  • Блутеры

Вывод

Метод извлечения — наш лучший друг.

Мы должны использовать его часто.

Отношения

Запах кода 149 — Необязательная цепочка

Maxi Contieri ・ Jul 16 ・ 2 min read

#javascript #webdev #новичкам #программирование

Code Smell 107 — Повторное использование переменных

Maxi Contieri ・ Dec 1 ’21 ・ 2 min read

#oop #программирование #webdev #учебник

Code Smell 62 — Переменные с флагом

Maxi Contieri ・ Feb 8 ’21 ・ 1 min read

#программирование #oop #webdev #учебник

Рефакторинги

Рефакторинг 002 — Метод извлечения

Maxi Contieri ・ Nov 25 ’21 ・ 2 min read

#рефакторинг #oop #webdev #codenewbie

Кредиты

Фото Dustan Woodhouse on Unsplash


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

Мартин Фаулер

Программная инженерия Великие цитаты

Maxi Contieri ・ Dec 28 ’20 ・ 13 min read

#codenewbie #программирование #цитаты #программное обеспечение

Эта статья является частью серии CodeSmell.

Как найти зловонные части вашего кода

Maxi Contieri ・ May 21 ’21 ・ 7 min read

#codenewbie #учебник #качество кода #новички

Оцените статью
devanswers.ru
Добавить комментарий