Domanda

C'è stato molto interesse per Architettura orientata ai servizi (SOA) presso il mio società di recente. Ogni volta che provo a vedere come potremmo usarlo, mi imbatto sempre in un blocco mentale. Crudamente:

  • L'orientamento agli oggetti dice: " mantenere dati e metodi che manipolano i dati (processi aziendali) insieme " ;;

  • L'orientamento al servizio dice: " mantenere il processo aziendale nel servizio e passargli i dati " ;.

I precedenti tentativi di sviluppo della SOA hanno finito per convertire il codice orientato agli oggetti in strutture di dati e procedure separate (servizi) che li manipolano, il che sembra un passo indietro.

La mia domanda è: quali modelli, architetture, strategie ecc. consentono a SOA e OO di lavorare insieme?


Modifica: Le risposte dicono "OO per interni, SOA per limiti di sistema" sono fantastici e utili, ma non è proprio quello che stavo ottenendo.

Supponiamo che tu abbia un oggetto Account che ha un'operazione commerciale chiamata Unisci che lo combina con un altro account. Un tipico approccio OO sarebbe simile al seguente:

Account mainAccount = database.loadAccount(mainId);
Account lesserAccount = database.loadAccount(lesserId);

mainAccount.mergeWith(lesserAccount);

mainAccount.save();
lesserAccount.delete();

Considerando che l'equivalente SOA che ho visto assomiglia a questo:

Account mainAccount = accountService.loadAccount(mainId);
Account lesserAccount = accountService.loadAccount(lesserId);

accountService.merge(mainAccount, lesserAccount);
// save and delete handled by the service

Nel caso OO la logica aziendale (e la consapevolezza dell'entità grazie a un modello ActiveRecord) sono inserite nella classe Account . Nel caso SOA l'oggetto Account è in realtà solo una struttura, poiché tutte le regole aziendali sono sepolte nel servizio.

Posso avere contemporaneamente classi ricche e funzionali e servizi riutilizzabili?

È stato utile?

Soluzione

Penso davvero che la SOA sia utile solo per le interfacce esterne (in generale, a quelle esterne alla tua azienda) e anche in questo caso, solo nei casi in cui le prestazioni non contano davvero, non è necessario il recapito ordinato dei messaggi.

Alla luce di ciò, penso che possano coesistere. Mantieni le tue applicazioni funzionanti e comunicanti usando la filosofia OO e solo quando sono necessarie interfacce esterne (a terzi), esponile tramite SOA (questo non è essenziale, ma è un modo).

Sento davvero che la SOA sia abusata, o almeno le architetture con SOA vengono proposte troppo spesso. Non conosco davvero grandi sistemi che usano SOA internamente e dubito che possano farlo. Sembra più una cosa che potresti semplicemente usare per fare mashup o semplici richieste di previsioni del tempo, non costruire sistemi seri sopra.

Altri suggerimenti

La mia opinione è che la SOA può essere utile a livello macro, ma ogni servizio probabilmente sarà ancora abbastanza grande da richiedere diversi componenti interni. I componenti interni possono beneficiare dell'architettura OO.

L'API SOA deve essere definita più attentamente rispetto alle API interne, poiché è un'API esterna. I tipi di dati passati a questo livello dovrebbero essere il più semplice possibile, senza logica interna. Se esiste una logica che appartiene al tipo di dati (ad es. Validazione), dovrebbe preferibilmente esserci un servizio incaricato di eseguire la logica sul tipo di dati.

La SOA è una buona architettura per la comunicazione tra sistemi o applicazioni.

Ogni applicazione definisce un "servizio" interfaccia che consiste nelle richieste che gestirà e nei repository previsti.

I punti chiave qui sono servizi ben definiti, con un'interfaccia ben definita. Il modo in cui i servizi vengono effettivamente implementati è irrilevante per quanto riguarda la SOA.

Quindi sei libero di implementare i tuoi servizi utilizzando tutte le più recenti e migliori teorie OO, o qualsiasi altra metodologia che funzioni per te. (Ho visto casi estremi in cui il "servizio" è impiantato da esseri umani reali che inseriscono dati su uno schermo - eppure tutto era ancora un libro di testo SOA!).

Penso che questo sia un fraintendimento dell'orientamento agli oggetti. Anche in Java, i metodi generalmente non fanno parte degli oggetti ma della loro classe (e anche questa "appartenenza" non è necessaria per l'orientamento agli oggetti, ma è un soggetto diverso). Una classe è solo una descrizione di un tipo, quindi questa è davvero una parte del programma, non i dati.

SOA e OO non si contraddicono a vicenda. Un servizio può accettare dati, organizzarli internamente in oggetti, lavorarci sopra e infine restituirli in qualsiasi formato desiderato.

Ho sentito James Gosling dire che si potrebbe implementare SOA in COBOL.

Se leggi la descrizione di Alan Kay sulle origini di OOP, descrive un mucchio di piccoli computer che interagiscono per eseguire qualcosa di utile.

Considera questa descrizione:

  

La tua X dovrebbe essere composta da Ys. Ogni Y dovrebbe essere responsabile di un singolo concetto e dovrebbe essere completamente descrittivo in termini di interfaccia. Una Y può chiedere a un'altra Y di fare qualcosa tramite uno scambio di messaggi (secondo le interfacce specificate).

     

In alcuni casi, una X può essere implementata da una Z, che gestisce secondo la sua interfaccia. Nessuna X è autorizzata ad accedere direttamente alla Z di un'altra X.

Penso che siano possibili le seguenti sostituzioni:

Term      Programing       Architecture
----    ---------------    ------------
  X         Program           System
  Y         Objects          Services
  Z      Data structure      Database
----    ---------------    ------------
result        OOP              SOA

Se pensi principalmente in termini di incapsulamento, occultamento delle informazioni, accoppiamento lento e interfacce black-box, c'è una certa somiglianza. Se vieni impantanato in polimorfismo, eredità, ecc. Stai pensando di programmare / implementare invece di architettura, IMHO.

Se permetti ai tuoi servizi di ricordare lo stato, allora possono essere considerati solo oggetti di grandi dimensioni con un tempo di chiamata possibilmente lento.

Se non gli è permesso mantenere lo stato, allora sono proprio come hai detto - operatori sui dati.

Sembra che tu stia dividendo il tuo sistema in troppi servizi. Hai dei criteri scritti e reciprocamente concordati su come dividere?

L'adozione della SOA non non significa getta via tutti i tuoi oggetti ma si tratta di dividere il tuo sistema in grandi blocchi riutilizzabili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top