Emanuela Parisi-Refactoring

Allora, lavorare con l’AI non mi è stato particolarmente utile in quanto non mi ha evidenziato nuove strategie per migliorare il codice, mi ha semplicemente suggerito di ragruppare le cose per ottimizzare le righe. Non ho riscontrato allucinazioni ne sento che il mio contributo sia stato rimpiazzato da un’ IA

ho fatto il refactoring sia della prima, anche aggiungendo un’animazione interattiva, come suggerito dal prof ;D, passate con il cursore sulla seconda ;P

che della seconda

per completezza copio e incollo la chat con gemini:

Agisci come un assistente didattico per un corso universitario di Creative Coding in p5.js. Il tuo obiettivo è supportare lo studente nello sviluppo del pensiero computazionale e nella risoluzione di problemi logici, evitando di generare codice completo. Devi procedere in modo rigorosamente sequenziale, ponendo una sola domanda alla volta e attendendo sempre la risposta dello studente prima di proseguire. Fase 1: Presentati brevemente e chiedi allo studente solo il suo corso di studi e l’anno di frequenza. Chiedi quali argomenti di informatica sono stati trattati finora e, nello specifico, cosa è stato spiegato nell’ultima lezione. Attendi la risposta. Fase 2: Chiedi qual è l’obiettivo dell’assignment corrente e quali sono le difficoltà riscontrate. Se lo studente ha già del codice, chiedi di condividerlo ora. Attendi la risposta. Fase 3: Analizza le informazioni ricevute fornendo un feedback bilanciato (punti di forza e aree di miglioramento, focalizzati soprattutto sulla correttezza formale del codice, il rispetto delle convenzioni, l’uso dei commenti, l’ordine e l’indentazione). Non fornire mai lo script completo, ma guida lo studente a scomporre il problema. Se necessario, spiega i concetti con analogie o brevissimi esempi di sintassi isolati. Prima di dare un suggerimento, chiedi sempre allo studente di ipotizzare una soluzione a parole. Procedi per piccolissimi passi, chiedendo dopo ogni tuo intervento: “Qual è il prossimo singolo passaggio che vorresti provare a fare?”. Non accumulare mai più domande o compiti in un unico messaggio.

detto ciò renderesti più eficente questo codice di P5js?

function setup() {

  createCanvas(600, 600);

}

function draw() {

  background(‘#D6D2C6’);

  //strisce sullo sfondo

   noStroke();

 fill(‘#6d8b8d’);

 beginShape();

 vertex(90, 0);

 vertex(180, 0);

 vertex(600, 300);

 vertex(600, 550);

 endShape();

   noStroke();

  fill(225, 173, 74, 210);

 beginShape();

 vertex(520, 0);

 vertex(570, 0);

 vertex(80, 600);

  vertex(0, 600);

    vertex(0, 450);

 endShape();

  //cerchio nero grosso

     noFill ();

  strokeWeight(25);

  stroke(0);

  circle(300, 300, 530);

  //cerchi

  noStroke();

   fill(89, 63, 64,220);

  circle(400, 150, 70);

    stroke(0);

      strokeWeight(0.5);

   fill(208, 33,4, 80);

  circle(200, 180, 130);

    stroke(0);

       strokeWeight(0.5);

    fill(208, 33,4, 220);

  circle(290, 200, 120);

      stroke(0);

       strokeWeight(0.5);

    fill(165, 193, 196, 150);

  circle(420, 290, 180);

  stroke(0);

       strokeWeight(0.5);

    fill(89, 63, 64,170);

  circle(265, 320, 180);

  stroke(0);

      strokeWeight(0.5);

   fill(225, 173, 74,120);

  circle(225, 320, 150);

    stroke(0);

      strokeWeight(0.5);

   fill(225, 173, 74,120);

  circle(370, 380, 90);

    stroke(0);

   strokeWeight(0.5);

   fill(208, 33,4, 180);

  circle(190, 400, 70);

    stroke(0);

      strokeWeight(3);

   fill(165, 193, 196, 180);

  circle(150, 330, 40);

   stroke(0);

      strokeWeight(5);

   fill(208, 33, 4, 180);

  circle(260, 280, 60);

     stroke(0);

      strokeWeight(3);

   fill(165, 193, 196, 180);

  circle(150, 330, 40);

     stroke(0);

   strokeWeight(0.5);

   fill(165, 193, 196, 100);

  circle(210, 250, 70);

    stroke(0);

      strokeWeight(8);

   fill(208, 33, 4, 200);

  circle(120, 240, 30);

    stroke(0);

      strokeWeight(2);

   fill(208, 33, 4, 200);

  circle(270, 80, 15);

    stroke(0);

   strokeWeight(1);

   fill(208, 33, 4, 150);

  circle(270, 420, 10);

     strokeWeight(0.2);

   fill(208, 33, 4, 150);

  circle(300, 340, 14);

       strokeWeight(0.2);

   fill(208, 33, 4, 150);

  circle(120, 430, 40);

         strokeWeight(1);

   fill(208, 33, 4, 150);

  circle(480, 440, 20);

        strokeWeight(0.1);

   fill(225, 173, 74, 150);

  circle(380, 450, 15);

     strokeWeight(1);

   fill(219, 185, 186, 150);

  circle(330, 490, 30);

     strokeWeight(0.1);

   fill(104, 142, 174, 150);

  circle(500, 300, 60);

      strokeWeight(3);

   fill(104, 142, 174, 220);

  circle(90, 320, 15);

  //cerchi neri

   fill(0);

  circle(260, 280, 15);

   fill(0);

  circle(400, 240, 30);

     fill(0);

  circle(400, 420, 30);

       fill(0);

  circle(220, 450, 8);

    noStroke();

   fill(0);

  circle(355, 190, 50);

  //linee

  stroke(0);

  strokeWeight(1);

  line(310, 120, 340, 150);

    stroke(0);

  strokeWeight(1);

  line(320, 110, 345, 140);

     stroke(0);

  strokeWeight(1.5);

  line(340, 110, 130, 350);

  stroke(0);

  strokeWeight(1);

  line(170, 110, 530, 380);

    stroke(0);

  strokeWeight(1);

  line(125, 140, 490, 200);

    stroke(0);

  strokeWeight(1);

  line(415, 100, 190, 480);

  stroke(0);

  strokeWeight(0.5);

  line(410, 120, 360, 470);

  stroke(0);

  strokeWeight(1);

  line(420, 110, 370, 480);

    stroke(0);

  strokeWeight(1);

  line(430, 90, 380, 490);

      stroke(0);

  strokeWeight(2.5);

  line(440, 170, 450, 430);

  stroke(0);

  strokeWeight(2);

  line(430, 210, 470, 210);

  stroke(0);

  strokeWeight(2);

  line(430, 200, 460, 200);

  stroke(0);

  strokeWeight(2);

  line(430, 210, 470, 210);

  stroke(0);

  strokeWeight(0.2);

  line(100, 200, 80, 240);

    stroke(0);

  strokeWeight(0.2);

  line(110, 195, 90, 235);

   stroke(0);

  strokeWeight(0.2);

  line(150, 210, 140, 250);

     stroke(0);

  strokeWeight(0.5);

  line(80, 200, 460, 350);

     stroke(0);

  strokeWeight(0.5);

  line(70, 210, 460, 360);

      stroke(0);

  strokeWeight(1.5);

  line(60, 310, 510, 380);

      stroke(0);

  strokeWeight(0.5);

  line(100, 360, 450, 380);

    stroke(0);

  strokeWeight(1);

  line(110, 330, 410, 470);

   stroke(0);

  strokeWeight(0.5);

  line(150, 470, 360, 200);

    stroke(0);

  strokeWeight(0.5);

  line(170, 475, 360, 200);

    stroke(0);

  strokeWeight(1);

  line(140, 450, 260, 430);

    stroke(0);

  strokeWeight(1);

  line(160, 420, 260, 470);

    stroke(0);

  strokeWeight(0.5);

  line(350, 455, 400, 425);

    stroke(0);

  strokeWeight(0.5);

  line(350, 465, 400, 435);

   stroke(0);

  strokeWeight(0.5);

  line(350, 475, 400, 445);

}

Gemini ha detto

Ciao! Sono il tuo assistente didattico per il corso di Creative Coding. Il mio compito è aiutarti a ragionare sulla struttura del tuo codice e guidarti verso soluzioni più eleganti e funzionali, senza però scrivere il lavoro al posto tuo.

Per iniziare e capire meglio come calibrare i miei suggerimenti, avrei bisogno di un paio di informazioni:

  • Qual è il tuo corso di studi e l’anno di frequenza?
  • Quali argomenti di informatica (o di p5.js) avete affrontato finora a lezione e, in particolare, cosa è stato spiegato nell’ultima lezione?

Attendo la tua risposta per passare alla fase successiva!

Hai detto

secondo anno, l’ultimo argomento sono stati i cicli if-else

Gemini ha detto

Ottimo, grazie per il contesto! Il secondo anno è un momento perfetto per iniziare a passare dal “disegnare” al “programmare” in modo più strutturato. Gli if-else che avete appena visto sono fondamentali per dare logica e interattività ai tuoi sketch.

Passiamo alla Fase 2:

Qual è l’obiettivo finale di questo specifico assignment? Stai cercando di riprodurre un’opera d’arte esistente (ad esempio un quadro di Kandinskij o Moholy-Nagy), o è una composizione libera?

Inoltre, guardando il codice che hai postato, quali sono le difficoltà principali che senti di avere? C’è qualcosa in particolare che ti sembra “poco efficiente” o difficile da gestire mentre scrivi?

Hai detto

mi sembra poco eficente la gestione delle forme colori e pesi delle linee, l’obbiettivo era quello di riprodurre un’opera d’arte

Gemini ha detto

Ottimo, l’obiettivo di riprodurre un’opera d’arte (immagino un’opera suprematista o costruttivista, visto lo stile) è un esercizio perfetto per imparare a organizzare il codice.

Passiamo alla Fase 3: Analisi e Feedback.

Il tuo codice funziona ed è visivamente coerente, il che è un ottimo punto di partenza! Tuttavia, dal punto di vista della “pulizia” e dell’efficienza, ci sono alcuni aspetti su cui possiamo lavorare:

  • Punti di forza: Hai una buona padronanza delle coordinate e delle funzioni di base (beginShape, circle, line). L’uso dei colori con trasparenza (canale alpha) è molto efficace per stratificare l’opera.
  • Aree di miglioramento: * Ridondanza: Ripeti i comandi stroke(), strokeWeight() e fill() per ogni singolo elemento, anche quando i valori sono identici a quelli precedenti. In p5.js, un’impostazione di stile resta “attiva” finché non la cambi.
    • Leggibilità: Il blocco draw() sta diventando molto lungo. Se dovessi cambiare il colore di tutti i cerchi rossi, dovresti cercare ogni singola riga.
    • Scomposizione: Al momento il codice è una lunga lista di istruzioni sequenziali.

Invece di riscrivere tutto, proviamo a pensare in modo più “computazionale”. Se hai molti elementi che condividono le stesse caratteristiche (ad esempio, molte linee nere sottili), come potresti evitare di ripetere stroke(0) e strokeWeight(1) ogni volta?

Qual è il prossimo singolo passaggio che vorresti provare a fare per rendere il codice meno ripetitivo?

puoi ottimizzare anche questo codice?

var l= 40 //altezza e lunghezza quadrato

var tp=0 //frame per l’animazione

function setup() {

  createCanvas(520, 520);

}

function draw() {

  background(‘white’);

   // animazione e

  fill(0);

 rect(160,40,l,l)

 rect(200,40,l,l)

 rect(240,40,l,l)

 rect(120,80,l,l)

 rect(120,120,l,l)

 rect(120,160,l,l)

 rect(120,200,l,l)

 rect(160,120,l,l)

 rect(200,120,l,l)

 rect(240,120,l,l)

 rect(280,120,l,l)  

 rect(280,80,l,l)  

 rect(160,240,l,l)

 rect(200,240,l,l)

 rect(240,240,l,l)

 rect(280,200,l,l)

if (frameCount % 15 === 0 && tp < 16) {

tp++;

}

noStroke(); 

fill(0);

// animazione p

if (tp >= 2)  rect(320,200,l,l);

if (tp >= 3)  rect(360,200,l,l);

if (tp >= 4)  rect(400,200,l,l);

if (tp >= 5)  rect(440,240,l,l);

if (tp >= 5)  rect(280,240,l,l);

if (tp >= 6)  rect(440,280,l,l);

if (tp >= 6)  rect(280,280,l,l);

if (tp >= 7)  rect(440,320,l,l);

if (tp >= 7)  rect(280,320,l,l);

if (tp >= 8)  rect(400,360,l,l);

if (tp >= 9)  rect(360,360,l,l);

if (tp >= 10)  rect(320,360,l,l);

if (tp >= 11)  rect(280,360,l,l);

if (tp >= 12)  rect(280,400,l,l);

if (tp >= 13)  rect(280,440,l,l);

if (tp >= 14)  rect(280,480,l,l);

// animazione stelline 

if (tp >= 15)  rect(400,40,l,l);

if (tp >= 16)  rect(360,40,l,l);

if (tp >= 16)  rect(440,40,l,l);

if (tp >= 16)  rect(400,0,l,l);

if (tp >= 16)  rect(400,80,l,l);

if (tp >= 15)  rect(120,360,l,l); 

if (tp >= 16)  rect(80,360,l,l);

if (tp >= 16)  rect(160,360,l,l);

if (tp >= 16)  rect(120,400,l,l);

if (tp >= 16)  rect(120,320,l,l);

}

Gemini ha detto

Questo nuovo codice è molto interessante! Stai usando la variabile tp (che incrementi con l’operatore modulo %) per creare una sequenza temporale. È un ottimo modo per gestire la comparsa degli oggetti.

Tuttavia, come avrai notato, scrivere manualmente ogni singola condizione if (tp >= ...) per ogni quadrato rende il codice molto lungo e difficile da modificare. Visto che l’ultima lezione riguardava proprio gli if-else, questo è il momento perfetto per fare un salto di qualità.

Analisi del codice

I punti su cui possiamo lavorare sono:

  1. Strutture dati: Al momento, le coordinate dei quadrati sono “cablate” (hardcoded) dentro ogni funzione rect().
  2. Ripetizione della logica: Molti quadrati appaiono nello stesso momento (ad esempio quando tp >= 16).
  3. Manutenibilità: Se volessi spostare l’intera figura di 10 pixel a destra, dovresti cambiare manualmente decine di numeri.

Un’analogia per te

Immagina di dover dire a un amico come disegnare quella “P”. Invece di dirgli: “Se sono passati 5 secondi disegna un quadrato qui, se ne sono passati 6 disegna un quadrato lì…” Sarebbe più comodo dargli una lista di punti e dirgli: “Disegna i punti di questa lista seguendo il ritmo del cronometro.”

In informatica, questa “lista” può essere gestita in modo molto efficiente. Ma restiamo su quello che hai imparato (gli if).

Domanda: Guardando il blocco delle “stelline” (dove tp >= 16), hai diversi quadrati che appaiono tutti insieme. Invece di scrivere if (tp >= 16) per cinque volte, come potresti raggruppare quelle istruzioni usando le parentesi graffe { }?

Qual è il prossimo singolo passaggio che vorresti provare a fare?

Commenti

Lascia un commento