it-swarm.com.de

Liege ich falsch, wenn ich denke, dass die Notwendigkeit von AutoMapper ein Hinweis auf schlechtes Design ist?

Automapper ist ein "Objekt-Objekt-Mapper" für .Net, was bedeutet, dass Objekte aus einer Klasse in eine andere Klasse kopiert werden, die dasselbe darstellt.

Warum ist das jemals nützlich? Ist die Vervielfältigung von Klassen jemals nützlich/gutes Design?

36
static_rtti

Eine schnelle Google-Suche ergab dieses Beispiel:

http://www.codeproject.com/Articles/61629/AutoMapper

dies zeigt eine absolut gültige Verwendung von AutoMapper, die definitiv kein Beispiel für ein schlechtes Design ist. In einer mehrschichtigen Anwendung befinden sich möglicherweise Objekte in Ihrer Daten- oder Geschäftsschicht, und manchmal benötigen Sie nur eine Teilmenge der Attribute dieser Datenobjekte oder eine Art Ansicht für diese in Ihrer Benutzeroberflächenschicht. Sie erstellen also ein Ansichtsmodell, das Objekte mit genau den Attributen enthält, die Sie in Ihrer Benutzeroberfläche benötigen, nicht mehr, und verwenden AutoMapper, um den Inhalt dieser Objekte mit weniger Code zu versehen.

In einer solchen Situation sind Ihre "Ansichtsobjekte" kein Duplikat der ursprünglichen Klasse. Sie haben verschiedene Methoden und vielleicht ein paar doppelte Attribute. Dies ist jedoch in Ordnung, solange Sie diese Ansichtsobjekte nur für Anzeigezwecke der Benutzeroberfläche verwenden und sie nicht für Datenmanipulationen oder Geschäftsvorgänge missbrauchen.

Ein weiteres Thema, das Sie möglicherweise lesen, um dies besser zu verstehen, ist Fowlers Command Query Responsibility Segregation Muster im Gegensatz zu CRUD. Es zeigt Ihnen Situationen, in denen verschiedene Objektmodelle zum Abfragen und Aktualisieren von Daten in einer Datenbank sinnvoll sind. Hier kann die Zuordnung von einem Objektmodell zu einem anderen auch mit einem Tool wie AutoMapper erfolgen.

28
Doc Brown

Ist die Vervielfältigung von Klassen jemals nützlich/gutes Design?

Es wird empfohlen, eine separate Ansichtsmodellklasse für die Verwendung in der Benutzeroberflächenebene zu verwenden, anstatt dieselbe Klasse zu verwenden, die in der Datenebene verwendet wird. Auf Ihrer Benutzeroberfläche/Webseite müssen möglicherweise andere Informationen angezeigt werden, die nicht ausschließlich mit der Datenentität zusammenhängen. Durch das Erstellen dieser zusätzlichen Klasse geben Sie sich die Freiheit, Ihre Benutzeroberfläche einfach zu optimieren, wenn sich die Anforderungen im Laufe der Zeit ändern.

Was die Verwendung von AutoMapper angeht, vermeide ich dies persönlich aus drei Gründen:

Stille Fehler häufiger

Da AutoMapper automatisch zwischen Eigenschaften zugeordnet wird, wird beim Ändern eines Eigenschaftsnamens für eine Klasse und nicht für die andere die Eigenschaftszuordnung übersprungen. Der Compiler wird es nicht wissen. Automapper ist das egal.

Fehlende statische Analyse

Sie haben also eine große Codebasis erhalten, mit der Sie umgehen können. Es gibt eine Million Klassen mit einer Million Immobilien. Vieles sieht so aus, als ob sie nicht verwendet werden oder Duplikate sind. Mit dem Tool "Alle Referenzen suchen" in Visual Studio können Sie sehen, wo Eigenschaften verwendet werden, und in Ihrem Kopf eine Karte erstellen, wie die gesamte Anwendung zusammenhängt. Aber warten Sie, es gibt keine expliziten Verweise auf die Hälfte der Eigenschaften, da Automapper verwendet wird. Mein Job ist jetzt verdammt viel schwieriger.

Späte Anforderungen, die die Komplexität erhöhen

Automapper ist in Ordnung und gut, wenn Sie nur die Werte von EINER Klasse in eine andere kopieren möchten (wie dies zu Beginn der Entwicklung häufig der Fall ist). Denken Sie jedoch an die Anforderungen, die sich im Laufe der Zeit ändern? Was ist, wenn Sie jetzt Werte aus anderen Teilen Ihrer Anwendung abrufen müssen, möglicherweise spezifisch für den angemeldeten Benutzer oder einen anderen Kontextstatus?

Das AutoMapper-Muster zum Erstellen der Eins-zu-Eins-Klassenzuordnungen beim Start der Anwendung eignet sich nicht für diese Art von kontextspezifischen Änderungen. Ja, es gibt wahrscheinlich Möglichkeiten, es zum Laufen zu bringen, aber ich finde es normalerweise sauberer, einfacher und ausdrucksvoller, die Logik selbst zu schreiben.

Bevor Sie nach Automapper greifen, um sich 30 Sekunden Zeit zu sparen, wenn Sie eine Klasse manuell einer anderen zuordnen, sollten Sie darüber nachdenken.

Programmieren ist die Kunst, einem anderen Menschen zu sagen, was der Computer tun soll. - Donald Knuth

Fragen Sie sich vor diesem Hintergrund: "Ist AutoMapper heute hilfreich und wird es morgen sein?"

48
Dave B 84

Nach meiner Erfahrung war es eine der folgenden Situationen, wenn sich jemand über "zu viel Boilerplate" beschwert hat und AutoMapper verwenden möchte:

  1. Sie finden es irritierend, immer wieder denselben Code zu schreiben.
  2. Sie sind faul und möchten keinen Code schreiben, der A.x = B.x.
  3. Sie stehen unter zu viel Zeitdruck, um tatsächlich darüber nachzudenken, ob es eine gute Idee ist, immer wieder A.x = B.x zu schreiben, und dann guten Code für die Aufgabe zu schreiben.

Jedoch:

  1. Wenn es wirklich darum geht, Wiederholungen zu vermeiden, können Sie ein Objekt oder eine Methode erstellen, um es zu abstrahieren. Sie benötigen keinen AutoMapper.
  2. Wenn Sie faul sind, sind Sie faul und lernen nicht, wie AutoMapper funktioniert. Stattdessen übernehmen Sie das Muster "Programmieren durch Zufall" und schreiben schrecklichen Code, in dem Sie die Geschäftslogik in ein AutoMapper-Profil einfügen. In diesem Fall sollten Sie Ihre Einstellung zum Programmieren ändern oder etwas anderes als Beruf finden. Sie benötigen keinen AutoMapper.
  3. Wenn Sie zu viel Zeitdruck haben, hat Ihr Problem nichts mit der Programmierung selbst zu tun. Sie benötigen keinen AutoMapper.

Wenn Sie eine statisch typisierte Sprache ausgewählt haben, nutzen Sie die Sprache. Wenn Sie versuchen, die Steuerelemente in der Sprache zu umgehen, die dazu beitragen, Fehler aufgrund übermäßiger Verwendung von Reflection- und Magic-APIs wie AutoMapper zu vermeiden, bedeutet dies nur, dass Sie eine Sprache ausgewählt haben, die für Ihre Anforderungen nicht zufriedenstellend ist.

Nur weil Microsoft C # Funktionen hinzugefügt hat, bedeutet dies nicht, dass sie in jeder Situation ein faires Spiel sind oder Best Practices unterstützen. Reflexion und das Schlüsselwort "dynamisch" sollten beispielsweise in Fällen verwendet werden, in denen Sie ohne sie einfach nicht das erreichen können, was Sie benötigen. AutoMapper ist keine Lösung für Anwendungsfälle, die ohne AutoMapper nicht bereits gelöst werden können.

Ist die Vervielfältigung von Klassen schlechtes Design? Nicht unbedingt.

Ist AutoMapper eine schlechte Idee? Ja absolut.

Die Verwendung von AutoMapper weist auf Systemmängel im Projekt hin. Wenn Sie es brauchen, hören Sie auf und denken Sie über Ihr Design nach. Sie werden immer ein besseres, lesbareres, wartbareres und fehlerfreieres Design finden.

22

Hier gibt es ein tieferes Problem: Die Tatsache, dass C # und Java darauf bestehen, dass die meisten/alle Typen eher nach Namen als nach Struktur unterscheidbar sein müssen: zB class MyPoint2D Und class YourPoint2D sind separate Typen, auch wenn sie genau die gleichen Definitionen haben. Wenn der gewünschte Typ "eine anonyme Sache mit einem x Feld und einem y Feld" ist (dh ein Datensatz), Sie haben kein Glück. Wenn Sie also einen YourPoint2D in einen MyPoint2D verwandeln möchten, haben Sie drei Möglichkeiten:

  1. Schreiben Sie eine mühsame, sich wiederholende, weltliche Kesselplatte nach dem Vorbild von this.x = that.x; this.y = that.y
  2. Generieren Sie den Code irgendwie.
  3. Verwenden Sie Reflexion.

Wahl 1 ist in kleinen Dosen einfach genug, wird aber schnell zur Pflicht, wenn die Anzahl der Typen, die Sie zuordnen müssen, groß ist.

Auswahl 2 ist weniger als wünschenswert, da Sie jetzt einen zusätzlichen Schritt zu Ihrem Erstellungsprozess hinzufügen müssen, um den Code zu generieren, und sicherstellen müssen, dass das gesamte Team das Memo erhält. Im schlimmsten Fall müssen Sie auch Ihren eigenen Codegenerator oder Ihr eigenes Vorlagensystem rollen.

Das lässt dich nachdenken. Sie können es selbst tun oder AutoMapper verwenden.

7
Doval

Automapper ist eine jener Bibliotheken/Werkzeuge, in denen der Kaiser buchstäblich hinternackt herumläuft. Wenn Sie das schillernde Logo hinter sich lassen, stellen Sie fest, dass es nichts tut, was Sie nicht manuell mit viel besseren Ergebnissen tun können.

Ich bin mir zwar nicht ganz sicher, wie es auf Mitglieder mit automatischer Zuordnung hinweist, aber es beinhaltet höchstwahrscheinlich zusätzliche Laufzeitlogik und mögliche Überlegungen. Dies kann eine erhebliche Leistungseinbuße sein, wenn Zeit eingespart wird. Manuelles Mapping hingegen wird der Hinweis lange vor der Kompilierungszeit ausgeführt.

In Fällen, in denen AutoMapper keine Ahnung hat, müssen Sie die Zuordnung mit Code konfigurieren und Flags setzen. Wenn Sie sich um die Einrichtung und die Code-Arbeit kümmern möchten, müssen Sie sich fragen, wie viel Sie bei der manuellen Zuordnung sparen.

4
user148298