Пример рефакторинга функции с излишней логикой для проверки существования таблицы


Исходный код

function table_exists($table) {
    self :: query("show tables from ".DB_NAME);
    for ($i = 0; $i < self :: num(); $i++) {
        $res = mysqli_fetch_array($this -> result);
        if ($res[0] == DB_PREFIX . $table) {
            return true;
        }
    }
        return false;
}

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

Рефакторинг логики проверки существования таблицы

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

В MySQL есть возможность сделать выборку отдельной таблицы, а не всех таблиц в базе данных — с помощью того же запроса SHOW TABLES, через предложение LIKE.

function table_exists($table) {
    self :: query("show tables from ".DB_NAME." like '".DB_PREFIX . $table."'");
    return self :: num() > 0;
}