Component Based Software Engineering (CBSE
Transcript
Component Based Software Engineering (CBSE
Component Based Software Engineering (CBSE) Riferimenti: I.Sommerville, Ingegneria del Software, 8° edizione- Cap. 19 Ingegneria del Software 2 – Component Based Software Engineering 1 Outline • Componenti e modelli di componenti • Il processo CBSE • La composizione dei Componenti Ingegneria del Software 2 – Component Based Software Engineering 2 1 CBSE • Component-based software engineering (CBSE) è un approccio per lo sviluppo software basato sul riuso. • Si è affermato a seguito del fallimento dello sviluppo object-oriented nel supportare un effettivo riuso. – Le singole classi di oggetti possono essere troppo dettagliate e specifiche. • I componenti sono più astratti delle classi di oggetti e possono essere considerati come fornitori di servizi stand-alone. Ingegneria del Software 2 – Component Based Software Engineering 3 Elementi essenziali del CBSE • • • • Componenti indipendenti, interamente specificati dalle proprie interfacce – Interfaccia e implementazione devono essere nettamente separate (nei sistemi a oggetti sono in classi diverse) Standard di descrizione e realizzazione dei componenti che semplificano l’integrazione tra componenti, anche sviluppati in vari linguaggi e provenienti da diversi fornitori. Middleware che fornisce supporto per l’interoperabilità gestendo, come fa ad esempio CORBA [Pope], le problematiche di concorrenza, protezione, gestione delle transazioni Un processo di sviluppo che sia orientato verso la realizzazione di componenti riusabili Ingegneria del Software 2 – Component Based Software Engineering 4 2 CBSE e principi di progettazione • Oltre che sul riuso, CBSE si basa su ben noti principi di ingegneria del software: – I Componenti devono essere indipendenti in modo da non interferire tra loro; – Le implementazioni dei Componenti sono nascoste; – La comunicazione avviene attraverso ben precise interfacce; – L’infrastruttura dei Componenti fornisce una piattaforma che riduce I costi di sviluppo. Ingegneria del Software 2 – Component Based Software Engineering 5 Problemi • • • • Fiducia nei componenti – il componente viene utilizzato a scatola chiusa (black box); come possiamo fidarci del fatto che non abbia suoi problemi intrinseci e non documentati? Certificazione dei componenti – per garantire sulla qualità dei componenti sarebbe necessaria una certificazione di qualità garantita da una terza parte che se ne assuma la responsabilità Previsione delle proprietà emergenti – I componenti potrebbero introdurre dei vincoli e dei problemi che, data la loro natura opaca, non risultano prevedibili in fase di scelta del componente nè vengono rilevati in fase di testing del componente Compromesso tra i requisiti – Non è sempre possibile scegliere componenti che risolvano esattamente i nostri problemi Ingegneria del Software 2 – Component Based Software Engineering 6 3 Definizioni di Componenti • • Councill and Heinemann [Cou2001]: – 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. Szyperski [Szy2002]: – 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. Ingegneria del Software 2 – Component Based Software Engineering 7 Componente come fornitore di servizi • Quando un sistema necessita di alcuni servizi, chiama un componente che glieli fornisce, senza sapere: – Dove il componente viene eseguito – In quale linguaggio è stato sviluppato. • • Ne consegue che: I componenti dovrebbero essere entità indipendenti e direttamente eseguibili (ovvero compilate prima di essere riusate) I servizi offerti dai componenti sono disponibili attraverso un’interfaccia e tutte le interazioni col componente devono avvenire attraverso l’interfaccia. • Ingegneria del Software 2 – Component Based Software Engineering 8 4 Caratteristiche dei componenti 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. Ingegneria del Software 2 – Component Based Software Engineering 9 Caratteristiche dei componenti 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. Ingegneria del Software 2 – Component Based Software Engineering 10 5 Interfacce dei Componenti • 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 Ingegneria del Software 2 – Component Based Software Engineering 11 Interfaccia di un componente Requires interface Defines the services from the component’s environment that it uses Provides interface Component Ingegneria del Software 2 – Component Based Software Engineering Defines the services that are provided by the component to other components 12 6 Esempio: componente Data Collector Requires interface Provides interface sensorManagement Data collector sensorData addSensor removeSensor startSensor stopSensor testSensor initialise report listAll Ingegneria del Software 2 – Component Based Software Engineering 13 Differenze tra componenti e oggetti • I componenti sono entità consegnabili – • I componenti non definiscono tipi – • La loro implementazione interna non è visibile all’utilizzatore I componenti sono indipendenti dal linguaggio – • Un componente è da vedersi come un’istanza, non come un tipo da istanziare I componenti sono opachi – • Non devono essere compilati all’interno di un programma applicativo, ma sono installati su una piattaforma di esecuzione I componenti non devono essere necessariamente sviluppati in un linguaggio object-oriented I componenti sono standardizzati – La loro implementazione deve rispettare specifici modelli di componenti Ingegneria del Software 2 – Component Based Software Engineering 14 7 Modelli di componenti • Si tratta di standard che definiscono come possa essere implementato, documentato, distribuito un componente. • Esempi: – – – • Modello EJB (Enterprise Java Beans)[Ejb] Modello COM+ (.NET model) [Com+] Modello Corba (di OMG) Il modello di componente specifica in particolare quali elementi debbano essere definiti nella sua interfaccia e come debbano essere scritti. Ingegneria del Software 2 – Component Based Software Engineering 15 Elementi di un modello di componente Weinreich e Sametinger, 2001 Ingegneria del Software 2 – Component Based Software Engineering 16 8 Elementi di un modello di componente • Definizione delle interfacce – • Convenzioni sui nomi – – • CORBA e COM+ prevedono appositi linguaggi per la descrizione delle interfacce (IDL); EJB usa Java In CORBA e COM+ ogni classe ha un suo identificatore (handle) a 128 bit che la rende unica In EJB invece si utilizza una convenzione basata sull’indirizzo web del produttore Packaging – Definisce come deve essere impacchettato il componente affinchè possa essere usato dagli altri elementi del middleware Ingegneria del Software 2 – Component Based Software Engineering 17 Supporto fornito dal middleware • • I modelli di componenti definiscono anche le caratteristiche del middleware che deve fornire il supporto per l’esecuzione dei componenti. L’implementazione di un middleware comprende: – Servizi di piattaforma, i quali consentono la comunicazione tra componenti conformi al modello • Ad esempio,CORBA è una piattaforma di servizi che permettono la comunicazione tra componenti realizzati indipendentemente – Servizi orizzontali, indipendenti dall’applicazione e a disposizione di altri componenti • Per usare i servizi dell’infrastruttura, I componenti vengono consegnati in un contenitore predefinito e standardizzato (un insieme di interfacce) Ingegneria del Software 2 – Component Based Software Engineering 18 9 Component model services Horizontal services Component management Transaction management Resource management Concurrency Persistence Security Platform services Addressing Interface definition Exception management Component communications Ingegneria del Software 2 – Component Based Software Engineering 19 Come procurarsi i componenti riusabili? • 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? Ingegneria del Software 2 – Component Based Software Engineering 20 10 Sviluppo di componenti per il riutilizzo • 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. Ingegneria del Software 2 – Component Based Software Engineering 21 Valutazione dei Costi delle Modifiche • Le modifiche per rendere riusabile un componente devono conferire ad esso tutte le proprietà attese da un componente riusabile, ossia: – Deve nascondere la rappresentazione interna del proprio stato; – Essere indipendente da qualunque altro componente: • In alternativa, le eventuali dipendenze devono comunque essere dichiarate – Essere robusto rispetto a tutti I possibili utilizzi compatibili con l’interfaccia pubblicata • Per rendere un componente riusabile bisogna estendere il testing a tutti gli utilizzi, non più solo a quelli previsti dal modello dei casi d’uso dell’applicazione originale • In particolare, deve essere in grado di gestire correttamente tutte le eccezioni che possono verificarsi Ingegneria del Software 2 – Component Based Software Engineering 22 11 Possibili modifiche per rendere riusabile un componente • • • • • • Nascondere/eliminare i metodi specifici dell’applicazione Rendere i nomi più generali Aggiungere metodi per aumentare la copertura funzionale Rendere la gestione delle eccezioni consistente con tutti gli utilizzi possibili – In realtà le eccezioni dovrebbero sempre essere notificate nella risposta, in modo da demandarne la gestione al chiamante Aggiunta di una interfaccia di configurazione Integrare (se possibile) i componenti da cui si dipende Ingegneria del Software 2 – Component Based Software Engineering 23 Usabilità e riusabilità di un componente • • Per raggiungere maggiore riusabilità, spesso l’interfaccia del componente viene resa più complessa. C’è un fondamentale trade-off tra usabilità e riusabilità dei componenti: – Un componente dall’interfaccia semplice non è in grado di modellare un concetto generale • Ma è più facile renderlo riusabile – Un componente dall’interfaccia complessa può modellare un concetto generale, fornendo tutte le interfacce richieste alle diverse tipologie di utlizzatori • Ma è molto difficile renderlo robusto • Inoltre potrebbe essere necessario integrarlo con molti altri componenti • Necessità di un compromesso! Ingegneria del Software 2 – Component Based Software Engineering 24 12 Legacy system components • Spesso si vuole estrarre componenti riusabili da sistemi esistenti (“legacy”) • Per riutilizzare tali componenti è necessario sviluppare un componente wrapper che implementi le interfacce richieste e fornite dal componente riusabili – Ulteriori dettagli verranno presentati a margine delle problematiche di migrazione e reengineering • 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) – Esempio: componenti che permettono di eseguire transazioni bancarie Ingegneria del Software 2 – Component Based Software Engineering 25 Sforzo di produzione di componenti riusabili • 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 Ingegneria del Software 2 – Component Based Software Engineering 26 13 Il Processo CBSE • Quando si riusano componenti, è essenziale un compromesso fra requisiti ideali e servizi effettivamente forniti dai componenti disponibili. • Di conseguenza, bisognerà: – Sviluppare una prima bozza dei requisiti; – Cercare I componenti e quindi modificare I requisiti in base alle funzionalità disponibili; – Cercare ancora eventuali altri componenti che soddisfano meglio I requisiti rivisti. Ingegneria del Software 2 – Component Based Software Engineering 27 Processo CBSE Outline system requirements Identify candidate components Modify requirements according to discovered components Architectural design Identify candidate components Compose components to create system Ingegneria del Software 2 – Component Based Software Engineering 28 14 Validazione dei componenti creati – Bisogna valutare se i componenti realizzati coprano effettivamente tutti i requisiti richiesti – La specifica dei componenti deve essere tale da fornire le informazioni necessarie per poter costruire una test suite (e un ambiente di test per eseguirla) che sia in grado di verificarne tutte le funzionalità • L’utilizzo di un preciso formalismo di specifica può consentire l’utilizzo di strumenti che generino automaticamente casi di test – I componenti realizzati devono garantire I requisiti di qualità previsti, primi tra tutti quelli di sicurezza Ingegneria del Software 2 – Component Based Software Engineering 29 Ariane 5 • Nel 1996, il razzo Ariane 5 si distrusse durante il primo test di volo poichè il sistema ne perse il controllo dopo 37 secondi • La causa del problema risiedeva in un componente riusato dal software di Navigazione Inerziale sviluppato per Ariane 4 – In particolare, il problema risiedeva in una eccezione di overflow non gestita, la quale però non poteva verificarsi nell’Ariane 4, a causa della ridotta potenza rispetto al 5 Ingegneria del Software 2 – Component Based Software Engineering 30 15 Composizione di componenti • I componenti più semplici risultano essere i più riusabili ma non riescono a risolvere problemi complessi – • Una composizione di componenti può raggiungere requisiti più specifici e complessi Nell’integrazione di componenti tramite composizione può essere necessario scrivere del glue code per: – Rendere compatibili i formati degli input e degli output dei vari componenti Coordinare i vari componenti – Ingegneria del Software 2 – Component Based Software Engineering 31 Tipologie di composizione Sequenziale A Gerarchica Glue Code A Glue Code B Additiva B A B Non c’è glue code: la classe generale chiama I metodi di quella specializzata e ne espone altri Ingegneria del Software 2 – Component Based Software Engineering Glue Code Dall’esterno viene visto un componente che fornisce i servizi di A e di B 32 16 Incompatibilità tra le interfacce • Incompatibilità tra i parametri delle operazioni – • Incompatibilità tra operazioni – • Le due interfacce prevedono nomi diversi per la stessa operazione Incompletezza delle operazioni – • Operazioni con lo stesso nome accettano un numero diverso di parametri o parametri di tipo diverso Operazioni con lo stesso nome svolgono, in realtà l’una un sottoinsieme delle operazioni dell’altra Tutti questi problemi di incompatibilità possono essere risolti dal glue code, in particolare dai cosiddetti Adaptor Ingegneria del Software 2 – Component Based Software Engineering 33 Esempio: componenti incompatibili string location(string pn) phoneDatabase (string command) addressFinder string owner (string pn) string proper tyType (string pn) displayMap (string postCode, scale) mapDB (string command) mapper Ingegneria del Software 2 – Component Based Software Engineering printMap (string postCode, scale) 34 17 Componenti Adattatori • • • Risolvono il problema della incompatibilità delle interfacce fra componenti. Gli adattatori possono essere diversi, a seconda del tipo di composizione. Un addressFinder ed un mapper possono essere composti tramite un adattatore che estrae il codice postale da un indirizzo e lo passa al componente mapper. Ingegneria del Software 2 – Component Based Software Engineering 35 Composizione tramite un Adattatore • Il componente postCodeStripper è l’adattatore necessario per la composizione di addressFinder e mapper. • Il codice dell’Adattatore è: address = addressFinder.location (phonenumber) ; postCode = postCodeStripper.getPostCode (address) ; mapper.displayMap(postCode, 10000) Ingegneria del Software 2 – Component Based Software Engineering 36 18 Altro esempio di Adapter per il componente data collector start sensor stop getdata sensorManagement Adapter addSensor removeSensor startSensor Data collector sensorData stopSensor testSensor initialise report listAll Ingegneria del Software 2 – Component Based Software Engineering 37 Semantica delle interfacce • Come stabilire se interfacce sintatticamente identiche corrispondono allo stesso servizio richiesto/fornito? – • In generale bisogna basarsi sulla documentazione del componente Esempio: – Un componente PhotoLibrary vuole fornire i metodi per prelevare immagini da una fotocamera, etichettarle e archiviarle in una biblioteca fotografica – Interfaccia per il componente PhotoLibrary public void addItem (Identifier pid ; Photograph p; CatalogEntry photodesc) ; public Photograph retrieve (Identifier pid) ; public CatalogEntry catEntry (Identifier pid) ; Ingegneria del Software 2 – Component Based Software Engineering 38 19 Photo library composition getImage addItem Photo Library adaptor retrieve catEntry Image Manager getCatalogEntry User Inter face Ingegneria del Software 2 – Component Based Software Engineering 39 Photo Library documentation Documentazione di AddItem “Questo metodo aggiunge una foto alla biblioteca e associa ad essa il suo descrittore, fornito dall’utente” Domande: 1. Cosa succede se il descrittore è stato già utilizzato? 2. Quando elimino una foto, viene eliminato anche il suo descrittore dal catalogo? - Se così non fosse, potrebbe essere considerato non valido un descrittore che non appartiene più a nessuna foto Ingegneria del Software 2 – Component Based Software Engineering 40 20 OCL • • • Object Constraint Language (OCL) è un linguaggio pensato per la definizione di vincoli (constraints) previsti dai modelli UML E’ basato sulle nozioni fondamentali di pre e post condizione La sua specifica è reperibile all’indirizzo: – • http://www.omg.org/docs/ptc/05-06-06.pdf Si è rivelato utile anche per la descrizione delle condizioni di usabilità delle interfacce di un componente Ingegneria del Software 2 – Component Based Software Engineering 41 Descrizione OCL dell’interfaccia per photo library -- The context keyword names the component to which the conditions apply context addItem -- The preconditions specify what must be true before execution of addItem pre: PhotoLibrary.libSize() > 0 PhotoLibrary.retrieve(pid) = null -- The postconditions specify what is true after execution post: libSize () = libSize()@pre + 1 PhotoLibrary.retrieve(pid) = p PhotoLibrary.catEntry(pid) = photodesc context delete pre: PhotoLibrary.retrieve(pid) <> null ; post: PhotoLibrary.retrieve(pid) = null PhotoLibrary.catEntry(pid) = PhotoLibrary.catEntry(pid)@pre PhotoLibrary.libSize() = libSize()@pre - 1 Ingegneria del Software 2 – Component Based Software Engineering 42 21 CBSE: letture consigliate • S. Mahmood, R. Lai and Y.S. Kim, Survey of component-based software development, IET Softw., 2007, 1, (2), pp. 57–66 • Li, Conradi, ..Torchiano, Morisio, Development with Off-the-Shelf Components: 10 Facts, IEEE Software, Mar-Apr. 2009, pp. 80-87 Ingegneria del Software 2 – Component Based Software Engineering 45 22
Documenti analoghi
Component Based Software Engineering (CBSE
certificazione di qualità garantita da una terza parte che
se ne assuma la responsabilità
Previsione delle proprietà emergenti – I componenti
potrebbero introdurre dei vincoli e dei problemi che, d...