Предположим, вы разделяете свои системы на объекты Value и объекты Services (как это предлагается в "Растущем объектно-ориентированном программном обеспечении, управляемом тестами". Misko Hevery называет эти "newables" и "injectables".
Чтопроисходит, когда одному из ваших объектов-значений внезапно требуется доступ к сервису для реализации его методов?
Допустим, у вас есть хороший простой объект Value. Он неизменный, содержит несколько битов информации и все об этом.мы используем его примерно так:
CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
// do stuff
}
else
{
// don't do stuff
}
Пока все хорошо. isValid()
реализует алгоритм контрольной цифры для номера карты и возвращает true / false.
Теперь, скажем, яВы хотите улучшить систему, проверив дату окончания срока действия по текущему времени. Как бы вы предположили, что это делается без нарушения парадигмы объекта Value / Service? Мне бы хотелось, чтобы этот класс продолжал проверяться модулем.
CreditCard
теперь имеет зависимость, но из-за того, как она создается, ее нельзя внедрить, поэтому зависимость зависитction out. - Класс
CreditCard
не должен вызывать синглтоны (я считаю, что глобальный доступ к синглтону - плохая практика) - Включение поведения на
CreditCardVerificationService.validateCard()
означает, что весь существующий код должен быть пересмотрен.Реализация isValid () просачивается.
Я знаю, что можно обойти это, но какой самый чистый способ?