Abhängigkeitsinjektion, wenn die erstellte Klasse auch Laufzeitwerte benötigt?

Angenommen, Sie unterteilen Ihre Systeme in Value-Objekte und Services-Objekte (wie in "Wachsende objektorientierte Software, geführt von Tests" vorgeschlagen). Misko Hevery nennt diese "newables" und "injectables".

Was passiert, wenn eines Ihrer Wertobjekte plötzlich auf einen Service zugreifen muss, um seine Methoden zu implementieren?

Nehmen wir an, Sie haben ein schönes einfaches Value-Objekt. Es ist unveränderlich, enthält ein paar Informationen und das war's auch schon. Nehmen wir an, wir verwenden es in etwa so:

CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
  // do stuff
} 
else
{
  // don't do stuff
}

So weit, ist es gut.isValid() implementiert einen Prüfziffernalgorithmus für die Kartennummer und gibt true / false zurück.

Jetzt möchte ich das System verbessern, indem ich das Ablaufdatum mit der aktuellen Uhrzeit vergleite. Wie würden Sie dies vorschlagen, ohne das Value-Objekt / Service-Objekt-Paradim zu brechen? Ich würde mir wünschen, dass diese Klasse weiterhin Unit-testbar ist.

CreditCard hat jetzt eine Abhängigkeit, kann aber aufgrund der Art und Weise, wie es erstellt wird, nicht injiziert werden, sodass die Abhängigkeitsinjektion nicht verfügbar ist.DasCreditCard Klasse sollte nicht Singletons anrufen (Ich bin der Meinung, dass der globale Zugang zu einem Singleton eine schlechte Praxis ist)Putting das Verhalten aufCreditCardVerificationService.validateCard() bedeutet, dass der gesamte vorhandene Code überarbeitet werden muss. Die Implementierung von isValid () läuft aus.

ch weiß, es gibt Dinge, die getan werden können, um dies zu umgehen, aber was ist der sauberste We

Antworten auf die Frage(6)

Ihre Antwort auf die Frage