View
397
Download
0
Category
Preview:
Citation preview
Programmazione modulareg
Linguaggi dinamici – A.A. 2009/20101
Introduzione� Modularità: suddivisione del programma in più
unità funzionali (moduli) distinteunità funzionali (moduli) distinte
� Tutti i linguaggi di programmazione forniscono un qualche supporto per rendere modulari iun qualche supporto per rendere modulari i programmi
I li i di i i f t t i t ti� I linguaggi dinamici sono fortemente orientati verso la modularità� Quasi tutto è un oggetto (variabili, codice)
� È semplice suddividere una funzionalità per classi e per gruppi di classi (pacchetti)
� Librerie estese di moduli già pronti
Linguaggi dinamici – A.A. 2009/20102
g p
Vantaggi della modularità� Organizzazione
Raggruppamento delle funzioni seguendo una� Raggruppamento delle funzioni, seguendo una organizzazione ben precisa
Li it t d li i d l di� Limitata duplicazione del codice� Ciascun modulo implementa una funzionalità
b ifiben specifica
� Riuso del software� Se scritto bene (si legga: se astrae dalla logica
del singolo programma), un modulo può essere riutilizzato in programmi molto diversi fra loro
Linguaggi dinamici – A.A. 2009/20103
Scope� Lo scope di un oggetto (variabile, funzione) è
la parte di programma in cui l'oggetto èla parte di programma in cui l oggetto è direttamente accessibile
Variabili con stesso nome possono riferirsi a� Variabili con stesso nome possono riferirsi a contenuti diversi in scope diversi
Cl i i i bil l l h� Classico esempio: variabile locale che sovrascrive temporaneamente una variabile globale avente lo stesso nomeglobale avente lo stesso nome
Linguaggi dinamici – A.A. 2009/20104
Scope
Linguaggi dinamici – A.A. 2009/20105
Scope� Quando il compilatore (o l'interprete)
individuano il nome di una variabile provanoindividuano il nome di una variabile, provano ad associare ad essa il valore che le compete, usando le regole di scopeusa do e ego e d scope
� Si esamina innanzitutto l'ambiente locale (tipicamente il blocco di codice in cui la(tipicamente, il blocco di codice in cui la variabile è definita)
Se non si trova una definizione si applicano le� Se non si trova una definizione, si applicano le regole di scope
S t ti� Scope statico
� Scope dinamico
Linguaggi dinamici – A.A. 2009/20106
Scope statico� In un linguaggio basato su scope statico:
lo scope di una variabile è il blocco di codice in� lo scope di una variabile è il blocco di codice in cui essa è definita
i bil l l i t ll'i t� una variabile non locale viene cercata all'interno del blocco di codice in cui la procedura stessa è definitadefinita
� La ricerca avviene tipicamente a tempo di il i d l l d l il tcompilazione, usando le regole del compilatore
� Lo scope statico viene anche chiamato scope l i l t tilessicale per questo motivo
� Esempio: C, Perl (dichiarazione my)
Linguaggi dinamici – A.A. 2009/20107
Scope dinamico� In un linguaggio basato su scope dinamico
lo scope di una variabile non è necessariamente� lo scope di una variabile non è necessariamente solo il blocco di codice in cui essa è definita
i bil l l i t i i� una variabile non locale viene cercata nei vari stack frame
L i i ti i t t di� La ricerca avviene tipicamente a tempo di esecuzione� Esempio: Perl (dichiarazione local)
Linguaggi dinamici – A.A. 2009/20108
Namespace� Il namespace è l'insieme delle variabili e delle
funzioni visibili immediatamente dal punto delfunzioni visibili immediatamente dal punto del programma in cui ci si trova
Più variabili e funzioni si vedono più aumenta� Più variabili e funzioni si vedono, più aumenta il rischio di collisioni fra i loro nomi
Si i li ff tti ll t li� Si creano spiacevoli effetti collaterali
� Diminuisce l'incapsulamento
� Occorre un meccanismo per limitare tali effetti collaterali
Linguaggi dinamici – A.A. 2009/20109
Modulo software� Un modulo software è un file contenente la
definizione di molteplicidefinizione di molteplici� Variabili
F i i� Funzioni
� Classi (con relativi metodi e attributi)
� Idealmente, ciascun modulo contiene l'implementazione di un aspetto del software� Scheletro principale
� Funzionalità di gestioneFunzionalità di gestione
� I/O
GUILinguaggi dinamici – A.A. 2009/2010
10
� GUI
Package� Un package è un insieme di moduli software
A tutti i moduli del package è associato lo� A tutti i moduli del package è associato lo stesso namespace
� Package diversi hanno namespace diversi e separati
� Le variabili e le funzioni contenute in due namespace diversi non si vedono
Linguaggi dinamici – A.A. 2009/201011
Un esempio di packageIl file ha il nome
File: ModExample.pm
package ModExample;
Il file ha il nomedel pacchettopiù l'estensione
use strict;
b dG i {
p
Nome del package
sub randGreeting {
my (@greets) =
qw(Hello Howdy WUZZUP);
File: demo.pl
#!/usr/bin/perl
q ( y );
return $greets[rand($#greets)];
}
use strict;
use ModExample;
sub hello {
print randGreeting() .
“from ModExample!\n”;
ModExample::hello();
from ModExample!\n ;
}
1;
Invocazione del metodo all'interno
Linguaggi dinamici – A.A. 2009/201012
del namespace ModExample
Naming degli oggetti� Per accedere ad una variabile o funzione di un
namespace da un altro namespace occorrenamespace da un altro namespace, occorre fare una delle seguenti due cose:� Costruire il nome completo dell'oggetto che si� Costruire il nome completo dell oggetto che si
vuole referenziare, inteso come l'unione del namespace e dell'oggetto stesso all'interno delnamespace e dell oggetto stesso all interno del namespace (ModExample::hello())
� Esportare la funzione all'interno del namespace� Esportare la funzione all interno del namespace che la definisce; d'ora in poi la funzione si può chiamare con il suo nome (hello())( ())
Linguaggi dinamici – A.A. 2009/201013
Best practice di design� Progettare innanzitutto l'API dei vari moduli
Scegliere cosa esportare agli altri� Scegliere cosa esportare agli altri moduli/package (sempre il minimo possibile)
� Mai rendere esplicito l'uso di variabili nell'API� Usare sempre metodi get()/set()
� Refactoring� Si copia ed incolla il codice da fonti esterne e/o si� Si copia ed incolla il codice da fonti esterne e/o si
scrive codice
� Il codice duplicato lo si fa diventare una subroutinep
� Le subroutine duplicate le si fanno diventare moduli o package
Linguaggi dinamici – A.A. 2009/201014
p g
Sviluppo per componentipp p p
Linguaggi dinamici – A.A. 2009/201015
Introduzione� La totalità dei linguaggi dinamici moderni
mette a disposizione un deposito (repository)mette a disposizione un deposito (repository)di moduli e pacchetti per le operazioni più disparated spa ate
� Similitudine con la libreria del C per il linguaggio Clinguaggio C
� Nel caso dei linguaggi dinamici, l'insieme delle funzionalità esterne offerte è molto più grandefunzionalità esterne offerte è molto più grande� Circa 1000 funzioni nella glibc
� Circa 20000 moduli negli archivi del Perl
� Parafrasando Church e Turing: se riuscite a
Linguaggi dinamici – A.A. 2009/201016
pensarlo, esiste come modulo!
Alcuni esempi di repository� Perl: http://www.cpan.org
Python: http://pypi python org/pypi/� Python: http://pypi.python.org/pypi/
� Ruby: http://rubyforge.org/
� Questi repository (come gli altri, in generale) presentano le seguenti funzionalità:� Motore di ricerca (interfaccia Web)
� Download di una versione recente del modulo� Download di una versione recente del modulo
� Documentazione del modulo
Elenco delle dipendenze del modulo� Elenco delle dipendenze del modulo
Linguaggi dinamici – A.A. 2009/201017
Uso dei moduli� Il pacchetto software del linguaggio mette a
disposizione meccanismi per:disposizione meccanismi per:� scaricare l'archivio sorgente di un modulo dal
repositoryrepository
� compilare (se necessario) un modulo a partire dal suo archivio sorgentedal suo archivio sorgente
� verificare la funzionalità del modulo, tramite degli unit testdegli unit test
� installare il modulo in una locazione ben precisa del file system (da dove potrà essere caricatodel file system (da dove potrà essere caricato, qualora fosse importato)
Linguaggi dinamici – A.A. 2009/201018
Best practice di programmazione� Non si reinventa la ruota inutilmente!
Si resiste alla tentazione di riscrivere da zero� Si resiste alla tentazione di riscrivere da zero (e di testare!) tonnellate di codice
� Passi da seguire� Si suddivide il progetto in moduli software
� Si cerca di individuare alcuni moduli nel repository
� Si installano i moduli del repository
� Si scrive quello che resta (se si è bravi e/o� Si scrive quello che resta (se si è bravi e/o fortunati, solo lo scheletro!)
Linguaggi dinamici – A.A. 2009/201019
Best practice di programmazione� Vantaggi offerti
I moduli sono solitamente self contained� I moduli sono solitamente self-contained, pertanto non ci si ripete inutilmente (principi DRY SPOT)DRY, SPOT)� DRY (Don't Repeat Yourself): Every piece of
knowledge must have a single unambiguousknowledge must have a single, unambiguous, authoritative representation within a systemSinglePointOfTruth (SPOT)� SinglePointOfTruth (SPOT)
Linguaggi dinamici – A.A. 2009/201020
Best practice di programmazione� Vantaggi offerti
I moduli sono già testati esaustivamente (dai� I moduli sono già testati esaustivamente (dai programmatori e dagli altri utenti), pertanto la probabilità di immettere errori nel software siprobabilità di immettere errori nel software si confina al software scritto da noi
I moduli sono scritti da persone spesso molto� I moduli sono scritti da persone spesso molto più competenti di noi, pertanto la qualità del software aumentasoftware aumenta
Linguaggi dinamici – A.A. 2009/201021
Recommended