Il Component-based software engineering (CBSE) è un approccio per lo sviluppo software basato sul riuso.
Nasce alla fine degli anni ‘90 come proposta per superare I limiti mostrati dall’approccio Object-Oriented nel supportare un riuso semplice ed immediato:
I componenti invece sono più astratti delle classi di oggetti, non è richiesta la conoscenza della loro implementazione per riusarli e possono essere considerati come fornitori di servizi stand-alone.
Oltre che sul riuso, CBSE si basa su altri ben noti principi di ingegneria del software:
A software component is a software element that conforms to a component model and can be independently deployed and composed without modification according to a composition standard.
A software component is a unit of composition with contractually specified interfaces and explicit context dependencies only. A software component can be deployed independently and is subject to composition by third-parties.
[Cou2001].Definition of a Software Component and its elements. In Component Based Software Engineering (Councill e Heinemann eds) Boston-Addison Wesley. 2001
[Szy2002] Szyperski, Component Software: Beyond Object-Oriented Programming, 2 ed..Addison Wesley. 2002
Quando un sistema necessita di alcuni servizi, chiama un componente che glieli fornisce, senza sapere:
Ne consegue che:
Standardizzato – La standardizzazione implica l’aderenza del componente ad un modello standard che ne definisce interfacce, meta-dati, documentazione, composizione e consegna.
Indipendente – Un componente dovrebbe essere indipendente da altri, per poterlo comporre e consegnare privo di altri componenti. Altrimenti, le dipendenze devono essere esplicitamente documentate.
Componibile – Per essere componibile, le sue interazioni con l’esterno devono avvenire solo attraverso interfacce pubbliche. Deve inoltre fornire all’esterno informazioni su se stesso, come sui suoi attributi e metodi.
Consegnabile – Per essere consegnabile, il componente deve essere autonomo e deve poter operare su una piattaforma che implementi il suo modello. Ciò implica che il componente è solitamente in binario e viene compilato solo all’atto della consegna.
Documentato – I componenti devono essere documentati in modo che i potenziali utenti possano decidere se essi soddisfano le loro necessità: deve essere documentata sia la sintassi che (in teoria) la semantica delle interfacce.
Fornisce (provides) un’interfaccia con la quale vengono definiti i servizi che esso è in grado di fornire agli utilizzatori o ad altri componenti.
Richiede (requires) interfacce - Specifica quali debbano essere le interfacce di altri componenti dei quali ha bisogno per poter fornire i propri servizi.
Un componente non deve necessariamente essere indipendente, ma, piuttosto, devono essere note tutte le sue dipendenze da altri servizi.
Si tratta di standard che definiscono come possa essere implementato, documentato, distribuito un componente.
Esempi:
Il modello di componente specifica in particolare quali elementi debbano essere definiti nella sua interfaccia e come debbano essere scritti.
[Ejb] Specifiche di EJB scaricabili dal seguente sito.
[Com+]: COM+ Specification -Scaricabili dal seguente sito.
Definizione delle interfacce
Convenzioni sui nomi e Meta-dati
Packaging
I modelli di componenti definiscono anche le caratteristiche del sistema middleware che deve fornire il supporto per l’esecuzione dei componenti.
L’implementazione di un middleware fornisce ai componenti servizi simili e condivisi quali:
Per usare i servizi dell’infrastruttura, i componenti vengono consegnati in un contenitore predefinito e standardizzato (un insieme di interfacce usate per accedere alle implementazioni dei servizi di supporto).
Esempi di servizi orizzontali offerti da un Middleware
Esempi di servizi di Piattaforma
In attesa che si sviluppi un mercato aperto di componenti riusabili, attualmente questi si ottengono all’interno delle società produttrici a partire da software esistente.
I componenti sviluppati per una specifica applicazione non sono automaticamente riusabili, ma devono essere generalizzati.
Quali fattori guidano la scelta del componente da rendere riusabile?
Un componente riusabile deve avere alta probabilità di essere riusato, ed i costi per renderlo riusabile devono essere inferiori a quelli necessari per risvilupparlo.
Un componente è più riusabile se è associato ad una stabile astrazione di dominio (business object).
Ad esempio, in un dominio ospedaliero, le astrazioni stabili saranno: infermieri, pazienti, trattamenti, etc.
Le modifiche per rendere riusabile un componente devono conferire ad esso tutte le proprietà attese da un componente riusabile, ossia:
Per raggiungere maggiore riusabilità, spesso l’interfaccia del componente viene resa più complessa.
C’è un fondamentale trade-off tra usabilità e riusabilità dei componenti:
Necessità di un compromesso!
Spesso è possibile estrarre componenti riusabili da sistemi esistenti (“legacy”).
Per riutilizzare tali componenti è necessario sviluppare componenti wrapper che implementino le interfacce richieste e fornite dal componente riusabile.
In generale, quest’opportunità è abbastanza costosa ma può rappresentare una via percorribile quando si vogliono riutilizzare componenti per le quali è richiesta una grande affidabilità (e che non si vuole riscrivere).
Produrre componenti riusabili è certamente più oneroso che produrre componenti che non lo siano.
Ma lo sforzo extra potrà essere ricompensato ogni volta che quel componente verrà riusato anzichè riscritto (o adattato a partire da un componente esistente ma non direttamente riusabile).
La vita dei componenti può essere parecchio più lunga della vita del sistema di cui fa originalmente parte.
Sistemi a Plugin
Un esempio: IBM Eclipse
2. Ciclo di Vita e Processi Software
3. Processi per lo sviluppo rapido del software
4. Sviluppo Agile del Software
5. Test Driven Development (TDD)
7. Component Based Software Engineering (CBSE): Generalità
8. Component Based Software Engineering (CBSE): Il processo di svi...
9. Ingegneria del Software orientato ai Servizi
10. Ingegnerizzazione dei Servizi
11. I Processi di Manutenzione del Software
12. Reengineering, Refactoring e Reverse Engineering del Software
13. Verifica e Convalida del Software. Richiami e concetti di base ...
14. Tecniche di Testing Dinamico
15. Testing di Sistemi Object Oriented
16. Automazione del testing e Analisi Mutazionale
17. Tecniche di Analisi Statica del codice e il Debugging
18. Stima dei costi nei progetti Software
19. Il Modello COCOMO per la stima dei costi Software – La gestio...
20. Gestione e Miglioramento dei Processi di Produzione del Softwar...
21. La Valutazione della Qualità dei Processi Software – Il Capa...
I. Sommerville, Ingegneria del Software, 8° edizione- Cap. 19