Ребус для обработки ключевых слов и их вывода через запятую


Исходный код

foreach(explode(' ',str_replace($symbols,'',htmlspecialchars_decode(html_entity_decode(implode(' ',$keywords))))) as$i=>$val) if(mb_strlen($val)>2) echo', '.$val;

Что не так в исходном коде

В коротком фрагменте кода смешаны несколько ответственностей (знаний):

  • почистить ключевые слова от лишних символов и привести к требуемому формату
  • вывести ключевые слова через запятую
  • не выводить ключевые слова с длиной меньше трёх символов

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

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

function cleanup_keyword($keyword)
{
    return str_replace(CLEANUP_SYMBOLS, '', htmlspecialchars_decode(html_entity_decode($keyword)));
}
function is_valid_keyword($keyword)
{
    return mb_strlen($val) >= 3;
}
$cleaned_keywords = array_map('cleanup_keyword', $keywords);
$filtered_keywords = array_filter($cleaned_keywords, 'is_valid_keyword');
echo implode(', ', $filtered_keywords);

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

Обрати внимание, что условие > 2 превратилось в >= 3. Это тоже важно, потому что для человека это условие звучит как «только ключевые слова длинной три и более символа», а значит, и в коде должна фигурировать именно цифра 3, а не 2. Тогда не нужно будет в голове выполнять дополнительную расшифровку ребуса > 2 в формулу «три и больше символа» — усилий на прочтение кода потребуется меньше.

Теория