Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public function showUsers() {
$this->db->connect('localhost', 'root', 'pass');
$this->db->select_db('database');
$result = $this->db->query("SELECT * FROM users");
$users = array();
while($row = $result) {
$users[] = $this->db->fetch_array($result);
}
$this->db->free_result($result);
$this->template->assign_vars(array('users' => $users));
$this->template->show('index_users.tpl');
}
(где в оригинале вместо $this->db->* было mysql_*) формируем моки db и template с условиями что метод connect вызывается точно один раз с параметрами 'localhost', 'root' и 'pass', метод select_db вызывается точно один раз с параметром 'database', метод query вызывается точно один раз с параметром «SELECT * FROM users» и возвращает некий результат (я использую случайное число), метод fetch_array вызывается N раз с параметром вернувшимся от query и возвращает массив значений, метод free_result вызывается ровно один раз с тем же параметром, метод assign_vars вызывается ровно один раз с соответствующим массивом и, наконец, метод show вызывается ровно один раз с параметром 'index_users.tpl'. public function showUsers() {
$repo = new UsersRepository($this->db);
$tpl = new UsersView($this->template);
$users = $repo->fetchAll();
$tpl->show($users);
</souce>
инкапсулировав логику хранения и отображения, но начальный тест всё ещё будет проходить, если мы ничего не сломали при инкапсуляции, а значит поведение программы не изменилось, если считать, что первое изменение (преобразование "плоского" кода в метод объекта) мы провели аккуратно и безопасно, что довольно вероятно, особенно при поддержке современных IDE.
Теперь мы можем начальный тест разбить на несколько, тестирующих UsersRepository и UsersView отдельно, а в начальном проверять только вызов fetchAll и show (правда это потребует сначала ещё небольшого рефакторинга, например, введение Service Locator или IoC, чтобы избавиться от жестких зависимостей и иметь возможность подставлять моки). После этого мы без проблем сможем сменить mysql_* на PDO или Doctrine2, а Smarty на Twig или нативные шаблоны (тестирование шаблонов отдельная тема).
Пример, конечно, высосан из пальца, но основные принципы показывает, имхо.С самого начала Кармак оговаривается, что качество кода — не самое важное в разработке ПО, и «признание этого факта не является каким-то моральным поражением. Ценность — вот что вы пытаетесь создать, а качество — всего лишь один из аспектов, наряду со стоимостью, функционалом и другими факторами. Было много чрезвычайно успешных и уважаемых игр, полных багов и постоянно вылетающих; так что применение стиля программирования космических челноков в игровой разработке было бы идиотизмом. Однако, качество всё равно имеет значение».
Код в стиле «дамп потока сознания»