520 Часть II. Типовые решения
простой, насколько это возможно; излишняя сложность замедлит процесс разработки,
чего мы, собственно, и пытаемся избежать.
В качестве примера рассмотрим процесс замены службы, определяющей величину
налога с продажи. Такая служба принимает на вход место проживания покупателя, тип
товара и стоимость покупки, а возвращает ставку налога с продажи, принятую в соответ-
ствующем штате США, и величину налога на указанную сумму. Самый простой способ
заменить подобную службу фиктивной службой — написать две-три строки кода, которые
будут высчитывать налог с продажи, используя единую ставку для всех товаров и покупа-
телей.
Разумеется, настоящие законы налогообложения далеко не так просты. В некоторых
штатах отдельные типы товаров освобождаются от налогов, поэтому определить комби-
нацию товара и штата, для которой не следует подсчитывать величину налога, можно
только с помощью реальной службы. Между тем большая часть функциональности на-
шего приложения зависит от того, облагается налогом данный тип товара или нет, по-
этому нужно усовершенствовать фиктивную службу, чтобы она учитывала подобные тон-
кости. Стараясь не усложнять задачу, добавим к фиктивной службе условное выражение,
которое будет исключать из списка товаров, облагаемых налогом, одну фиксированную
комбинацию товара и штата, и затем используем эту комбинацию во всех остальных ва-
риантах тестирования. Таким образом, количество строк кода нашей фиктивной службы
все еще не превышает числа пальцев на одной руке.
Более динамичная фиктивная служба могла бы поддерживать список комбинаций то-
варов и штатов, не облагаемых налогом, с возможностью добавления новых комбинаций
во время тестирования. Тем не менее даже для такой реализации фиктивной службы по-
надобилось бы не более 10 строк кода. Не забывайте: наша цель состоит именно в том,
чтобы ускорить процесс разработки, поэтому при любых обстоятельствах фиктивная
служба должна оставаться достаточно простой.
Применение динамической фиктивной службы вызывает весьма интересный вопрос,
связанный с ее зависимостью от вариантов тестирования. Пополнение списка товаров,
не облагаемых налогом, осуществляется посредством метода, которого нет в интерфейсе
шлюза, применяемого для доступа к реальной службе. Чтобы фиктивную службу можно
было загрузить при помощи дополнительного модуля, упомянутый метод должен быть до-
бавлен к шлюзу. Думаю, добавление нескольких строк кода никак не отяготит шлюз, осо-
бенно если это делается во имя тестирования. Обязательно убедитесь, что реализация
шлюза, методы которой вызывают реальную службу, генерирует ошибки подтверждения
во всех упомянутых методах во время тестирования.
Назначение
Фиктивная служба используется тогда, когда зависимость приложения от конкретной
внешней службы значительно затрудняет процесс разработки и тестирования.
Следует отметить, что многие приверженцы экстремального программирования упот-
ребляют термин объект-имитатор (mock object), имея в виду не что иное, как фиктивную
службу. Мы считаем нужным употреблять именно термин "фиктивная служба", так как
он используется дольше, нежели термин "объект-имитатор".