Home

Advertisement

Живой журнал Б.Л.В. - TDD - свободный полет для программиста
November 18th, 2007
06:49 pm

[Link]

Previous Entry Add to Memories Tell a Friend Next Entry
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: , ,

(Leave a comment)

Powered by LiveJournal.com

Advertisement