Modifica
Per evitare ulteriore confusione: sono non che parla di servizi web e così via. Sto parlando di strutturare le applicazioni internamente, non si tratta di come comunicano i computer. Si tratta di linguaggi di programmazione, compilatori e di come viene esteso il paradigma di programmazione imperativo.
originale:
Nel campo della programmazione imperativa, abbiamo visto due paradigmi negli ultimi 20 anni (o più): object-oriented (OO) e service-oriented (SO) alias. componente-based (CB).
Entrambi i paradigmi estendono il paradigma di programmazione imperativo introducendo la propria nozione di moduli. OO li chiama oggetti (e classi) e consente loro di incapsulare insieme dati (campi) e procedure (metodi). SO, al contrario, separa i dati (record, bean, ...) dal codice (componenti, servizi).
Tuttavia, solo OO ha linguaggi di programmazione che supportano nativamente il suo paradigma: Smalltalk, C ++, Java e tutti gli altri compatibili con JVM, C # e tutti gli altri .NET-compatibili, Python ecc.
SO non ha una tale lingua nativa. Viene solo al di sopra delle lingue procedurali o delle lingue OO: COM / DCOM (binario, C, C ++), CORBA, EJB, Spring, Guice (tutto Java), ...
Questi framework SO soffrono chiaramente del supporto nativo mancante dei loro concetti.
- Iniziano a utilizzare le classi OO per rappresentare servizi e record. Ciò porta a progetti in cui esiste una chiara distinzione tra classi che hanno solo metodi (servizi) e quelli che hanno solo campi (record). L'ereditarietà tra servizi o record viene quindi simulata dall'eredità delle classi. Tecnicamente, non è tenuto così rigorosamente, ma in generale i programmatori sono consigliati per fare in modo che le classi giochino solo in uno dei due ruoli.
- Utilizzano linguaggi esterni aggiuntivi per rappresentare le parti mancanti: IDL, configurazioni XML, annotazioni nel codice Java o anche DSL incorporati come in Guice. Ciò è particolarmente necessario, ma non limitato a, poiché la composizione dei servizi non fa parte del codice del servizio stesso. In OO, gli oggetti creano altri oggetti quindi non c'è bisogno di tali servizi, ma per SO c'è perché i servizi non creano istanze o configurano altri servizi.
- Stabiliscono un effetto piattaforma interna su OO (early EJB, CORBA) in cui il programmatore deve scrivere tutto il codice necessario per "guidare" SO. Le classi rappresentano solo una parte della natura di un servizio e molte classi devono essere scritte per formare un servizio insieme. Tutto quel piatto di caldaia è necessario perché non esiste un compilatore SO che lo farebbe per il programmatore. Questo è come alcune persone lo hanno fatto in C per OO quando non c'era il C ++. Basta passare il record che contiene i dati dell'oggetto come primo parametro della procedura che è il metodo. In un linguaggio OO questo parametro è implicito e il compilatore produce tutto il codice di cui abbiamo bisogno per le funzioni virtuali ecc. Per SO, questo è chiaramente mancante.
- Soprattutto i framework più recenti utilizzano ampiamente AOP o introspezione per aggiungere le parti mancanti a un linguaggio OO. Ciò non porta l'espressività linguistica necessaria ma evita il codice della piattaforma del boiler descritto nel punto precedente.
- Alcuni framework usano la generazione del codice per produrre il codice della piastra della caldaia. I file di configurazione in XML o le annotazioni nel codice OO sono la fonte di informazioni per questo.
Non tutti i fenomeni che ho menzionato sopra possono essere attribuiti a SO, ma spero che dimostri chiaramente che c'è bisogno di un linguaggio SO. Dato che questo paradigma è così popolare: perché non c'è uno? O forse ci sono alcuni accademici, ma almeno l'industria non ne usa uno.