PROGETTO DI SISTEMI Progettare un sistema software è cosa ben diversa dal progettare un algoritmo CRISI DEL SOFTWARE: i costi di gestione diventano preponderanti su quelli di produzione Cosa occorre per ottenere un sistema che non solo funzioni, ma che sia ancheben fatto?
SOFTWARE BEN FATTO … ? Ben organizzato Modulare Protetto Riusabile Riconfigurabile Flessibile Documentato Incrementalmente estendibile A componenti
LA COSTRUZIONE DEL SOFTWARE Ingredienti computazionali –le mosse di un linguaggio Requisiti –non basta un sistema che funzioni Principi –regole per una buona organizzazione Modelli, Concetti, Paradigmi, Pattern –fonti di ispirazione
LO SVILUPPO STORICO : –cosa significa computare? –quali mosse primitive deve avere un linguaggio di programmazione? : –quali principi di organizzazione del software? –basta la programmazione strutturata?
: –perché il modello a oggetti è importante? –vi sono alternative alla classificazione? : –quali ripercussioni se la piattaforma computazionale diventa una rete? –come recuperare vecchie applicazioni sulle nuove piattaforme?... LO SVILUPPO STORICO
PROGETTO & LINGUAGGI I linguaggi di programmazione devono fornire non solo un modo per esprimere computazioni ma anche un modo per dare struttura alla descrizione e un supporto per organizzare il processo produttivo del software.
PROGETTO & STRUMENTI PROBLEMA: le strutture dati e le strutture di controllo (programmazione strutturata) le funzioni e le procedure file e moduli come contenitori di descrizioni non bastano per ottenere software modulare e sviluppabile in modo incrementale. Perché?
LA CRISI DIMENSIONALE Il cambio di dimensioni del problema cambia non solo le dimensioni fisiche ma anche le astrazioni, i modelli, gli strumenti più opportuni per progettare Lattenzione si sposta dal singolo algoritmo (e da una o più funzioni) alle entità del mondo reale da modellare e agli strumenti che consentono il lavoro di gruppo
LA CRISI DIMENSIONALE Programmi di piccole dimensioni enfasi sullalgoritmo programmazione strutturata Programmi di medie dimensioni funzioni e procedure come astrazioni di espressioni/istruzioni complesse decomposizione degli algoritmi in blocchi funzionali
LA CRISI DIMENSIONALE Programmi di grandi dimensioni devono trattare grandi moli di dati, ma la decomposizione funzionale è inadeguata dati e funzioni che elaborano tali dati sono scor- relati: nulla indica che le una agiscano sugli altri devono essere sviluppati da gruppi, ma la decomposizione funzionale e il disaccoppia- mento dati/funzioni non agevolano la decompo- sizione del lavoro (segue)
LA CRISI DIMENSIONALE Programmi di grandi dimensioni (segue) trattano dati relativi a entità del mondo reale (persone, oggetti, grafici, documenti) interagiscono con entità del modo reale Tuttavia: le entità del mondo reale non sono "dati" su cui operano delle funzioni sono entità che devono essere trattate in modo coerente alla loro essenza
LA CRISI GESTIONALE Il costo maggiore nel processo di produzione del software è dovuto alla manutenzione –correttiva (per eliminare errori) –adattativa (per rispondere a nuove esigenze) Programmi di piccole dimensioni –trovare gli errori non è difficilissimo –limpatto delle modifiche è intrinsecamente limi- tato dalle piccole dimensioni del programma
LA CRISI GESTIONALE Programmi di medie dimensioni individuare gli errori è già più complesso limpatto delle modifiche si propaga, a causa del non-accoppiamento dati/funzioni, anche a fun- zioni o procedure diverse da quella modificata. Programmi di grandi dimensioni trovare gli errori può essere estremamente difficile e oneroso data la propagazione delle modifiche, ogni cambiamento coinvolge tutto il team di sviluppo.
LA CRISI GESTIONALE Programmi di medie dimensioni individuare gli errori è già più complesso limpatto delle modifiche si propaga, a causa del non-accoppiamento dati/funzioni, anche a fun- zioni o procedure diverse da quella modificata. Programmi di grandi dimensioni trovare gli errori può essere estremamente difficile e oneroso data la propagazione delle modifiche, ogni cambiamento coinvolge tutto il team di sviluppo. È necessario cambiare RADICALMENTE il modo di concepire, progettare e programmare il software
LOBIETTIVO Costruzione modulare e incrementale del software per composizione, estensione, specia- lizzazione di componenti Tecnologia component-based Quali strumenti?
MODELLI COMPUTAZIONALI Diversi modelli… –Imperativo –Funzionale –Dichiarativo –A oggetti (?) … con ingredienti comuni… … e differenze cruciali
GLI INGREDIENTI COMUNI... Valori Costanti (Riferimenti) Tipi di dato (scalari e strutturati) Variabili (Puntatori) Binding e Visibilità (scope)
Strutture di controllo Comandi e procedure Funzioni Moduli Classi GLI INGREDIENTI COMUNI...
…E LE DIFFERENZE Differenza cruciale: il modello del collante cioè i meccanismi di combinazione ed astrazione
…E LE DIFFERENZE Modello funzionale: –elementi di base: funzioni ed espressioni –meccanismo fondamentale: la chiamata Modello logico: –elemento di base: lassioma –meccanismo fondamentale: la deduzione logica
…E LE DIFFERENZE Modello imperativo: –elemento fondamentale: il comando –meccanismi fondamentali:
REQUISITI DEL SOFTWARE : Correttezza, Efficienza, Generalità : Strutturazione, Modularità, Incapsulamento (ADT) : Riusabilità, Estendibilità, Genericità, Incrementalità : Distribuzione, Mobilità, Interattività …:Interoperabilità,...
EFFICIENZA… MA NON SOLO Premature optimization is the root of all evil –Donald E. Knuth Make it work first, before you make it work fast –Bruce Whiteside Make it fail-safe before you make it faster Make it clear before you make it faster –Kernighan A. Plaugher
UN PAIO DI PRINCIPI If you need a little speedup, work at the best level (which delivers the most speedup for the less effort) –definizione del problema –struttura del sistema –ottimizzazione dellalgoritmo –riorganizzazione delle strutture dati –ottimizzazione del codice –hardware e software del sistema
UN PAIO DI PRINCIPI If you need a big speedup, work at many levels –quando le modifiche ad un livello sono indipendenti dai cambiamenti negli altri livelli, i miglioramenti di velocità si moltiplicano
QUALE PROGETTO? Spesso si studia un linguaggio si pensa in termini del linguaggio conosciuto, usando –i costrutti del linguaggio –linformation space del linguaggio –metodologie legate al linguaggio (idiomi, framework ) –schemi standard (pattern)
INFORMATION SPACE un insieme di dimensioni e di con- cetti usati per la espressione (di un modello) di un sistema (software) –L'information space proposto dalle macchine di Turing (o di Von Neumann ) non introduce concetti adatti a trattare la complessità
MODELLO Non tanto la rappresentazione di una realtà, quanto....linsieme di strutture simboliche usate per dare una descrizione (schema) di una certa realtà
COSA SI DOVREBBE FARE? 1.Definire i requisiti 2.Fare lanalisi e il progetto adottando un information space e un modello adeguato 3. Implementare (anche in un linguaggio di più basso livello rispetto al modello adottato) 4. Effettuare il testing Processo di sviluppo iterativo (a spirale)
PRODUZIONE DEL SOFTWARE: COSA OCCORRE? Concetti e Metodologie per pensare Metodologie, Processi e Strumenti per produrre
PRINCIPI STRUTTURALI Information hiding, incapsulamento Località Parametricità Astrazione vs. rappresentazione Cosa fa vs. come lo fa –a livello di dati –a livello di elaborazione
INTERFACCIA E IMPLEMENTAZIONE L'interfaccia esprime una vista astratta di un ente computazionale, nascon- dendone –l'organizzazione interna –i dettagli di funzionamento L'implementazione esprime –la rappresentazione dello stato interno –il codice di un ente computazionale.
ASTRAZIONE Si focalizza sul funzionamento osservabile di un ente Abstraction helps people to think about what they are doing –la struttura interna di un servitore è inessenziale agli occhi del cliente –basta assicurare il rispetto del contratto stabilito dallinterfaccia.
INCAPSULAMENTO Si focalizza sullimplementazione di un ente Encapsulation allows program changes to be reliably made with limited effort Astrazione e incapsulamento sono concetti complementari.
INDIPENDENZA DALLA RAPPRESENTAZIONE Incapsulamento significa che la rappresentazione concreta di un dato può essere modificata senza che vi siano ripercussioni sul resto del programma.
DAL DIRE AL FARE... In assenza di precisi supporti linguistici, in fase di codifica si può però compromettere il livello di astrazione e con esso la modularità e la riusabilità della soluzione.
RAPPRESENTAZIONE & ASTRAZIONE Attraverso i costruttori di tipo ( array, struct, enum, etc.) il progettista può definire strutture dati che siano la rappresentazione concreta delle astrazioni che ha in mente. Occorre catturare la semantica delle astrazioni di dato, cercando di impedire laccesso diretto alla rappresentazione concreta del dato.
RAPPRESENTAZIONE & ASTRAZIONE Due grandi approcci: definire tipi di dati astratti (ADT) sfruttare i moduli per definire singole astrazioni di dato Questi approcci hanno caratteristiche complementari.
TIPI DI DATO ASTRATTO Focalizzano lattenzione sulle pro- prietà logico-concettuali di un tipo Lasciano sullo sfondo la rappresen- tazione concreta. Quali proprietà rilevanti? Quali operazioni visibili ai clienti (interfaccia)? Quali criteri per definire linterfaccia? Quali metodologie per una soluzione flessibile?
MODULI Il modulo permette di raggruppare dati, funzioni e procedure in una singola unità sintattica, ottenendone lincapsulamento. L'uso di un modulo rende possibile costruire una barriera di astrazione intorno alla rappresentazione concreta di una struttura dati.
MODULI Se ben definito, un modulo permette di: –garantire l'uso consistente e corretto di una nuova astrazione di dato –ottenere indipendenza dalla rappresenta- zione concreta Però, è adatto a rappresentare una singola risorsa (astrazione di dato): non è infatti possibile includere lo stesso modulo più volte in unapplicazione.
ESEMPIO: IL CONTATORE Scopo: definire il concetto di contatore Specifica: un componente caratterizzato in ogni istante da un valore (intero) a cui si accede tramite le operazioni di: –reset:azzera il valore del contatore –inc:incrementa di uno il valore –getValue:restituisce il valore attuale
ESEMPIO: IL CONTATORE Scopo: definire il concetto di contatore Specifica: un componente caratterizzato in ogni istante da un valore (intero) a cui si accede tramite le operazioni di: –reset:azzera il valore del contatore –inc:incrementa di uno il valore –getValue:restituisce il valore attuale Non importa come è realizzato dentro: importa il suo comportamento osservabile.
ESEMPIO: IL CONTATORE Due possibilità: definire il tipo di dato astratto (ADT) contatore e poi sfruttarlo per creare oggetti di tipo contatore definire in un modulo la singola astrazione di dato contatore e poi usarlo così comè.
ESEMPIO: IL CONTATORE Due possibilità: definire il tipo di dato astratto (ADT) contatore e poi sfruttarlo per creare oggetti di tipo contatore definire in un modulo la singola astrazione di dato contatore e poi usarlo così comè. Pro: possibile definire tanti oggetti contatore quanti ne servono. Contro: mancanza di vero incapsulamento (chiunque può in realtà accedere allo stato interno)
ESEMPIO: IL CONTATORE Due possibilità: definire il tipo di dato astratto (ADT) contatore e poi sfruttarlo per creare oggetti di tipo contatore definire in un modulo la singola astrazione di dato contatore e poi usarlo così comè. Pro: possibile garantire vero incapsulamento Contro : si può definire un solo oggetto contatore (loggetto coincide col modulo che lo realizza)
IL CONTATORE COME ADT Definire il tipo di dato astratto (ADT) contatore... typedef …… contatore;...con le sue operazioni: void reset(contatore*); void inc(contatore*); int getValue(contatore); tutti i clienti vedono la typedef tutti sanno in realtà come è fatto
IL CONTATORE COME ADT Definire il tipo di dato astratto (ADT) contatore... typedef …… contatore;...con le sue operazioni: void reset(contatore*); void inc(contatore*); int getValue(contatore); reset e inc devono cambiare lo stato del contatore necessario passare un puntatore getValue invece deve solo accedere allo stato del contatore, ma senza cambiarlo è più opportuno il passaggio per valore
IL CONTATORE COME ADT NOTA: la specifica del tipo di dato astratto contatore non ha richiesto per ora alcuna scelta circa la sua organizzazione interna. La struttura interna del contatore è irrilevante per i clienti che devono usarlo!
IL CONTATORE COME ADT: USO Si importano la definizione dellADT e le dichiarazioni delle funzioni ( counter.h ) Si definiscono tante variabili contato- re quante ne occorrono, e si usano #include "counter.h" main() { int v1, v2; contatore c1, c2; reset(&c1); reset(&c2); inc(&c1); inc(&c1); inc(&c2); v1=getValue(c1); v2=getValue(c2); }
IL CONTATORE COME ADT Implementazione La struttura interna del contatore diventa rilevante quando giunge il momento di realizzarlo. Se ora scegliamo di rappresentare lo stato con un intero, avremo: typedef int contatore;
IL CONTATORE COME ADT È ora possibile definire (e non solo dichiarare) le operazioni: void reset(contatore* c){ *c = 0; } void inc(contatore* c){ (*c)++; } int getValue(contatore c){ return c; }
IL CONTATORE COME ADT Una implementazione alternativa Se invece scegliessimo di rappresen- tare lo stato con una stringa di I (notazione a numeri romani): typedef char contatore[21]; Qui –la stringa vuota indica lo zero – I indica 1, II indica 2, etc. ma per il cliente non cambia niente! ok solo per nu- meri fino a 20
IL CONTATORE COME ADT Le operazioni diventerebbero: void reset(contatore* c){ (*c)[0] = '\0'; } void inc(contatore* c){ int x=strlen(*c); (*c)[x]='I'; (*c)[x+1]='\0'; } int getValue(contatore c){ return strlen(c); }
LAPPROCCIO DEGLI ADT Consente di separare interfaccia e implementazione Rende il cliente indipendente dalla struttura interna dellADT (servitore) Permette al cliente di definire tanti oggetti quanti gliene occorrono Ma non garantisce incapsulamento –tutti i clienti vedono la typedef, –conoscono la struttura interna dellADT –e possono violare il protocollo di accesso
LAPPROCCIO DEGLI ADT Consente di separare interfaccia e implementazione Rende il cliente indipendente dalla struttura interna dellADT (servitore) Permette al cliente di definire tanti oggetti quanti gliene occorrono Ma non garantisce incapsulamento –tutti i clienti vedono la typedef, –conoscono la struttura interna dellADT –e possono violare il protocollo di accesso Rispettare il protocollo di accesso stabilito dellinterfaccia è, per il cliente, un atto volontario Se un cliente ill-behaved decide di aggira-re le operazioni previste e di accedere diret- tamente allo stato interno degli oggetti, nessuno può impedirlo
IL CONTATORE COME MODULO Definire il contatore come singola risorsa protetta dentro a un modulo static int cont; con operazioni che agiscono implicitamente su essa void reset( void ); void inc( void ); int getValue( void );
IL CONTATORE COME MODULO Definire il contatore come singola risorsa dentro a un modulo static int cont; con operazioni che agiscono implicitamente su essa void reset( void ); void inc( void ); int getValue( void ); Le operazioni non hanno alcun parametro perché ora agiscono tutte, implicitamente, sullunico contatore esistente: quello rappresentato dalla variabile statica cont.
CONTATORE COME MODULO: USO Si importano solo le dichiarazioni delle funzioni ( mcounter.h ) Si usa semplicemente il contatore racchiuso nel modulo senza dover definire alcunché #include "mcounter.h" main() { int v; reset(); inc(); inc(); v=getValue(); }
LAPPROCCIO A MODULO Separa interfaccia e implementazione Rende il cliente indipendente dalla struttura interna dellADT (servitore) Garantisce lincapsulamento –i clienti vedono solo le dichiarazioni delle operazioni: non conoscono la struttura interna della risorsa (privata) del modulo Offre al cliente una singola risorsa (da usare senza doverla definire): non è adatto se servono più risorse
LOBIETTIVO Lideale sarebbe: garantire lincapsulamento come è in grado di fare lapproccio a modulo ma nel contempo consentire al clien- te di creare tanti oggetti quanti glie- ne occorrono come nellapproccio ad ADT garantendo inoltre –separazione interfaccia / implementazione –indipendenza dalla rappresentazione
IL CONCETTO DI OGGETTO Un oggetto viene inteso come un centro di servizi dotato di una parte visibile (interfaccia) e di una parte nascosta Centro servizi Operazione A Operazione B Operazione C Parte nascosta Parte visibile (INTERFACCIA)
IL CONCETTO DI OGGETTO Centro servizi Operazione A Operazione B Operazione C Parte nascosta Parte visibile (INTERFACCIA) Offre agli altri oggetti (clienti) un insieme di attività (operazioni) senza che sia nota/accessibile la sua organizzazione interna.
IL CONCETTO DI OGGETTO Centro servizi Operazione A Operazione B Operazione C Parte nascosta Parte visibile (INTERFACCIA) Ogni cliente può creare (istanziare) tanti oggetti quanti gliene occorrono a partire da una sorta di modello delloggetto (classe)
SISTEMI A OGGETTI Larchitettura di un sistema a oggetti: un insieme di oggetti che interagi- scono gli uni con gli altri senza conoscere nulla delle rispet- tive rappresentazioni concrete Modello di intera- zione a scambio di messaggi
ELABORAZIONE E INTERAZIONE Peter Wegner: gli oggetti sono la classe più usata di interaction machines la tecnologia object-based è divenu- ta dominante perché interattiva, e quindi per ciò stesso più espressiva di una specifica algoritmica.
LIDEA DI OGGETTO integra dati e elaborazione (comportamento) promuove approcci di progettazione e sviluppo sia top-down sia bottom-up cattura i principi fondamentali di una corretta strutturazione del software introduce un information space molto ricco e orientato alla gestione della complessità.
INFORMATION SPACE OO
LE PROPRIETÀ DI UN OGGETTO Un oggetto possiede stato, funziona- mento e identità Struttura e funzionamento di oggetti simili sono definiti nella loro classe comune, di cui essi sono istanze. I termini istanza e oggetto sono intercambiabili.
IL CONCETTO DI CLASSE Una classe descrive la struttura interna e il funzionamento di un oggetto. Oggetti appartenenti a una stessa classe hanno: –la stessa rappresentazione interna –le stesse operazioni –lo stesso funzionamento.
OGGETTI vs. ALGORITMI Gli algoritmi hanno un funzionamento osserva- bile che non dipende dal tempo. Gli oggetti posseggono sia proprietà trasforma- zionali sia proprietà temporali. Il funzionamento osser- vabile di un oggetto è descritto da interaction histories che specifi- cano i messaggi ricevuti e i messaggi inviati.
OGGETTI vs. ALGORITMI Un algoritmo calcola eseguendo una sequenza finita di azioni interne. Un algoritmo è un siste- ma off-line, che specifica il flusso completo di una computazione prima che essa inizi. Un oggetto calcola attra- verso un pattern di inte- razioni (interaction his- tory) iniziate dallester- no, al di fuori del con- trollo dell'oggetto. Un oggetto è un sistema on-line.
OGGETTI vs. ALGORITMI Un algoritmo è un siste- ma chiuso, non soggetto a interazioni con lesterno durante il suo funziona- mento. Problemi di natura algo- ritmica ammettono specifi- che formali, sono imple- mentati da programmi la cui correttezza può essere dimostrata e hanno una precisa nozione di com- plessità. Un oggetto è un siste- ma aperto. Problemi interattivi co- me la prenotazione dei posti aerei non hanno specifiche complete, né una definizione precisa di correttezza o di complessità.
OGGETTI vs. ALGORITMI Il funzionamento di algoritmi può essere specificato da un contratto che si conclude in un dato momento, come un contratto di vendita. Un algoritmo trasforma un ingresso prespecificato (pre- condizioni) in una uscita (post-condizioni): se i clienti forniscono un valore che soddisfa le precondizioni, si garantisce un risultato che soddisfa le postcondizioni. Gli oggetti richiedono la specifica di un contratto che si prolunga nel tem- po, come un contratto di matrimonio.
OGGETTI vs. ALGORITMI Gli algoritmi hanno come requisito primario la corret- tezza e come requisito secondario lefficienza. Gli algoritmi sono progettati mediante un raffinamento top-down delle specifiche. I sistemi software hanno come requisito primario un basso co- sto del ciclo di vita. Il progetto di un sistema ad oggetti parte da una descrizione bottom-up dellambiente di intera- zione.
RELAZIONI TRA OGGETTI Le relazioni tra oggetti sono il punto- chiave della progettazione in grande Sono oggi codificate in pattern –incapsulamento, possesso –ereditarietà
EREDITARIETÀ Una relazione tra classi Ereditarietà singola: una classe condivide la struttura e/o il funziona- mento definito in unaltra classe Ereditarietà multipla: una classe condivide la struttura e/o il funziona- mento definito in varie altre classi
EREDITARIETÀ Una relazione tra classi Ereditarietà singola: una classe condivide la struttura e/o il funziona- mento definito in unaltra classe Ereditarietà multipla: una classe condivide la struttura e/o il funziona- mento definito in varie altre classi La nozione di ereditarietà scaturisce dall'esigenza di poter condividere (parti di) una descrizione, cioè di riusare concetti già esistenti e codice già scritto e provato.
LINGUAGGI AD OGGETTI Linguaggi object-oriented –supportano sia incapsulamento, sia ereditarietà Linguaggi object-based –supportano solo incapsulamento (come Ada e Modula2)
SVILUPPO OBJECT-ORIENTED Si può sviluppare software in modo object-oriented anche senza disporre a livello implementativo di un linguaggio a oggetti? SÌ... anche se a fatica
CLASSI, MODULI, ADT, TIPI Il concetto di classe non coincide con il concetto di tipo –La classe può essere intesa come la specifica implementazione di un tipo –incluse le modalità di costruzione degli oggetti. Il costrutto class integra –aspetti tipici dei costrutti per esprimere modularità –aspetti tipici dei costrutti per definire ADT
QUALI OPERAZIONI ?
IL PUNTO DI VISTA UTENTE Dal punto di vista dellutente, vi sono: operazioni di costruzione (costruttori) operazioni di selezione di componenti (selettori) operazioni di verifica di proprietà (predicati) operazioni di trasformazione (trasformatori) La presenza o assenza di certe categorie di operazioni implica diversi tipi di oggetti: oggetti atomici vs. oggetti composti gli oggetti atomici non hanno selettori oggetti con o senza stato gli oggetti senza stato non hanno trasformatori
IL PUNTO DI VISTA DELLIMPLEMENTATORE Limplementatore, invece, opera diverse classificazioni in relazione allaspetto che intende mettere in luce operazioni di costruzione / configurazione operazioni primitive / non primitive operazioni private / pubbliche Questi criteri di classificazione operano su dimensioni diverse uno rispetto allaltro –possono quindi esistere primitive private o pubbliche, operatori di costruzione privati e pubblici, etc.
IL PUNTO DI VISTA DELLIMPLEMENTATORE Limplementatore, invece, opera diverse classificazioni in relazione allaspetto che intende mettere in luce operazioni di costruzione / configurazione operazioni primitive / non primitive operazioni private / pubbliche Questi criteri di classificazione operano su dimensioni diverse uno rispetto allaltro –possono quindi esistere primitive private o pubbliche, operatori di costruzione privati e pubblici, etc. Costruzione: unoperazione di definizione, che alloca memoria e eventualmente inizializza. Configurazione: unoperazione che inizializza un oggetto.
IL PUNTO DI VISTA DELLIMPLEMENTATORE Limplementatore, invece, opera diverse classificazioni in relazione allaspetto che intende mettere in luce operazioni di costruzione / configurazione operazioni primitive / non primitive operazioni private / pubbliche Questi criteri di classificazione operano su dimensioni diverse uno rispetto allaltro –possono quindi esistere primitive private o pubbliche, operatori di costruzione privati e pubblici, etc. Primitive: operazioni dipendenti dalla rappresentazione le uniche a poter accedere alla rappresentazione interna un insieme funzionalmente completo Non primitive: operazioni indipendenti dalla rappresentazione non accedono alla rappresentazione interna non cambiano se essa viene modificata
IL PUNTO DI VISTA DELLIMPLEMENTATORE Limplementatore, invece, opera diverse classificazioni in relazione allaspetto che intende mettere in luce operazioni di costruzione / configurazione operazioni primitive / non primitive operazioni private / pubbliche Questi criteri di classificazione operano su dimensioni diverse uno rispetto allaltro –possono quindi esistere primitive private o pubbliche, operatori di costruzione privati e pubblici, etc. Pubbliche: tutti possono invocarle per operare sulloggetto Private: possono essere invocate solo da altre operazioni del medesimo oggetto