{"id":73,"date":"2026-01-12T19:19:00","date_gmt":"2026-01-12T18:19:00","guid":{"rendered":"https:\/\/www.matteobononi.it\/blog\/?p=73"},"modified":"2026-10-13T08:41:20","modified_gmt":"2026-10-13T07:41:20","slug":"dal-caos-allordine-la-mia-esperienza-nel-refactoring-di-un-sito-prestashop-1-6-verso-la-versione-9","status":"publish","type":"post","link":"https:\/\/www.matteobononi.it\/blog\/dal-caos-allordine-la-mia-esperienza-nel-refactoring-di-un-sito-prestashop-1-6-verso-la-versione-9\/","title":{"rendered":"Dal caos all\u2019ordine: la mia esperienza nel refactoring di un sito Prestashop 1.6 verso la versione 9"},"content":{"rendered":"<p>Il sito era nato su PrestaShop 1.6. Poi erano arrivati override delle classi, controller modificati e moduli custom scritti in momenti diversi. A un certo punto, prima ancora di capire come portarli verso una versione nuova, serviva ricostruire che cosa facessero.<\/p>\n<p>Una parte del lavoro era nel codice. Un\u2019altra nelle relazioni fra quei pezzi: dove entrava un dato, chi lo modificava, quale modulo si aspettava di ritrovarlo. Leggere un file alla volta lasciava aperta tutta questa seconda parte.<\/p>\n<p><strong>Nota del 13 ottobre 2026.<\/strong> Questo \u00e8 il racconto di un lavoro storico sui moduli legacy. La revisione chiarisce il metodo e i suoi limiti; non aggiorna lo stato del rilascio di quel sito n\u00e9 certifica la compatibilit\u00e0 attuale dei singoli moduli.<\/p>\n<h2>Separare per riuscire a capire<\/h2>\n<p>Nel lavoro raccontato qui avevo isolato i moduli sviluppati internamente in repository dedicati. In ogni repository potevamo concentrarci su un contesto pi\u00f9 piccolo: funzioni, hook, tabelle, interfacce e dipendenze di quel modulo.<\/p>\n<p>La separazione aiutava a leggere il codice. Le dipendenze, per\u00f2, continuavano a esistere. Se un modulo si appoggiava a un altro, dovevamo conservare anche quel collegamento nell\u2019analisi. Una cartella pulita non rende indipendente un pezzo che prima non lo era.<\/p>\n<h2>Prima capire cosa succedeva<\/h2>\n<p>Insieme agli agenti avevamo organizzato gli audit dentro <code>audit_update\/<\/code>. I documenti descrivevano cosa faceva il modulo, quali hook usava, come lavorava sui dati, quali schermate esponeva e da quali altri componenti dipendeva.<\/p>\n<p>Il codice originale restava il riferimento. Un report poteva rendere pi\u00f9 leggibile un comportamento, ma poteva anche perderne uno o interpretarlo male. Per questo l\u2019analisi passava attraverso revisioni, domande e correzioni prima di diventare il punto da cui sviluppare.<\/p>\n<p>La cartella cominciava cos\u00ec a contenere qualcosa che una nuova sessione poteva rileggere, senza dover ricostruire tutto dalla conversazione precedente.<\/p>\n<h2>Le istruzioni nascevano dall\u2019analisi<\/h2>\n<p>Da quel materiale preparavamo <code>AGENTS.md<\/code>: obiettivi, vincoli, ruoli e regole per chi avrebbe lavorato sul modulo. Auditor, Architect, Coder e Reviewer erano modi per distinguere i compiti dentro il flusso.<\/p>\n<p>Separare i compiti aiutava a mettere in discussione il lavoro. Avere un agente chiamato Reviewer, per\u00f2, non bastava a rendere corretta la sua revisione. Anche i suoi rilievi dovevano tornare al codice, alla documentazione e alle prove.<\/p>\n<p>Le regole tecniche andavano scelte per la destinazione: versione di PrestaShop, ambiente PHP, API e parti del modulo da mantenere o cambiare. I <a href=\"https:\/\/devdocs.prestashop-project.org\/9\/basics\/installation\/system-requirements\/\">requisiti ufficiali di PrestaShop<\/a> e la <a href=\"https:\/\/devdocs.prestashop-project.org\/9\/modules\/\">documentazione dei moduli<\/a> sono il riferimento da rileggere quando si affronta un lavoro nuovo. Il file di istruzioni conserva le scelte del progetto, non sostituisce quel controllo.<\/p>\n<h2>Il nuovo repository aveva un punto di partenza<\/h2>\n<p>Nel percorso descritto il nuovo repository partiva dall\u2019audit e dalle istruzioni, per costruire il modulo destinato alla nuova versione. Era una scelta di quel lavoro, da valutare anche rispetto a quello che conveniva conservare.<\/p>\n<p>Il passaggio utile era portare con noi la conoscenza raccolta: comportamenti da riprodurre, dipendenze, dubbi e verifiche necessarie. Ripartire dal codice nuovo senza quei riferimenti avrebbe reso pi\u00f9 difficile accorgersi di una funzione persa per strada.<\/p>\n<h2>Prova, rifinisci, ritenta<\/h2>\n<p>Nel primo racconto avevo scritto \u201cprova, rifinisci, ritenta, torna indietro, fallo due volte e poi ok\u201d. Il problema \u00e8 proprio quel \u201cpoi ok\u201d \ud83d\ude00<\/p>\n<p>Due giri non sono una misura della stabilit\u00e0. Per decidere se un modulo \u00e8 pronto servono le prove pertinenti: installazione, percorsi che usa davvero, dati che legge e scrive, convivenza con gli altri componenti. E condizioni di prova abbastanza chiare da poterle ripetere.<\/p>\n<p>Il numero di revisioni racconta quanto ci abbiamo lavorato. L\u2019esito delle verifiche racconta qualcosa sul risultato. Tenerli separati rende pi\u00f9 utile anche l\u2019analisi.<\/p>\n<h2>Il metodo che \u00e8 rimasto<\/h2>\n<p>Da questo percorso avevo ricavato <a href=\"https:\/\/www.matteobononi.it\/blog\/audit-to-refactor-il-metodo-ai-driven-per-migrare-moduli-legacy-di-prestashop\/\">Audit-to-Refactor<\/a>: leggere il sistema, conservare quello che abbiamo capito e usarlo per organizzare il lavoro successivo.<\/p>\n<p>La <a href=\"https:\/\/www.matteobononi.it\/progetti\/audit-to-refactor\/\">scheda del metodo<\/a> tiene insieme i due racconti. Il lavoro sul contesto dei progetti continua anche con <a href=\"https:\/\/www.matteobononi.it\/progetti\/repo-forge\/\">Repo Forge<\/a>, su un piano diverso: istruzioni, decisioni e piani da mantenere mentre cambia il codice.<\/p>\n<p>La parte che mi interessa \u00e8 quella che rimane fra una sessione e l\u2019altra. Se il ragionamento \u00e8 stato buono, devo poterlo ritrovare. Se era sbagliato, mi serve capire da dove eravamo partiti per poterlo correggere.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un lavoro storico sui moduli PrestaShop legacy: separare il codice, conservarne il comportamento e preparare lo sviluppo con gli agenti, senza confondere revisioni e verifiche.<\/p>\n","protected":false},"author":1,"featured_media":74,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[3],"class_list":["post-73","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sviluppo","tag-intelligenza-artificiale"],"_links":{"self":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts\/73","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":2,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts\/73\/revisions"}],"predecessor-version":[{"id":206,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts\/73\/revisions\/206"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/media\/74"}],"wp:attachment":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/media?parent=73"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/categories?post=73"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/tags?post=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}