Исходный код
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;
}
В современных условиях широкой доступности систем сборки нет необходимости реализовывать самостоятельно настолько типовые операции — лучше поискать готовый пакет для этого.
Теория
- Код для программиста, а не для процессора