Porównując strukturę REST [api] z modelem OO, widzę następujące podobieństwa:
Obie:
Są zorientowane na dane
- REST = zasoby
- OO = Przedmioty
Operacja surround wokół danych
- REST = otaczaj VERBS (Get, Post, ...) wokół zasobów
- OO = promuj działanie wokół obiektów przez enkapsulację
Jednak dobre praktyki OO nie zawsze stoją na apelach REST podczas próby zastosowania wzoru fasady, na przykład: w REST nie masz 1 kontrolera do obsługi wszystkich żądań ORAZ nie ukrywasz złożoności obiektów wewnętrznych.
Przeciwnie, REST promuje publikowanie zasobów wszystkich relacji z zasobem i innymi w co najmniej dwóch formach:
poprzez relacje hierarchii zasobów (kontakt o identyfikatorze 43 składa się z adresu 453):
/api/contacts/43/addresses/453
za pośrednictwem łączy w odpowiedzi json REST:
>> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] }
Wracając do OO, wzór projektowania elewacji szanuje Low Coupling
między obiektem A i jego „ klientem objectB ”, a High Cohesion
dla tego obiektu A i jego składu wewnętrznego obiektu ( objectC , objectD ). Z objectA interfejs, pozwala to deweloper, aby ograniczyć wpływ na objectB z objectA zmian wewnętrznych (w objectC i objectD ), tak długo, jak objectA API (operacji) są nadal przestrzegane.
W usłudze REST dane (zasoby), relacje (łącza) i zachowanie (czasowniki) są rozbite na różne elementy i dostępne w Internecie.
Korzystając z usługi REST, zawsze mam wpływ na zmiany kodu między moim klientem a serwerem: ponieważ mam High Coupling
między swoimi Backbone.js
żądaniami i Low Cohesion
między zasobami.
Nigdy nie zastanawiałem się, jak pozwolić Backbone.js javascript application
sobie na odkrycie „ zasobów i funkcji REST ” promowanych przez linki REST. Rozumiem, że WWW ma być obsługiwane przez wiele serwerów i że elementy OO musiały zostać rozbite, aby mogły być obsługiwane przez wiele hostów, ale w prostym scenariuszu, takim jak „zapisanie” strony pokazującej kontakt z jej adresami, Kończę z:
GET /api/contacts/43?embed=(addresses) [save button pressed] PUT /api/contacts/43 PUT /api/contacts/43/addresses/453
które skłoniły mnie do przeniesienia odpowiedzialności za transakcję atomową na transakcje atomowe na aplikacjach przeglądarki (ponieważ dwa zasoby można rozwiązać osobno).
Mając to na uwadze, jeśli nie mogę uprościć rozwoju (wzorce projektowania fasad nie mają zastosowania) i jeśli przyniosę więcej złożoności mojemu klientowi (obsługa transakcyjnego zapisu atomowego), to gdzie jest korzyść z ODPOWIEDZIALNOŚCI?
PUT /api/contacts/43
kaskadowych aktualizacji wewnętrznych obiektów? Miałem wiele interfejsów API zaprojektowanych w ten sposób (główny adres URL odczytuje / tworzy / aktualizuje „całość”, a adresy URL aktualizują elementy). Tylko upewnij się, że nie aktualizujesz adresu, gdy nie są wymagane żadne zmiany (ze względu na wydajność).