21
Programmazione modulare Linguaggi dinamici – A.A. 2009/2010 1

T7 librerie

Embed Size (px)

Citation preview

Page 1: T7 librerie

Programmazione modulareg

Linguaggi dinamici – A.A. 2009/20101

Page 2: T7 librerie

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

Page 3: T7 librerie

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

Page 4: T7 librerie

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

Page 5: T7 librerie

Scope

Linguaggi dinamici – A.A. 2009/20105

Page 6: T7 librerie

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

Page 7: T7 librerie

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

Page 8: T7 librerie

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

Page 9: T7 librerie

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

Page 10: T7 librerie

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

Page 11: T7 librerie

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

Page 12: T7 librerie

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

Page 13: T7 librerie

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

Page 14: T7 librerie

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

Page 15: T7 librerie

Sviluppo per componentipp p p

Linguaggi dinamici – A.A. 2009/201015

Page 16: T7 librerie

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!

Page 17: T7 librerie

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

Page 18: T7 librerie

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

Page 19: T7 librerie

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

Page 20: T7 librerie

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

Page 21: T7 librerie

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