Frage

Ich fragte vor kurzem diese Frage: Expose XML oder Objekte - dank allen für die Antworten

.

Ein Punkt zu klären.

  • Die API wird immer remote zugegriffen werden (das heißt als Service), höchstwahrscheinlich durch einen Web Service oder WCF.

Ich bin damit einverstanden, dass ein stark API in Theorie typisierte Objekte wie die Ein- / Ausgänge Belichtung ist der rechts Weg zu gehen. Allerdings glaube ich, dass es immer noch ein Argument für die Belichtung XML gemacht werden. Wie ich es, die Gründe für die Verwendung von XML zu sehen sind:

  1. Die Geschäftsregeln können von Business-Analysten in Schematron geschrieben werden.
  2. Die Schnittstelle ist schwach typisiert, aber sobald es die Daten aufgerufen wird, können gegen Daten und Geschäftsregeln validiert werden.
  3. Die Implementierung des Service wird einfacher. Es wird keine Notwendigkeit nicht ein Domain-Objektmodell zu erstellen.
  4. Das XML-Schema ist bereits definiert (wir ein Datenwörterbuch von Schema haben).
  5. Mit Web-Services-Technologie bedeutet, dass eine XML-basierte API nicht als neues Auto ‚Typen‘ hinzugefügt werden ändern müssen, z.B.

    void AddNewCar( string newCarXml )    
    string[] GetCars( /* some query conditions */ )
    

    Wenn wir ein Objekt-basierte API verwenden dann eine neue Art würde das Hinzufügen eine neue Abfragemethode erfordern die möglichen abgeleiteten Typen definieren, die zurückgegeben werden (siehe extending Webdiensten ). Aktualisieren der Web-Service wie dies würde diese Dienste benötigen und alle bestehende Kunden wieder aufgebaut und umgeschichtet werden.

Was ist ein Objekt-basierte API geben Sie uns? Eine stark typisierte deklarative Schnittstelle. Es bietet keine mehr Abstraktion als XML (XML selbst ist eine Abstraktion). Was bedeutet das Objekt basierte API Kosten? Es kostet eine ganze Reihe von Domain-Objekten, die Validierung von Geschäftsregeln und Daten benötigen.

Also, was ist meine Frage? Gib mir ein un-defeatble, unarguable Grund, warum ich mit Objekten gehen sollte.

War es hilfreich?

Lösung

  • können Objekte eine bessere Leistung (Denken binäre Serialisierung hier).
  • Objekte können stärker einfachen Typen Validierungen haben.
  • Objekte können Sie die Validierung und Geschäftsregeln näher an der Datenstrukturdefinition setzen.
  • Objekte von ihrer Natur ermöglicht es Ihnen einfacher Geschäftsregeln und Validierung zu schreiben, da ein großer Teil der in der Objektdefinition eingebettet ist selbst.
  • Objekte können auch Verhaltensweisen definieren.
  • .Net macht es einfach Objekte in Xml drehen und wieder zurück über die Serialisierung, Objekte die meisten die gleichen Vorteile wie xml geben.

Andere Tipps

Wenn Sie sich für ein Argument zugunsten von XML (nicht, dass ich mich ganz besonders für XML) suchen:

  • , um die XML-Belichtungs- und eine XSD-Bereitstellung ist selbsterklärend, wenn es um Daten geht. Sie können alle Daten in dieser Form abgehen, es selbst dokumentierte ist und vernünftigerweise einfach überprüft werden.

  • Ich kann eine Reihe von sicherem Code gegen meine Datenbank oder Code Modell schreiben und ich kann die Daten in einer Selbstmitteilung enthaltenen und sichere Art und Weise zu anderen Geschäftseinheiten, die ein minimalen weitere Unterlagen oder Erklärung bedürfen.

  • Es ist so einfach, dass zu lesen, oft kann man es so leicht zu lesen, wie Sie die Dokumentation oder Code-Kommentare lesen können.

Die Argumente gegen sie jedoch weiter und weiter gehen ... die schlimmsten Übeltäter zu nennen:

  • Allzu ausführlich.
  • Sehr große Netzwerk-Overhead.
  • erfordert ein Verständnis für eine zusätzliche Technologie, vielleicht unnötig (?).
  • Je komplexer Sie etwas, die größere Chance für Fehler dort zu machen sind.

Starke Typisierung in der Tat überhaupt eine Typisierung für die Materie aus dem einzigen Grunde besteht, dass der Programmierer keine dummen Fehler macht (z. B. eine Zeichenfolge an eine Funktion einen int etc erwartet). Hinzu kommt, dass diese in der Kompilierung geschieht und kosten nichts zur Laufzeit so effizienten Code produzieren durch Laufzeitprüfungen zu vermeiden (z. B. für die richtigen Abgüsse) und abnormales Verhalten zur Laufzeit für nicht verwalteten Code zu vermeiden.

Wie Sie schon sagten Xml verwendet werden können, ein Ersatz-Objektmodell zu definieren, aber das Objektmodell benötigt die gleichen Prüfungen zur Laufzeit zu unterziehen Zuverlässigkeit zu einem gewissen Grad zu gewährleisten. Das hat aber einen gewissen endlichen Laufzeit-Overhead.

Having said that alles, was ich sagen möchte, ist, dass die endgültige Wahl. Sind Sie bereit, die Sicherheit (und manchmal auch Seelenfrieden) zu verlassen mit einem „starren“ Objektmodell gewährt oder werden Sie sich wohler mit einem flexibleren, aber kann-Shoot-yourself-in-the-Fuß-Objektmodell? XML erfordert eine größere Programmierer Disziplin und Wachsamkeit (so es eine lästige Pflicht macht IMHO zu verwenden).

Die „Aufgabe zugrunde,“ API ist nicht so starr, wie Sie denken, automatisch generierte XML-Schemata tun maynot, was Sie wollen, dass sie wirklich zu tun. Objektbasierte APIs kann genauso flexibel wie XML-basierte API gemacht werden, wenn sie gut gestaltet worden ist. Dynamische Typisierung kann auch manchmal helfen.

Wenn Sie reines XML aussetzen, alle Ihre Kunden müssen Code schreiben, XML zu generieren und zu analysieren. So einfach in einigen Sprachen ein PITA in anderen.

Aber die meisten Sprachen haben Web-Service-APIs, die WSDL-Datei / XSD und erzeugen eine vollständige Client-Bibliothek in Sekunden dauern. Sicher, sie werden müssen, um ein Mapping-Dienstprogramm schreiben aus ihrem internen Modell zu Modell abzubilden, mit Ihnen zu interagieren, aber das ist zu erwarten.

Ihr Web-Service wird alle Objekt behandelt <-> XML Sachen intern (für die Sicht des Kunden), werden Sie nicht über SOAP und das alles zu kümmern. Sie werden definieren Sie Ihre Schnittstelle:

void addCar(Car newCar);
Car getCar(String make, String model, String year);
void removeCar(...);
List<Car> getAllCars();

, die sehr viel Sinn für Ihre Kunden macht. Sie packen Ihre WSDL-Datei und generieren ihre Client-Bibliotheken in Java, C #, PHP, Python, etc.

Es gibt nichts hindert Sie fügte hinzu:

int addCarXML(String carXML);
String getCarXML(int carID);

Aber warum zwei Ebenen der webservice cruft hinzufügen - zuerst die WSDL-Datei, dann die XSDs für das XML-Schema ...

Werfen Sie einen Blick auf das Web nach Artikeln über Contract-First Design hat der Frühling Website ein gutes Beispiel. Ich bin eine neue Website zu entwickeln jetzt und habe den Ansatz, beginnend mit und XML-Schema genommen und mit ihm meine Anwendung Domain-Modell zu entwerfen. XML ist eine ausgezeichnete, um Daten zwischen unterschiedlichen Systemen zu senden oder sogar Schichten Ihrer Anwendungen. Es ist Programmiersprache Agnostiker und es gibt viele Werkzeuge zur Bearbeitung, Gestaltung und Implementierung von XML-basierten Design.

Es ist ausführlich, aber in der Ordnung der Dinge die Ausführlichkeit ist ein kleines Ärgernis. Es kann große Dateien erstellen, es ist einfach zu komprimieren. Es ist mehr Aufwand in der Verarbeitung, aber wir Entwickler handeln immer reine Leistung für einfache Bedienung, Wartbarkeit, Erweiterbarkeit usw.

Hier ist ein weiterer zufälliger Gedanke - weder ;-p verwende ich von anderen Austauschformate denke. Ich habe eine Menge Arbeit in letzter Zeit mit Protokollpuffern getan - die Contract-First-Nutzung bietet (über eine „Proto“ Definition), ist aber mit sicherer Erweiterbarkeit konzipiert - dh Sie Dinge entwerfen können unerwartete Daten durchlaufen, ohne zu brechen oder Verlust. Leider ist der Hauptprotokollpuffer spec nicht wirklich umfassen Vererbung, aber meine Implementierung (protobuf-net) Beilagscheiben dies über Erweiterungen.

Ob es reif ist, hängt genug auf dem Szenario - dachte ich nur könnte es von Interesse sein. Als Nebenwirkung, es (protobuf-net) auch Stecker in WCF für die Bequemlichkeit eines vorgewalzten RPC-Stack ;-p

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top