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