Вы отлаживаете код и видите слишком много объявленных и активных переменных.
TL;DR: Переменные должны быть как можно более локальными
- Проблемы
- Решения
- Контекст
- Код примера
- Неправильный
- Правильно
- Обнаружение
- Теги
- Вывод
- Отношения
- Запах кода 149 — Необязательная цепочка
- Maxi Contieri ・ Jul 16 ・ 2 min read
- Code Smell 107 — Повторное использование переменных
- Maxi Contieri ・ Dec 1 ’21 ・ 2 min read
- Code Smell 62 — Переменные с флагом
- Maxi Contieri ・ Feb 8 ’21 ・ 1 min read
- Рефакторинги
- Рефакторинг 002 — Метод извлечения
- Maxi Contieri ・ Nov 25 ’21 ・ 2 min read
- Кредиты
- Программная инженерия Великие цитаты
- Maxi Contieri ・ Dec 28 ’20 ・ 13 min read
- Как найти зловонные части вашего кода
- Maxi Contieri ・ May 21 ’21 ・ 7 min read
Проблемы
-
Читабельность
-
Повторное использование кода
Решения
-
Метод извлечения
-
Удалите неиспользуемые переменные
Контекст
Наш код должен быть грязным при программировании и быстром написании тестовых примеров.
После получения хорошего покрытия нам необходимо провести рефакторинг и сократить методы.
Код примера
Неправильный
<?
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

Code Smell 107 — Повторное использование переменных
Maxi Contieri ・ Dec 1 ’21 ・ 2 min read

Code Smell 62 — Переменные с флагом
Maxi Contieri ・ Feb 8 ’21 ・ 1 min read
Рефакторинги

Рефакторинг 002 — Метод извлечения
Maxi Contieri ・ Nov 25 ’21 ・ 2 min read
Кредиты
Фото Dustan Woodhouse on Unsplash
Временные переменные могут быть проблемой. Они полезны только в рамках своей собственной процедуры, и поэтому они поощряют длинные и сложные процедуры.
Мартин Фаулер

Программная инженерия Великие цитаты
Maxi Contieri ・ Dec 28 ’20 ・ 13 min read
Эта статья является частью серии CodeSmell.

Как найти зловонные части вашего кода
Maxi Contieri ・ May 21 ’21 ・ 7 min read