25 Stimmen

Sind Information Expert & Tell Don't Ask nicht im Widerspruch zum Single Responsibility Principle?

Information-Expert, Tell-Don't-Ask und SRP werden oft gemeinsam als bewährte Praktiken genannt. Aber ich denke, sie stehen im Widerspruch zueinander. Hier ist, worum es mir geht.

Code, der SRP bevorzugt, aber gegen Tell-Don't-Ask & Info-Expert verstößt:

Customer bob = ...;
// TransferObjectFactory muss die Accessoren von Customer verwenden, um ihre Arbeit zu erledigen, 
// verstößt gegen Tell Don't Ask
CustomerDTO dto = TransferObjectFactory.createFrom(bob); 

Code, der Tell-Don't-Ask & Info-Expert bevorzugt, aber gegen SRP verstößt:

Customer bob = ...;
// Jetzt macht der Kunde mehr als nur das Domain-Konzept des Kunden darzustellen,
// verstößt gegen SRP
CustomerDTO dto = bob.toDTO();

Bitte erläutern Sie mir, wie diese Praktiken friedlich nebeneinander existieren können.

Definitionen der Begriffe:

  • Information Expert: Objekte, die die für eine Operation benötigten Daten haben, sollten die Operation hosten.

  • Tell Don't Ask: Fordern Sie Objekte nicht nach Daten an, um Arbeit zu erledigen; sagen Sie den Objekten, die Arbeit zu erledigen.

  • Single Responsibility Principle: Jedes Objekt sollte eine klar definierte Verantwortung haben.

0 Stimmen

Eine kleine Vorstellung der Begriffe, die du verwendest, hätte hilfreich sein können.

3 Stimmen

Die kurze Antwort ist ja ... die lange Antwort ist, dass manchmal Leute (Akademiker) vergessen, dass Programmierung noch keine perfekte Wissenschaft ist ... wir haben keine Sprache, die sauber genug ist, um all diese Prinzipien zu erfüllen. Brechen Sie das Prinzip, das am sinnvollsten ist.

1 Stimmen

Dein zweites Beispiel verstößt zwar gegen das SRP, ist aber kein wirklich gutes Beispiel für Tell Don't Ask.

0voto

Ed Hastings Punkte 176

Ich stimme nicht zu 100% mit Ihren beiden Beispielen als repräsentativ überein, aber aus einer allgemeinen Perspektive scheinen Sie von der Annahme von zwei Objekten und nur zwei Objekten aus zu argumentieren.

Wenn Sie das Problem weiter aufteilen und ein (oder mehrere) spezialisierte Objekte erstellen, um die individuellen Verantwortlichkeiten zu übernehmen, und dann das steuernde Objekt Instanzen der anderen Objekte, die es verwendet, an die spezialisierten Objekte weiterleiten, sollten Sie einen glücklichen Kompromiss zwischen SRP (jede Verantwortung wird von einem spezialisierten Objekt übernommen) und Tell Don't Ask (das steuernde Objekt sagt den spezialisierten Objekten, die es zusammenstellt, was sie gegenseitig tun sollen) beobachten können.

Es handelt sich um eine Kompositionslösung, die auf einem Controller irgendeiner Art beruht, der zwischen anderen Objekten koordiniert und delegiert, ohne sich in ihren internen Details zu verstricken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X