Nel confrontare la struttura REST [api] con un modello OO, vedo queste somiglianze:
Entrambi:
-
Sono orientati ai dati
- REST = Risorse
- OO = Oggetti
-
Funzionamento surround intorno ai dati
- REST = surround VERBS (Get, Post, ...) attorno alle risorse
- OO = promuove l'operazione intorno agli oggetti mediante l'incapsulamento
Tuttavia, le buone pratiche OO non si trovano sempre nelle apis REST quando si tenta di applicare il modello di facciata, ad esempio: in REST, non hai 1 controller per gestire tutte le richieste E non nascondi la complessità dell'oggetto interno.
Al contrario, REST promuove la pubblicazione di risorse di tutte le relazioni con una risorsa e altre su almeno due forme:
-
tramite le relazioni di gerarchia delle risorse (un contatto di id 43 è composto da un indirizzo 453):
/api/contacts/43/addresses/453
-
tramite link in una risposta JSON di REST:
>> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] }
TornandoaOO,loschemadiprogettazionedellafacciatarispettaunaLowCoupling
traunoggettoAeilsuo'oggettoBclient'eHighCohesion
perquestooggettoAelasuacomposizionedioggettiinterna(objectC,objectD).Conl'interfacciaobjectA,questoconsenteaunosviluppatoredilimitarel'impattosuoggettoBdelleobjectAmodificheinterne(inobjectCeoggettoD),purchél'oggettoAapi(operazioni)siaancorarispettato.
InREST,idati(risorse),lerelazioni(collegamenti)eilcomportamento(verbi)sonoesplosiinelementidiversiedisponibiliperilweb.
GiocandoconREST,hosempreunimpattosullemodifichealcodicetrailmioclienteilmioserver:perchéhoHighCoupling
tralemierichiestediBackbone.js
eLowCohesion
tralerisorse.
NonhomaicapitocomeconsentirealmioBackbone.jsjavascriptapplication
digestire" risorse e funzionalità REST " discovery promosse dai link REST. Capisco che il WWW è destinato ad essere servito da più server, e che gli elementi OO dovevano essere esplosi per essere serviti da molti host, ma per uno scenario semplice come "salvare" una pagina che mostra un contatto con i suoi indirizzi, Finisco con:
GET /api/contacts/43?embed=(addresses) [save button pressed] PUT /api/contacts/43 PUT /api/contacts/43/addresses/453
che mi portano a spostare la responsabilità transazionale atomica dell'azione di salvataggio nelle applicazioni del browser (poiché due risorse possono essere indirizzate separatamente).
Tenendo questo a mente, se non riesco a semplificare il mio sviluppo (modelli di facciate non applicabili), e se porto più complessità al mio cliente (gestendo il salvataggio atomico transazionale), qual è il vantaggio di essere RESTful?