7 Stimmen

Übersetzer-Muster

Bei einer früheren Tätigkeit schlug mein Vorgesetzter die Verwendung eines Translator-Musters für die Konvertierung von Daten aus einer DataTable in Objekte vor. Die Translator-Klasse hatte im Grunde nur statische (d.h. Klassen-) Methoden, so dass es sich um eine Ansammlung von Funktionsaufrufen handelte. Mein anfänglicher Ansatz bestand darin, Konstruktoren für jedes Objekt zu implementieren, die eine DataTable-Zeile als Argument nehmen und eine Instanz erstellen konnten, die den Daten entsprach.

Er sagte, dass die Translator-Klasse von Microsoft vorgeschlagen worden sei und eine bessere Modularität des Codes biete. Ich kann diesen Punkt nachvollziehen, aber gleichzeitig scheint es ein sehr Non-OO-Ansatz zu sein (obwohl das Visitor-Muster ähnliche Eigenschaften hat).

Hat jemand von euch dieses Muster verwendet und was haltet ihr davon? Vor- und Nachteile?

5voto

GrayWizardx Punkte 17771

Von C2.Com scheint es, dass das Translator-Muster eine Nicht-OOP-Implementierung des Besucher-Musters ist. Es stellt fest, und das Ende des Artikels ein paar der Nachteile, einschließlich der Tatsache, dass in OOP-Semantik ist es schwierig, auszudrücken (aber nicht Code), mit anderen Worten, es wird gut funktionieren, kann aber nicht viel Sinn machen, wenn Sie mit reinem OOP für den Rest Ihres Codes sind.

4voto

Igor Zevaka Punkte 71448

Ich glaube, Sie sprechen von Entitätsübersetzer . Ich denke, dass der Übersetzer in diesem Szenario natürlich eine statische Methode ist. Wo er untergebracht ist, ist eine Frage der Ästhetik. Er sollte auch recht einfach unitgetestet werden können, da er nur von zwei Datenstrukturen abhängig sein sollte, zwischen denen er übersetzt. Irgendwie klingt das so, als ob ein anderer Name für ihren "Datenvertrag" DTO (Data Transfer Object) wäre.

0 Stimmen

Danke Igor, das war ein nützlicher Link - sowohl über den Entity Translator als auch über die Existenz von Microsoft Patterns im Allgemeinen.

0voto

Beep beep Punkte 18441

Wenn Sie das Mapping ohne externe Abhängigkeiten durchführen können, dann gibt es wirklich keinen Grund, etwas anderes als eine statische Methode zu verwenden.

0voto

Richard Quinn Punkte 175

Vielleicht übersehe ich etwas, aber warum nicht einfach linq verwenden?

    IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

Jedenfalls geht es beim TranslatorPattern darum, die Datenstruktur von einer Darstellung in eine andere gleichwertige Struktur zu ändern. Hier http://c2.com/cgi/wiki?TranslatorPattern sind die tieferen Informationen dazu.

1 Stimmen

Seine Frage bezog sich auf das Übersetzungsmuster, nicht darauf, wie die Aufgabe zu bewältigen ist. Auch der OP nicht sagen, er ist mit einer bestimmten Version des Rahmens, Linq möglicherweise nicht in seinem Fall angemessen sein.

0 Stimmen

Sehr richtig. Nichtsdestotrotz habe ich für jeden, der mit einer ähnlichen Aufgabe auf diese Seite stößt, ein Code-Beispiel zur Verfügung gestellt, wie man die Aufgabe elegant lösen kann, und ich habe eine URL zur (fast) ursprünglichen Quelle des TranslatorPatterns zum Selbststudium angegeben.

0 Stimmen

@GrayWizardx, genau richtig. In meiner Situation hatte ich es mit einer API zu tun. Ich bin nicht sicher, worum es in Richards Abfragebeispiel geht, da das Problem nichts mit einer Abfrage zu tun hatte.

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