Живой журнал Б.Л.В. - TDD - свободный полет для программиста
[Recent Entries][Archive][Friends][User Info]
06:49 pm
[Link] |
TDD - свободный полет для программиста В связи с обсуждением BCD и TDD (здесь и здесь), хочу привести небольшой пример по разработке через тестирование. Дело в том, что TDD позволяет программисту... меньше думать. Плохие программисты всегда сосредоточены на реализации, хорошие думают прежде всего о дизайне, ведь исправить промах в нем будет стоить тяжелее (читай дороже). Как раз когда разработка ведется через тесты - дизайн появляется и оттачивается сам. Можно привести такую метафору:
Код - это прямоугольный кусок мрамора, тесты выточат из нее статую (дизайн) и затем отполируют (реализация).
Кейс Кейс простой - я колдовал над простенькой реализацией универсальной Active Record на PHP5. Первым делом написал простой тест (Starter Test). Его я реализовать не смог - поэтому поставил на него метку Skipped, в отличии от Кента Бека я не пользуюсь бумагой :) Этот тест мне подсказал, что надо бы реализовать создание таблицы в БД по классу. Вопрос в каком классе должен быть этот метод решается с помощью "самошунтирования" (Self Shunting) - и метод помещается прямо в тестовый класс. Делаем тест зеленым. Рефакторим и делаем тудушку, чтобы вынести этот метод в нужный класс. На самом деле у меня было три теста, люблю идти медленно но уверенно. Дальше тупо рефакторю - удаляю одинаковый код. Больше всего одинаковых гадостей - это код для работы с базой. Выкидываем в отдельный класс. Тесты более менее чистые. Теперь можно реализовать самый первый тест - сохранение в базу объекта. Делаю класс потомок от ActiveRecord и его самого. Делаю тест зеленым. Рефакторю - делаю метод для определения метаданных (полей класса). Рефакторю - кидаю создание таблицы в ActiveRecord.
Проблемы, с которыми сталкивался: 1) Запросы к базам лучше генерить с помощью специального объекта.
Что еще воняет плохо пахнет в коде и что еще надо сделать 1) Слишком длинный метод по созданию схемы данных, там можно выделить несколько классов, но я этого не делал, потому тесты это не сказали. Нет тестов - нет кода. Кроме того код не очень понятен: reflection + sql = опухоль головного мозга. 2) Параметры соединения с базой надо брать из конфига. 3) Нет логов. 4) ActiveRecord (точнее его потомки) получается не очень цельным. Возможно придется пилить. 5) В тестах возможно стоит использовать провайдеры данных. 6) Есть одна глобальная переменная! 7) До конца реализовать класс ActiveRecord :)
Вывод TDD позволяет даже такому программисту как я писать (у которого скиллы не прокачены), писать работающие программы, при этом затрачивать минимум умственных усилий.
Tags: active record, tdd, программирование
|
|