2012-10-04 4 views
2

Я разрабатываю новую архитектуру программного продукта моей компании. Я довольно новичок в модульном тестировании. Я прочитал некоторые ужасные истории об использовании одноэлементных и статических методов, но я не совсем понимаю проблему с их использованием и буду благодарен за некоторое просветление.PHP Статические методы/шаблон Singleton

Вот что я делаю:

У меня есть архитектура многоуровневой. На уровне сервера я использую ряд повторно используемых объектов для представления таблиц базы данных, называемых «Обработчики». Эти обработчики используют другие объекты, такие как XMLObjects, XMLTables, различные Datastructures и т. Д. Большинство из них являются домашними, а не ваши предварительно упакованные объекты. Во всяком случае, поверх этого слоя находится псевдоожиженный слой. Основной целью этого является упрощение более высоких уровней кода на стороне сервера и создание бесшовного управления классами. Могу сказать:

$tablehandler = databasename::Handler('tablename') 

... чтобы получить стол. Я не вижу врожденной проблемы с этим. Я использую стек обработчиков (ассоциативный массив), чтобы содержать экземпляры разных объектов. Я не использую глобальные переменные, и все статические данные являются защищенными или частными. Мой вопрос заключается в том, как это может вызвать проблемы с модульным тестированием. Я не ищу риторики победителей, я ищу причинную связь. Я также был бы признателен за любое другое понимание этого. На данный момент я чувствую себя чрезвычайно гибкой и эффективной архитектурой. Любая помощь здесь была бы замечательной.

+4

Вам действительно не нравятся белые пространства .... – Baba

+0

Это хороший дизайн, на самом деле. Не могу помочь u с однотонными дебатами, но уверен, что совершенно новаторское мышление –

+0

Я бы сказал, что самая большая разница в использовании [интерфейсов] (http://php.net/manual/en/language.oop5.interfaces.php) – Ohgodwhy

ответ

4

Использование статических методов для обеспечения доступа к управляемым экземплярам - будь то одиночные, объединенные объекты или экземпляры «на лету» - не является проблемой для тестирования, если вы предоставляете способ тестирования при необходимости приложите свои собственные макеты и заглушки и удалите их после завершения. Из вашего описания я не вижу ничего, что могло бы блокировать эту способность. Вам просто нужно построить его, когда это необходимо.

Вы столкнетесь с трудностями, если у вас есть класс, который статически вызывает методы, которые выполняют работу без точки расширения или проходят через экземпляр. Например, вызов, как этот

UserTable::findByEmail($email); 

делает тестирование трудно, потому что вы не можете подключить поругание памяти только таблицы и т.д. Тем не менее, изменение его

UserTable::get()->findByEmail($email); 

решает эту проблему, потому что тест может вызвать UserTable::set($mock) в установочном коде. Более подробный пример см. В разделе this answer.

+0

Спасибо вам за ответ! Помогает alot –

+4

Конечно, следует отметить, что второй пример, который «решает проблему», является вопиющим нарушением Закона Деметры. – rdlowrey

+0

@rdlowrey - Кажется довольно безобидным, учитывая, что ОП решил использовать статические методы. LoD больше не раскрывает внутреннее состояние, например '$ order-> addItem ($ item)' вместо '$ order-> getItems() -> add ($ item)', чем о локаторе службы или singleton узоры. –

Смежные вопросы