Fondamenti di Informatica (Elettronici)
Da THINK JULIA – Capitolo 4 (Parte b)
18 ottobre 2021
Caso di studio: Design dell’interfaccia (parte b)
11 Refactoring
2 Piano di sviluppo
3 Docstring
4 Debug
5 Glossario
6 Esercizi
1Tratto dahttps://benlauwens.github.io/ThinkJulia.jl/latest/book.html, disponibile sotto Licenza ‘Creative Commons Attribution-NonCommercial 3.0 Unported‘.
Refactoring
Section 1
Refactoring
Refactoring
Refactoring
Refactoring
Refactoring del nostro modulo geometrico
Quando hoscritto “circle”, sono stato in grado diriutilizzare “polygon”perché un poligono a molti latiè unabuona approssimazionedi uncerchio.
Ma “arc”non è così cooperativo; non possiamo usare “polygon” o “circle” per disegnare un arco.
Un’alternativa èiniziare con una copiadi polygon etrasformarlain arc. Il risultato potrebbe essere simile a questo:
function arc(t, r, angle)
arc_len = 2 * pi * r * angle / 360 n = trunc(arc_len / 3) + 1
step_len = arc_len / n step_angle = angle / n for i in 1:n
forward(t, step_len)
Refactoring
Una funzione più generale: “polyline”
La seconda metà di questa funzioneè simile a “polygon”, ma non possiamoriutilizzare “polygon” senzacambiare l’interfaccia.
Potremmo generalizzare polygonper prendere un angle come terzo argomento, ma poi polygon non sarebbe più unnome appropriato!
Chiamiamoinvece la funzione più generale “polyline”:
function polyline(t, n, len, angle) for i in 1:n
forward(t, len) turn(t, -angle) end
end
Refactoring
Riscrivi polygon e arc per usare polyline
Ora possiamoriscrivere polygon e arc perusare polyline:
function polygon(t, n, len) angle = 360 / n
polyline(t, n, len, angle) end
function arc(t, r, angle)
arc_len = 2 * pi * r * angle / 360 n = trunc(arc_len / 3) + 1
step_len = arc_len / n step_angle = angle / n
polyline(t, n, step_len, step_angle)
Refactoring
Riscrivi circle per usare arc
Infine, possiamo riscrivere circle perusare arc:
function circle(t, r) arc(t, r, 360) end
Refactoring
Alcune conclusioni
Questo processo, ovvero la riorganizzazione di un programmaper migliorare le interfacce e facilitare il riutilizzodel codice, è chiamato refactoring.
In questo caso, abbiamo notato che c’era un codice similein arc e polygon, quindi lo abbiamo“scomposto” in polyline.
Se avessimo pianificato in anticipo, avremmo potuto scrivere prima la polilinea edevitare il refactoring, ma spesso non ne sai abbastanza all’inizio di un progetto perprogettare tutte le interfacce.
Una volta che inizi a programmare,comprendi meglio il problema.
A volte il refactoringè unsegno chehai imparato qualcosa.
Piano di sviluppo
Section 2
Piano di sviluppo
Piano di sviluppo
Piano di sviluppo
Piano di sviluppo
Incapsulamento e generalizzazione
Unpiano di sviluppoè unprocessoperscrivere programmi. Il processo che abbiamo utilizzato in questo caso di studio è“incapsulamento e generalizzazione”.
I passaggi di questo processo sono:
1 Iniziascrivendo unpiccolo programmasenzadefinizioni di funzione.
2 Una volta che ilprogramma funziona,identificare un pezzo coerentedi esso, incapsulare il pezzo in una funzione e dargli unnome.
3 Generalizzare la funzioneaggiungendoparametriappropriati.
4 Ripetere i passaggi 1–3finché non si dispone di unaserie di funzionioperative. Copia e incollail codice funzionante perevitare di ridigitare(e rieseguire il debug).
5 Cercare opportunitàpermigliorare il refactoring del programma. Ad esempio, se hai uncodice similein più punti,considera di scomporloin unafunzione adeguatamentegenerale.
Piano di sviluppo
Incapsulamento e generalizzazione
Unpiano di sviluppoè unprocessoperscrivere programmi. Il processo che abbiamo utilizzato in questo caso di studio è“incapsulamento e generalizzazione”.
I passaggi di questo processo sono:
1 Iniziascrivendo unpiccolo programmasenzadefinizioni di funzione.
2 Una volta che ilprogramma funziona,identificare un pezzo coerentedi esso, incapsulare il pezzo in una funzione e dargli unnome.
3 Generalizzare la funzioneaggiungendoparametriappropriati.
4 Ripetere i passaggi 1–3finché non si dispone di unaserie di funzionioperative. Copia e incollail codice funzionante perevitare di ridigitare(e rieseguire il debug).
5 Cercare opportunitàpermigliorare il refactoring del programma. Ad esempio, se hai uncodice similein più punti,considera di scomporloin unafunzione adeguatamentegenerale.
Piano di sviluppo
Incapsulamento e generalizzazione
Unpiano di sviluppoè unprocessoperscrivere programmi. Il processo che abbiamo utilizzato in questo caso di studio è“incapsulamento e generalizzazione”.
I passaggi di questo processo sono:
1 Iniziascrivendo unpiccolo programmasenzadefinizioni di funzione.
2 Una volta che ilprogramma funziona,identificare un pezzo coerentedi esso, incapsulare il pezzo in una funzione e dargli unnome.
3 Generalizzare la funzioneaggiungendoparametriappropriati.
4 Ripetere i passaggi 1–3finché non si dispone di unaserie di funzionioperative. Copia e incollail codice funzionante perevitare di ridigitare(e rieseguire il debug).
5 Cercare opportunitàpermigliorare il refactoring del programma. Ad esempio, se hai uncodice similein più punti,considera di scomporloin unafunzione adeguatamentegenerale.
Piano di sviluppo
Incapsulamento e generalizzazione
Unpiano di sviluppoè unprocessoperscrivere programmi. Il processo che abbiamo utilizzato in questo caso di studio è“incapsulamento e generalizzazione”.
I passaggi di questo processo sono:
1 Iniziascrivendo unpiccolo programmasenzadefinizioni di funzione.
2 Una volta che ilprogramma funziona,identificare un pezzo coerentedi esso, incapsulare il pezzo in una funzione e dargli unnome.
3 Generalizzare la funzioneaggiungendoparametriappropriati.
4 Ripetere i passaggi 1–3finché non si dispone di unaserie di funzionioperative.
Copia e incollail codice funzionante perevitare di ridigitare(e rieseguire il debug).
5 Cercare opportunitàpermigliorare il refactoring del programma. Ad esempio, se hai uncodice similein più punti,considera di scomporloin unafunzione adeguatamentegenerale.
Piano di sviluppo
Incapsulamento e generalizzazione
Unpiano di sviluppoè unprocessoperscrivere programmi. Il processo che abbiamo utilizzato in questo caso di studio è“incapsulamento e generalizzazione”.
I passaggi di questo processo sono:
1 Iniziascrivendo unpiccolo programmasenzadefinizioni di funzione.
2 Una volta che ilprogramma funziona,identificare un pezzo coerentedi esso, incapsulare il pezzo in una funzione e dargli unnome.
3 Generalizzare la funzioneaggiungendoparametriappropriati.
4 Ripetere i passaggi 1–3finché non si dispone di unaserie di funzionioperative.
Copia e incollail codice funzionante perevitare di ridigitare(e rieseguire il debug).
5 Cercare opportunitàpermigliorare il refactoringdel programma. Ad esempio, se hai uncodice similein più punti,considera di scomporloin unafunzione adeguatamentegenerale.
Piano di sviluppo
Metodo di progettazione del software
Progettazione tramite refactoring
Questo processo ha alcuni inconvenienti, vedremo alternative più avanti, ma può essere utile senon saiin anticipo come dividere il programma in funzioni.
Questo approccio ticonsente di progettarementreprocedi.
Docstring
Section 3
Docstring
Docstring
Docstring
Docstring
Esempio di stringa di documentazione (docstring)
Una docstring è una stringa prima di una funzionechespiega l’interfaccia (“doc” è breve per “documentation”). Esempio:
"""
polyline(t, n, len, angle)
Draws n line segments with the given length and angle (in degrees) between them. t is a turtle.
"""
function polyline(t, n, len, angle) for i in 1:n
forward(t, len) turn(t, -angle) end
end
Docstring
Accesso alla documentazione
È possibileaccedere alla documentazionein REPLo in unnotebookdigitando ? seguito dalnomedi unafunzioneomacro, e premendo ENTER:
help?> polyline search:
polyline(t, n, len, angle)
Draws n line segments with the given length and angle (in degrees) between them. t is a Turtle.
Le docstring sono spessostringhe tra virgolette, note anche comestringhe su più righe perché levirgolette tripleconsentono alla stringa dioccupare più di una riga.
Una docstring contiene leinformazioni essenzialidi cui qualcuno avrebbe bisognoper usarequestafunzione.
Docstring
Consigli
SUGGERIMENTI
Scrivere questo tipo didocumentazione è una parte importantedel design dell’interfaccia.
Un’interfacciaben progettatadovrebbe essere semplice da spiegare; se hai difficoltà a spiegareuna delle tue funzioni, forse l’interfaccia potrebbe essere migliorata.
Docstring
Consigli
SUGGERIMENTI
Scrivere questo tipo didocumentazione è una parte importantedel design dell’interfaccia.
Un’interfacciaben progettatadovrebbe essere semplice da spiegare;
se hai difficoltà a spiegareuna delle tue funzioni, forse l’interfaccia potrebbe essere migliorata.
Docstring
Consigli
SUGGERIMENTI
Scrivere questo tipo didocumentazione è una parte importantedel design dell’interfaccia.
Un’interfacciaben progettatadovrebbe essere semplice da spiegare;
se hai difficoltà a spiegareuna delle tue funzioni, forse l’interfaccia potrebbe essere migliorata.
Debug
Section 4
Debug
Debug
Debug
Debug
Un’interfaccia è un contratto tra una funzione e un chiamante
Il chiamante accetta di fornire* alcuni parametrie lafunzione accettadi fare uncerto lavoro.
Per esempio:
polyline(t, n, len, angle)
polyline richiede quattro argomenti: t deve essere unatartaruga; “n”
deve essere un numero intero; “len” dovrebbe essere un numero positivo; e
“angle” deve essere unnumero, che si intende in gradi.
Debug
Presupposti e postcondizioni
Questirequisitisono chiamatiprecondizioniperchédovrebbero essere veriprima che lafunzione inizil’esecuzione.
Al contrario, lecondizioni alla finedellafunzionesono postcondizioni.
Lepostcondizioniincludonol’effetto voluto della funzione(come disegnare segmenti di linea) e qualsiasi effetto collaterale(comespostare la tartarugao apportare altremodifiche).
Lecondizioni preliminarisonoresponsabilità del chiamante.
Se il chiamanteviola una precondizione (adeguatamentedocumentata!) e la funzione nonfunziona correttamente, il bugè nelchiamante,nonnellafunzione. Se le precondizioni sono soddisfattee lepostcondizioni non lo sono, ilbugènella funzione. Se le tue pre- e postcondizioni sono chiare, possono aiutarti con il debug.
Debug
Presupposti e postcondizioni
Questirequisitisono chiamatiprecondizioniperchédovrebbero essere veriprima che lafunzione inizil’esecuzione.
Al contrario, lecondizioni alla finedellafunzionesono postcondizioni.
Lepostcondizioniincludonol’effetto voluto della funzione(come disegnare segmenti di linea) e qualsiasi effetto collaterale(comespostare la tartarugao apportare altremodifiche).
Lecondizioni preliminarisonoresponsabilità del chiamante.
Se il chiamanteviola una precondizione (adeguatamentedocumentata!) e la funzione nonfunziona correttamente, il bugè nelchiamante,nonnellafunzione.
Se leprecondizioni sono soddisfattee lepostcondizioni non lo sono, ilbugènella
Glossario
Section 5
Glossario
Glossario
Glossario
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e del valore restituito.
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e del valore restituito.
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e del valore restituito.
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e del valore restituito.
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e del valore restituito.
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e del valore restituito.
Glossario
Glossario I
modulo Un file che contiene unaraccolta di funzioni correlate e altre definizioni.
pacchetto Unalibreria esternacon funzionalità aggiuntive.
utilizzando l’istruzione Un’istruzione che legge un file di modulo e crea un oggetto modulo.
ciclo continuo Una parte di un programmache può essere eseguita ripetutamente.
incapsulamento Il processo di trasformazione di una sequenza di istruzioni in unadefinizione di funzione.
generalizzazione Il processo di sostituzionedi qualcosa diinutilmente specifico(come un numero) con qualcosa di adeguatamente generale(come una variabileo unparametro).
interfaccia Unadescrizionedi come utilizzareuna funzione, incluso il nomee le descrizioni degliargomenti e delvalore restituito.
Glossario
Glossario II
I
refactoring Il processo dimodifica di un programma funzionante per migliorare le interfaccedelle funzioni ealtre qualità del codice.
piano di sviluppo Un processoper scrivere programmi.
docstring Unastringache viene visualizzata nella parte superiore della definizionedi unafunzione per documentare l’interfacciadella funzione.
precondizione Requisitoche deve essere soddisfatto dal chiamanteprima dell’avviodi una funzione.
postcondizione Requisitoche deve essere soddisfatto dalla funzioneprima che termini.
Glossario
Glossario II
I
refactoring Il processo dimodifica di un programma funzionante per migliorare le interfaccedelle funzioni ealtre qualità del codice.
piano di sviluppo Unprocessoper scrivere programmi.
docstring Unastringache viene visualizzata nella parte superiore della definizionedi unafunzione per documentare l’interfacciadella funzione.
precondizione Requisitoche deve essere soddisfatto dal chiamanteprima dell’avviodi una funzione.
postcondizione Requisitoche deve essere soddisfatto dalla funzioneprima che termini.
Glossario
Glossario II
I
refactoring Il processo dimodifica di un programma funzionante per migliorare le interfaccedelle funzioni ealtre qualità del codice.
piano di sviluppo Unprocessoper scrivere programmi.
docstring Unastringache viene visualizzata nella parte superiore della definizionedi unafunzione per documentare l’interfacciadella funzione.
precondizione Requisitoche deve essere soddisfatto dal chiamanteprima dell’avviodi una funzione.
postcondizione Requisitoche deve essere soddisfatto dalla funzioneprima che termini.
Glossario
Glossario II
I
refactoring Il processo dimodifica di un programma funzionante per migliorare le interfaccedelle funzioni ealtre qualità del codice.
piano di sviluppo Unprocessoper scrivere programmi.
docstring Unastringache viene visualizzata nella parte superiore della definizionedi unafunzione per documentare l’interfacciadella funzione.
precondizione Requisitoche deve essere soddisfatto dal chiamanteprima dell’avviodi una funzione.
postcondizione Requisitoche deve essere soddisfatto dalla funzioneprima che termini.
Glossario
Glossario II
I
refactoring Il processo dimodifica di un programma funzionante per migliorare le interfaccedelle funzioni ealtre qualità del codice.
piano di sviluppo Unprocessoper scrivere programmi.
docstring Unastringache viene visualizzata nella parte superiore della definizionedi unafunzione per documentare l’interfacciadella funzione.
precondizione Requisitoche deve essere soddisfatto dal chiamanteprima dell’avviodi una funzione.
postcondizione Requisitoche deve essere soddisfatto dalla funzioneprima
Esercizi
Section 6
Esercizi
Esercizi
Esercizi
Esercizi
aaaa
Esercizi