Исходный код
$res["LIST_PAGE_URL"] = str_replace("//", "/", str_replace("#LANG#", $res["LANG_DIR"],
str_replace("#SITE_DIR#", SITE_DIR,
str_replace("#SERVER_NAME#", SITE_SERVER_NAME,
str_replace("#IBLOCK_ID#", $res["IBLOCK_ID"], $res["LIST_PAGE_URL"])
)
)
)
);
Что не так в этом коде
- вложенные вызовы функций, которые тяжело читать
- привязка преобразования к конкретным переменным
Как можно отрефакторить исходный код
function interpolateURL($url_template, $lang, $iblock)
{
$placeholder_values = [
'#IBLOCK_ID#' => $iblock,
'#SERVER_NAME#' => SITE_SERVER_NAME,
'#SITE_DIR#' => SITE_DIR,
'#LANG#' => $lang,
];
return strtr($url_template, $placeholder_values);
}
const CLEANUP_URL = [
'//' => '/',
];
function cleanupURL($url)
{
return strtr($url, CLEANUP_URL);
}
$res["LIST_PAGE_URL"] = interpolateURL($res["LIST_PAGE_URL"], $res["LANG_DIR"], $res["IBLOCK_ID"]);
$res["LIST_PAGE_URL"] = cleanupURL($res["LIST_PAGE_URL"]);
Понадобились две отдельных функции, так как подставить переменные в URL и очистить URL от лишних символов — две совершенно разные задачи.
Теория
- Принцип независимости от источника
- Паттерн Input — Do — Output
- Принцип единственного знания