Рефакторинг адского сопоставления имени файла с регулярными выражениями


Исходный код

var ext = /(\.[^.]*?)$/.exec(filename)?/(\.[^.]*?)$/.exec(filename)[1]:/[\/\\]([^\/\\]*?)$/.exec(filename)?/[\/\\]([^\/\\]*?)$/.exec(filename)[1]:filename; <em>// I love JavaScript :)</em>

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

Совершенно нечитаемая конструкция.

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

var ext = /(\.[^.]*?)$/.exec(filename) 
    ? /(\.[^.]*?)$/.exec(filename)[1]
    : /[\/\\]([^\/\\]*?)$/.exec(filename)
        ? /[\/\\]([^\/\\]*?)$/.exec(filename)[1]
        : filename;

Тут мы пытаемся из строки, содержащей путь файла, извлечь расширение.

Теперь можно проанализировать недочёты.

Имя переменной filename выбрано не очень удачно, более точное название — filepath.

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

Здесь дважды выполняется сопоставление строки с каждым регулярным выражением — даже при использовании констант это будет не лучшая структура алгоритма.

Название результирующей переменной ext не консистентно по отношению к исходной filename — я бы использовал fileext.

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

Вероятно, автор радуется, как ловко он упаковал столько логики всего лишь в одну строку, однако ни один программист не должен забывать про старую профессиональную мудрость (сформулированную Джоном Ф. Вудсом):

«Пишите код так, как будто поддерживать его будет склонный к насилию психопат, который знает, где вы живёте»

Вариант рефакторинга исходного кода

const FILE_EXT_PATTERN_WITH_DOT = /(\.[^.]*?)$/;
const FILE_EXT_PATTERN_WITH_SLASH = /[\/\\]([^\/\\]*?)$/;
function getFileExt(filepath)
{
    if (dot_match = FILE_EXT_PATTERN_WITH_DOT.exec(filepath)) return dot_match[1];
    if (slash_match = FILE_EXT_PATTERN_WITH_SLASH.exec(filepath)) return slash_match[1];
    return filepath;
}

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

Теория

  • Код для программиста, а не для процессора