2009-04-14 6 views
5

Das Demeter-Gesetz (sollte eigentlich der Vorschlag von Demeter sein) besagt, dass man kein Objekt "durchgreifen" darf, um an seine Kindobjekte zu gelangen. Wenn Sie als Client eine nicht-triviale Operation ausführen müssen, sollte das Domänenmodell, mit dem Sie arbeiten, meistens diese Operation unterstützen.Demeter-Gesetz vs. REST

REST ist im Prinzip eine dumme Hierarchie von Objekten. Es ist wie ein Dateisystem von Ressourcen/Objekten, wobei jedes Objekt untergeordnete Objekte haben kann. Sie erreichen fast immer REST. Sie können optional zusammengesetzte Objekttypen mithilfe von REST-Techniken erstellen, und solange der Anbieter und der Client Vereinbarungen auf höherer Ebene treffen, können Sie die Reichweite vermeiden.

Also, wie balancierst du REST und Demeter? Es scheint mir, dass sie sich nicht in Konflikt befinden, denn REST dreht sich alles um super-lose Kopplung bis zu dem Punkt, wo es für den Provider sinnlos ist, alle Bedürfnisse der Kunden zu antizipieren, während Demeter davon ausgeht, dass die Logik zu ihr migrieren kann natürlichster Ort durch Refactoring.

Sie könnten jedoch argumentieren, dass REST nur eine Zwischenlösung ist, bis Sie Ihre Kunden besser verstehen. Ist REST nur ein Hack? Ist Demeter in jedem Server/Client-Szenario unrealistisch?

+0

Dies ist ein Vergleich von Äpfeln und Orangen. Bei REST geht es darum, skalierbare verteilte Systeme mit einer einheitlichen Schnittstelle zu erstellen. Das Gesetz von Demeter geht es darum, die Kopplung zwischen Teilen eines Systems zu reduzieren. –

+0

Denken Sie an eine Situation, in der der Client eine URL für ein untergeordnetes Objekt erstellt, anstatt die untergeordnete URL an ihn zu übergeben? Das wäre ein Verstoß, denke ich, aber nicht, wenn die URL das Ergebnis einer Elternoperation ist. –

Antwort

5
  • Ist Demeter in jedem Server/Client-Szenario unrealistisch?

Ich denke, Sie haben Ihre eigene Frage hier beantwortet. Wie unterscheidet sich REST auf diese Weise von SOAP oder XML-RPC in dieser Hinsicht?

Der Punkt der REST ist nicht super-lose Kopplung zu schaffen, aber die folgenden:

  • eine Kennung bereitzustellen, die genau die Ressource angefordert wird, beschrieben.
  • Dienste bereitzustellen, die sich verhalten wie erwartet GET Anfragen idempotent sind, PUT aktualisiert Datensätze erstellt POST, DELETE löscht
  • Zustand Minimieren auf dem Server
  • Fälle

Es gibt unnötige Komplexität Reißt gespeichert wird, wo REST ist nicht die beste Antwort, aber REST funktioniert im Allgemeinen bemerkenswert gut.

+1

Ich meine REST im Sinne eines URL-basierten Objektzugriffsmechanismus. Eine URL ist eine Verletzung von Demeter. –

+0

Alle guten Punkte, danke. Ich denke, ich dachte an "tiefe" REST-Hierarchien. Nicht jeder REST muss so sein, aber ich arbeite an einem Projekt, das ein URI-basiertes Modell für ein lose gekoppeltes System verwendet, und ich bin besorgt, dass eine tiefe Hierarchie verwendet werden kann, um die Bedürfnisse der Kunden besser zu verstehen. –

2

Ich bezahle dieses Gesetz/Vorschlag überhaupt nicht. Es vereitelt den halben Vorteil der Aggregation und Zusammensetzung, und ich werde es nicht haben.

+0

In der Tat, IMAO ist es ein Anti-Muster. – chaos

+0

Ich würde nicht so weit gehen. Wenn Sie wirklich in die Klassen privater Teile kommen, macht es das System spröder. das bedeutet nicht, dass Sie keine Methoden in der Signatur der Klasse haben können, die nur Methoden für die aggregierte Klasse aufrufen. –

1

Ich denke, dass sie wirklich orthogonal sind. REST beschreibt eine Sammlung von Ressourcen, die von URIs mit einer Reihe von kanonischen Methoden adressiert werden: GET, POST usw. Wenn die REST-Routine einen URI zurückgibt, der nicht "durchgreift", identifiziert sie ein anderes Objekt mit denselben Methodennamen.

2

Ein Link, der von einer Repräsentation bereitgestellt wird und von einer REST-Schnittstelle verfügbar gemacht wird, kann vollständig undurchsichtig sein, ohne dass Einschränkungen von REST verletzt werden. Daher würde ich vorschlagen, dass REST vollständig dem Demeter-Gesetz entspricht. Es ist nicht erforderlich, dass der Link die Struktur des URL-Bereichs in seiner URL offen legt.

z.B. In einem objektorientierten Szenario könnten Sie den Aufruf a.b.c durch einen ersetzen.

<a> 
    <link href="bc"/> 
</a> 

anstatt das zu tun

GET a 

    <a> 
     <link href="b"/> 
    </a> 

GET b 

    <b> 
     <link href="c"/> 
    </b> 

GET c 

müsste ich nicht einverstanden mit altCognito und sagen, dass eines der Hauptziele von REST ist bc

In einer RESTful Darstellung können Sie die folgenden erstellen lose Kopplung. Die einheitliche Schnittstelle, Standard-Medientypen und HATEOAS ergeben zusammen eine extrem lose gekoppelte Schnittstelle.

Als Antwort auf David Kommentar:

REST ist alles über Super-lose Kopplung zu dem Punkt, wo es sinnlos ist für den Anbieter zu versuchen, alle Bedürfnisse der Kunden zu antizipieren

Eigentlich geht es bei REST darum, die Client-Optionen zu beschränken, indem nur gültige Links in den Repräsentationen bereitgestellt werden. Innerhalb dieser Einschränkungen kann der Client versuchen, seine eigenen Bedürfnisse zu befriedigen. Durch das Entfernen des Wissens vom Client, wann bestimmte Anforderungen gestellt werden können, erreichen Sie eine lose Kopplung. Lose Kopplung wird nicht durch Auflisten einer Reihe von Ressourcen erreicht und sagen: "OK, Sie können GET, PUT, POST, DELETE alles, was Sie wollen."