Modificare:
Per evitare ulteriore confusione: Sto non parlando di servizi web e così via. Sto parlando di strutturare le applicazioni internamente, non di come comunicano i computer. Riguarda i linguaggi di programmazione, i compilatori e come viene esteso il paradigma della programmazione imperativa.
Originale:
Nel campo della programmazione imperativa, abbiamo visto due paradigmi negli ultimi 20 anni (o più): orientato agli oggetti (OO) e orientato ai servizi (SO) aka. basato su componenti (CB).
Entrambi i paradigmi estendono il paradigma della programmazione imperativa 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 compatibili con .NET, Python ecc.
SO non ha una tale lingua madre. Esiste solo su linguaggi procedurali o linguaggi OO: COM / DCOM (binario, C, C ++), CORBA, EJB, Spring, Guice (tutto Java), ...
Questi framework SO soffrono chiaramente del supporto mancante dei loro concetti nella lingua madre.
- Iniziano a utilizzare le classi OO per rappresentare servizi e record. Questo porta a progetti in cui esiste una chiara distinzione tra classi che hanno solo metodi (servizi) e quelle che hanno solo campi (record). L'ereditarietà tra servizi o record viene quindi simulata per ereditarietà delle classi. Tecnicamente, non è tenuto così rigorosamente, ma in generale i programmatori sono invitati a fare in modo che le classi svolgano solo uno dei due ruoli.
- Usano linguaggi esterni aggiuntivi per rappresentare le parti mancanti: IDL, configurazioni XML, annotazioni nel codice Java o persino DSL incorporato 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 è necessario per tali strutture, ma per SO c'è perché i servizi non istanziano o configurano altri servizi.
- Stabiliscono un effetto di piattaforma interna sopra OO (EJB iniziale, 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. Tutta quella piastra della caldaia è necessaria perché non esiste un compilatore SO che lo farebbe per il programmatore. Questo è proprio come alcune persone lo hanno fatto in C per OO quando non c'era C ++. Basta passare il record che contiene i dati dell'oggetto come primo parametro alla 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 nuovi framework utilizzano ampiamente AOP o introspezione per aggiungere le parti mancanti in un linguaggio OO. Questo non porta l'espressività del linguaggio necessaria ma evita il codice della piattaforma della caldaia descritto nel punto precedente.
- Alcuni framework utilizzano 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 alla SO, ma spero che mostri chiaramente che c'è bisogno di un linguaggio SO. Poiché questo paradigma è così popolare: perché non ce n'è uno? O forse ce ne sono alcuni accademici ma almeno l'industria non ne usa uno.