Трудночитаемые подстановки плейсхолдеров в шаблоне строки


Исходный код

$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
  • Принцип единственного знания