Всем привет!
Когда-то один товарищ убедил меня в том, что global vars — это нехорошо, и наплодил я уйму синглтонов на PHP5, создающихся по требованию и живущих, пока скрипт не скончается. В целом, весьма удобно.
Сейчас делаю сайтик, серверная PHPшная часть которого принимает и отдает по HTTP только XML (клиент на Flash). Захотелось мне покрыть unit-testами этот серверный XML-based API. Чтобы не запускать каждый тест через HTTP с внешними редиректами (долго и неэстетично), я должен либо отказаться от синглтонов, либо убивать их экземпляры ручками перед началом каждого теста, сбрасывая состояние приложения в "только что запущено":
class CSingleton {
...
function destroyInstance() {
UT::checkActive(); // throws if not in unit-testing mode
self::$__instance = NULL;
}
};
Оба варианта кажутся одинаково кривыми. Кроме того, не исключена ситуация, когда мне потребуется тестировать синглтон, а потом создавать его экземпляр как часть среды для тестов других классов.
В общем, выглядит все это так, что сингтоны — сакс. До сих пор не могу понять, куда ж мне ползти? Как осел буриданов... Подскажите плиз что-нибудь дельное.
И есть ли какие-нибдуь книги/статьи по поводу грамотной декомпозиции именно с точки зрения TDD?