<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Tiziano Caruana - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Tiziano Caruana - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 11 Jun 2026 04:54:26 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/author/tiziano_caruana/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Come scrivere un buon file README per i tuoi progetti GitHub ]]>
                </title>
                <description>
                    <![CDATA[ Quando sono stato introdotto a GitHub, non avevo idea di cosa fosse o cosa potesse fare. Detto tra noi, ho creato l'account perché mi era stato detto che tutti gli sviluppatori ne dovrebbero avere uno sul quale pubblicare il proprio codice. Per la maggior parte del tempo da principiante non ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-scrivere-un-buon-file-readme-per-i-tuoi-progetti-github/</link>
                <guid isPermaLink="false">6378aec78ad83006d39e10d3</guid>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tiziano Caruana ]]>
                </dc:creator>
                <pubDate>Wed, 23 Nov 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/11/uide-to-writting-a-good-readme-file--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-write-a-good-readme-file/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Write a Good README File for Your GitHub Project</a>
      </p><p>Quando sono stato introdotto a GitHub, non avevo idea di cosa fosse o cosa potesse fare. Detto tra noi, ho creato l'account perché mi era stato detto che tutti gli sviluppatori ne dovrebbero avere uno sul quale pubblicare il proprio codice.</p><p>Per la maggior parte del tempo da principiante non ho fatto nulla col mio account. Ma poi, grazie alla mia passione per tecnologia, ho iniziato a seguire altri sviluppatori e leggere i loro lavori su GitHub. E ho notato una cosa che avevano in comune: avevano tutti progetti interessanti e contribuivano a progetti open source, ma i loro progetti avevano anche dei <strong>file R<strong>EADME</strong> </strong>dettagliati.</p><p>Quindi il mio interesse in cosa fosse un README era cresciuto, e ho deciso di provare ad aggiungerne uno ai miei progetti. Non mentirò - l'ho fatto di corsa senza alcuna idea su come dovesse essere fatto. E onestamente il risultato non era granché. <a href="https://github.com/larymak/ToDo-list-App/tree/v1.0">Guarda tu stesso</a>.</p><p>Ed è rimasto così per un periodo di tempo. Ma grazie alla pratica e all'apprendimento continuo ho imparato a realizzare migliori documentazioni come <a href="https://github.com/DjangoGirls/tutorial/blob/master/it/deploy/README.md">QUESTA</a>, il che ha migliorato la partecipazione con i progetti e ha aiutato altri sviluppatori a unirsi.</p><p>É anche importante sapere che un buon README ti aiuterà a farti notare in mezzo alla moltitudine di sviluppatori che pubblicano il loro lavoro su GitHub.</p><p>In questo articolo, impareremo cos'é un file README e come scriverne uno. Prima di tutto capiamo cosa si intende per "file README".</p><h2 id="cos-un-file-readme"><strong>Cos'é un file README?</strong></h2><p>In parole povere, possiamo definire un file README come una guida che dà a un utente una descrizione dettagliata di un progetto sul quale hai lavorato.</p><p>Può essere anche descritto come una documentazione con linee guida su come usare un progetto. Di solito contiene istruzioni su come installare ed eseguire un progetto.</p><p>É essenziale per te come sviluppatore sapere come documentare il tuo progetto scrivendo un README perché:</p><ul><li>É il primo file che una persona vedrà aprendo il tuo progetto, quindi dovrebbe essere piuttosto sintetico ma dettagliato.</li><li>Farà spiccare il tuo progetto tra gli altri. Ma assicurati che il progetto sia buono.</li><li>Ti aiuterà a definire cosa deve offrire il tuo progetto e come.</li><li>Migliorerà le tue abilità di scrittura, come disse Friedrich Nietzsche:</li></ul><blockquote><em>Un bravo scrittore non possiede solamente il suo spirito, ma anche lo spirito dei suoi amici.</em></blockquote><p>Mentre lavori a un progetto, tieni a mente che dovrai far capire cosa fa il tuo codice anche ad altri sviluppatori. Quindi affiancargli una guida sarà decisamente utile.</p><p>Ad esempio, il mio <a href="https://github.com/larymak/ToDo-list-App/tree/v1.0">primo progetto</a> mostrato in precedenza, non ha un buon README. E anche se il progetto era fantastico, sarebbe stato difficile per un principiante capire esattamente cosa aspettarsi quando avrebbero clonato il mio repo. Per lui sarebbe anche potuto essere un virus.</p><p>Con un progetto del genere su GitHub, non importa quanto sia ben fatto, gli altri sviluppatori non saranno disposti a capirlo e a lavorarci senza un buon README.</p><p>Ora, dai un'occhiata a questo <a href="https://github.com/larymak/Html-Css-Recap">progetto</a>. Qui, sei in grado di capire cosa fa il progetto, cosa prevede e come iniziare se hai bisogno di usare o contribuire al progetto.</p><p>Vedi, ecco quanto può essere utile un README ben strutturato e come può cambiare il tuo progetto.</p><p>Quindi, iniziamo a vedere come puoi scriverne uno.</p><h2 id="come-scrivere-un-buon-readme-una-guida-passo-passo"><strong>Come scrivere un buon README - una guida passo passo</strong></h2><p>Una cosa importante da sapere è che non c'è un modo migliore per strutturare un buon README. Ma c'è un modo sbagliatissimo, ed è non scriverlo affatto.</p><p>Studiando vari file README, naturalmente ho delle buone pratiche. E sono proprio queste che condividerò. Come dico sempre:</p><blockquote><em>Ogni giorno è un giorno in cui imparare<em>.</em></em></blockquote><p>Quindi andando avanti e progredendo nella tua carriera, svilupperai le tue idee su cosa rende ben strutturato un README e come migliorarlo. Magari un giorno scriverai una tua guida originale.</p><p>Prima di iniziare, è anche importante sapere che, quando scrivi il tuo README, dovresti essere in grado di rispondere al <strong>cosa</strong>, al <strong>perché</strong>, e al <strong>come </strong>del progetto.</p><p>Ecco qualche domanda che ti aiuterà:</p><ul><li>Qual è la tua motivazione?</li><li>Perché hai creato questo progetto?</li><li>Quale problema risolve?</li><li>Cosa hai imparato?</li><li>Cosa lo differenzia dagli altri?<br>Se il tuo progetto ha molte funzionalità, considera l'aggiunta di una sezione "Features" nella quale elencarle.</li></ul><h2 id="cosa-includere-nel-tuo-readme"><strong>Cosa includere nel tuo README</strong></h2><h3 id="1-titolo-del-progetto"><strong>1. Titolo del progetto</strong></h3><p>Questo è il nome del progetto. Descrive tutto il progetto in una frase e aiuta le persone a capire qual è<strong> </strong>l'obiettivo, ovvero a <strong>cosa </strong>punta il progetto.</p><h3 id="2-descrizione-del-progetto"><strong>2. Descrizione del progetto</strong></h3><p>Questa è una componente importante del progetto che molti sviluppatori inesperti tendono a sottovalutare.</p><p>La descrizione è un aspetto estremamente importante del tuo progetto. Una descrizione ben fatta ti permette di mostrare il tuo lavoro ad altri sviluppatori e a potenziali datori di lavoro.</p><p>La qualità di un buona descrizione è spesso la differenza tra un buon progetto ed un progetto carente. Uno buon README sfrutta la possibilità per spiegare e mostrare:</p><ul><li>Cosa fa la tua applicazione,</li><li>Perché hai utilizzato determinate tecnologie,</li><li>Alcune delle difficoltà che hai affrontato e le funzionalità che speri di aggiungere in futuro.</li></ul><h3 id="3-indice-facoltativo-"><strong>3. Indice (facoltativo)</strong></h3><p>Se il tuo README è molto lungo, forse è il caso di aggiungere un indice per rendere più semplice la navigazione tra le sezioni.</p><h3 id="4-come-installare-ed-eseguire-il-progetto"><strong>4. Come installare ed eseguire il progetto</strong></h3><p>Se stai lavorando su un progetto che l'utente deve installare o eseguire in locale in una macchina come un "POS", dovresti includere i passaggi per installare il tuo progetto ed anche le dipendenze, se ci sono.</p><p>Metti a disposizione una descrizione passo passo di come creare ed eseguire l'ambiente di sviluppo.</p><h3 id="5-come-usare-il-progetto"><strong>5. Come usare il progetto</strong></h3><p>Fornisci istruzioni ed esempi a utenti e collaboratori. Semplificherà loro la vita quando avranno un problema - avranno sempre un posto dove trovare cosa aspettarsi.</p><p>Puoi anche usare supporti visivi includendo materiale come screenshot per mostrare esempi del progetto in esecuzione o per mostrare la struttura e i principi di design usati nel tuo progetto.</p><p>Se il tuo progetto richiede autenticazioni come password e username, questa è una buona sezione nella quale includere le credenziali.</p><h3 id="6-includi-i-ringraziamenti-riferimenti"><strong>6. Includi i ringraziamenti/riferimenti</strong></h3><p>Se hai lavorato su un progetto con un team o un'organizzazione, elenca i tuoi collaboratori/compagni di squadra. Dovresti anche includere un link al loro profilo GitHub e/o ai loro social media.</p><p>Inoltre, se hai seguito tutorial o fatto riferimento ad alcuni materiali che potrebbero aiutare l'utente a costruire un particolare progetto, includi i link.</p><p>Questo è uno dei modi ringraziare ed aiutare gli altri a mettere mano su progetti simili.</p><h3 id="7-aggiungi-una-licenza"><strong>7. Aggiungi una licenza</strong></h3><p>Per la maggior parte dei file README, questo è solitamente considerata la parte finale. Permette agli altri sviluppatori di sapere cosa possono e non possono fare con il tuo progetto.</p><p>Esistono tipi di licenza diversi a seconda del tipo di progetto sul quale stai lavorando. A seconda di quella che sceglierai riceverai diversi tipi di contributi.</p><p>La più comune è la Licenza GPL che permette agli altri di modificare il tuo codice ed usarlo a scopi commerciali. Se hai bisogno di aiuto nello scegliere una licenza, dai un'occhiata a questo sito: <a href="https://choosealicense.com/">https://choosealicense.com/</a> (risorsa in lingua originale inglese).</p><p>Fino a questo punto abbiamo soddisfatto i requisiti minimi per un buon README. Ma potresti anche voler considerare di aggiungere le seguenti sezioni per renderlo più interattivo e accattivante.</p><h2 id="sezioni-readme-aggiuntive"><strong>Sezioni README aggiuntive</strong></h2><h3 id="8-badge"><strong>8. Badge</strong></h3><p>I badge non sono necessari, ma usarli è un modo semplice di far sapere agli altri sviluppatori che sai cosa stai facendo.</p><p>Avere questa sezione potrebbe anche essere utile per aiutare a linkare i tool più importanti e mostrare qualche statistica riguardante il tuo progetto come il numero di fork, collaboratori, issue aperte ecc.</p><p>Ecco uno screenshot di uno dei miei progetti che mostra come poter utilizzare i badge:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/check.png" class="kg-image" alt="badges" width="600" height="400" loading="lazy"></figure><p>Un lato positivo di questa sezione è che si aggiorna automaticamente.</p><p>Non sai da dove iniziare? Dai un'occhiata ai badge di <a href="https://shields.io/">shields.io</a>. Hanno un sacco di badge che possono aiutarti a iniziare. Potresti non capirli tutti, ma piano piano inizierai a riuscirci.</p><h3 id="9-come-contribuire-al-progetto"><strong>9. Come contribuire al progetto</strong></h3><p>Questo sarà utile soprattutto se stai sviluppando un progetto open-source nel quale avrai bisogno del contributo di altri sviluppatori. Dovrai aggiungere delle linee guida per far sapere loro come contribuire al tuo progetto.</p><p>É importante anche assicurarsi che la licenza che scegli per un progetto open-source sia corretta per evitare conflitti futuri. E l'aggiunta di linee guida ai contributi giocherà un ruolo importante.</p><p>Alcune delle linee guida più comuni includono il <a href="https://www.contributor-covenant.org/it/version/2/0/code_of_conduct/code_of_conduct.md">codice di comportamento del collaboratore</a> e la <a href="https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/setting-guidelines-for-repository-contributors">guida alla contribuzione</a>. Queste documentazioni ti daranno il supporto che ti serve quando imposterai le regole del tuo progetto.</p><h3 id="10-includi-i-test"><strong>10. Includi i test</strong></h3><p>Vai oltre e scrivi dei test per la tua applicazione. Dopodiché, fornisci esempi di codice e il modo per eseguirli.</p><p>Questo aiuterà a mostrare che sei certo e convinto che il tuo codice funzionerà senza difficoltà, il che darà fiducia anche agli altri.</p><h3 id="punti-extra"><strong>Punti extra</strong></h3><p>Ecco un altro paio di punti dei quali tenere conto mentre scrivi il tuo README:</p><ul><li>Mantienilo aggiornato - è una buona pratica assicurarsi che il tuo file sia aggiornato. In caso ci fossero modifiche assicurati di aggiornare il README se necessario.</li><li>Scegli una lingua - Veniamo tutti da diversi luoghi e parliamo lingue diverse. Ma questo non significa che tu debba tradurre il tuo codice in dialetto. Scrivere il tuo codice in inglese basta e avanza. Potresti aggiungere un sistema di traduzione in caso la tua audience non conoscesse l'inglese.</li></ul><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Ecco tutto ciò di cui hai bisogno per migliorare i tuoi file README, o addirittura iniziare a scrivere il primo.</p><p>A questo punto sono sicuro che tu sia nella posizione di aggiungere una guida interattiva ed informativa al tuo prossimo progetto o a uno già esistente in modo da farlo spiccare.</p><p>Ci sono molti strumenti che puoi usare per generare automaticamente un README, ma sarebbe meglio provare a farne qualcuno per conto tuo prima di passare ad automatizzare il processo. Nel caso volessi provarne qualcuno:</p><ul><li><a href="https://www.makeareadme.com/">Make a README</a></li><li><a href="https://rahuldkjain.github.io/gh-profile-readme-generator/">README Generator</a></li><li><a href="https://github.com/kefranabg/readme-md-generator">README</a></li></ul><p>Grazie per essere arrivato fino a qui. Se ti è piaciuto questo articolo, per favore condividilo in modo da aiutare altri sviluppatori a migliorare i loro progetti.</p><p>Mi piacerebbe vedere il tuo file README appena realizzato. Condividi il link attraverso uno dei seguenti canali:</p><p>Connettiti con me: <a href="https://twitter.com/larymak1">Twitter</a> | <a href="https://www.youtube.com/channel/UCrT1ARRZfLOuf6nc_97eXEg">YouTube</a> | <a href="https://www.linkedin.com/in/hillary-nyakundi-3a64b11ab/">LinkedIn</a> | <a href="https://github.com/larymak">GitHub</a></p><p>Condividi la tua opinione, apprezzo i feedback costruttivi!</p><p>Buona programmazione ❤</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ I SOLID(i) princìpi della programmazione orientata agli oggetti spiegati in parole povere ]]>
                </title>
                <description>
                    <![CDATA[ I princìpi SOLID sono cinque principi della progettazione di classi orientate agli oggetti. Sono una serie di regole e buone prassi da seguire mentre si progetta la struttura di una classe. Questi cinque princìpi ci aiutano a capire la necessità di seguire dei modelli di progettazione e architettura del software ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/i-solid-i-principi-della-programmazione-orientata-agli-oggetti-spiegati-in-parole-povere/</link>
                <guid isPermaLink="false">6320bdb89a423c074eb49418</guid>
                
                    <category>
                        <![CDATA[ programmazione orientata agli oggetti ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tiziano Caruana ]]>
                </dc:creator>
                <pubDate>Tue, 20 Sep 2022 11:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/solid.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The SOLID Principles of Object-Oriented Programming Explained in Plain English</a>
      </p><p>I princìpi SOLID sono cinque principi della progettazione di classi orientate agli oggetti. Sono una serie di regole e buone prassi da seguire mentre si progetta la struttura di una classe.</p><p>Questi cinque princìpi ci aiutano a capire la necessità di seguire dei modelli di progettazione e architettura del software in generale. Quindi, credo che questo sia un argomento che ogni sviluppatore dovrebbe imparare.</p><p>Questo articolo ti insegnerà tutto ciò di cui hai bisogno per applicare ai tuoi progetti i principi SOLID.</p><p>Inizieremo dando un'occhiata alla storia di questo termine. Dopodiché andremo ad approfondire i dettagli più importanti - i perché ed i come di ogni principio - progettando una classe e migliorandola passo dopo passo.</p><p>Ora prendi una tazza di caffe o tè e iniziamo!</p><h2 id="contesto"><strong>Contesto</strong></h2><p>I princìpi SOLID sono stati introdotti dal famoso informatico Robert J. Martin (o Uncle Bob) in un suo <a href="https://fi.ort.edu.uy/innovaportal/file/2032/1/design_principles.pdf">articolo</a> del 2000. Ma l'acronimo SOLID venne introdotto successivamente da Michael Feathers.</p><p>Uncle Bob è anche l'autore dei bestseller <em><em>Clean Code</em></em> e <em><em>Clean Architecture</em></em>, ed è uno dei membri della <a href="https://agilemanifesto.org/history.html">"Alleanza Agile"</a>.</p><p>Quindi, non è una sorpresa che tutti questi concetti di pulizia del codice, architettura orientata agli oggetti e modelli di progettazione siano in qualche modo connessi e complementari tra loro.</p><p>Hanno tutti lo stesso scopo:</p><blockquote>"Creare codice comprensibile, leggibile e testabile sul quale molti sviluppatori possano lavorare collaborativamente."</blockquote><p>Vediamo i principi uno ad uno. Seguendo l'acronimo SOLID, sono:</p><ul><li><a href="#il-principio-di-singola-responsabilit-srp-">The <strong><strong>S</strong></strong>ingle Responsibility Principle - Il principio di singola responsabilità</a></li><li><a href="#il-principio-aperto-chiuso-ocp-">The <strong><strong>O</strong></strong>pen-Closed Principle - Il principio aperto/chiuso</a></li><li><a href="#il-principio-di-sostituzione-di-liskov-lsp-">The <strong><strong>L</strong></strong>iskov Substitution Principle - Il principio di sostituzione di Liskov</a></li><li><a href="#il-principio-di-segregazione-delle-interfacce-isp-">The <strong><strong>I</strong></strong>nterface Segregation Principle - Il principio di segregazione delle interfacce</a></li><li><a href="#il-principio-di-inversione-delle-dipendenze-dip-">The <strong><strong>D</strong></strong>ependency Inversion Principle - Il principio di inversione delle dipendenze</a></li></ul><h2 id="il-principio-di-singola-responsabilit-srp-"><strong>Il principio di singola responsabilità (SRP)</strong></h2><p>Il principio di singola responsabilità stabilisce che <strong>una classe deve fare solo una cosa e quindi avere un solo motivo per cambiare</strong>.</p><p>Per chiarire questo principio in modo più tecnico: le specifiche della classe dovrebbero essere influenzate da una sola potenziale modifica (logica del database, logica d'accesso, e così via.) nelle specifiche del software.</p><p>Questo significa che se una classe è un contenitore di dati, come una classe Libro o una classe Studente, e ha alcuni campi riguardanti tale entità, questa deve cambiare solo quando cambiamo quel modello di dati.</p><p>Seguire il principio di singola responsabilità è importante. Prima di tutto, molti team differenti possono lavorare sullo stesso progetto e modificare le stesse classi per motivi diversi, e ciò potrebbe portare a moduli incompatibili.</p><p>Secondo, rende il controllo delle versioni più semplice. Per esempio, ipotizziamo di avere una classe di persistenza che gestisce le operazioni sul database, e vediamo una modifica apportata su quel file dai commit di GitHub. Seguendo l'SRP, sapremo che il file è inerente alla memorizzazione o gestione del database.</p><p>I conflitti di merge sono un altro esempio. Appaiono quando team diversi modificano lo stesso file. Ma se l'SRP viene seguito, ci saranno meno conflitti - i file avranno solo un motivo di essere modificati, e i conflitti che esisteranno saranno più semplici da risolvere.</p><h3 id="errori-comuni-e-anti-pattern"><strong>Errori comuni e anti-pattern</strong></h3><p>In questa sezione, vedremo alcuni errori comuni che violano il principio di responsabilità singola. Poi vedremo come correggere il codice.</p><p>Daremo un'occhiata al codice di un semplice programma di fatturazione di una libreria. Iniziamo definendo la classe <code>Libro</code>.</p><pre><code class="language-java">class Libro {
    String nome;
    String nomeAutore;
    int anno;
    int prezzo;
    String isbn;

    public Libro(String nome, String nomeAutore, int anno, int prezzo, String isbn) {
        this.nome = nome;
        this.nomeAutore = nomeAutore;
        this.anno = anno;
        this.prezzo = prezzo;
        this.isbn = isbn;
    }
}</code></pre><p>Questa è una semplice classe <code>Libro</code> con qualche campo, nulla di che. Non sto rendendo i campi privati in modo da non dover avere a che fare con getter e setter e concentrarmi più sulla logica.</p><p>Ora creiamo la classe di fatturazione che conterrà la logica di creazione della ricevuta e del calcolo del prezzo totale. Per ora, ipotizziamo che la nostra libreria venda solo libri e null'altro.</p><pre><code class="language-java">public class Ricevuta {

	private Libro libro;
	private int quantita;
	private double scontoPercentuale;
	private double tassaPercentuale;
	private double totale;

	public Invoice(Libro libro, int quantita, double scontoPercentuale, double tassaPercentuale) {
		this.libro = libro;
		this.quantita = quantita;
		this.scontoPercentuale = scontoPercentuale;
		this.tassaPercentuale = tassaPercentuale;
		this.totale = this.calcolaTotale();
	}

	public double calcolaTotale() {
	        double prezzo = ((libro.prezzo - libro.prezzo * scontoPercentuale) * this.quantita);

		double prezzoConTasse = prezzo * (1 + tassaPercentuale);

		return prezzoConTasse;
	}

	public void stampaRicevuta() {
            System.out.println(quantita + "x " + libro.nome + " " +          libro.prezzo + "€");
            System.out.println("Percentuale di sconto: " + scontoPercentuale);
            System.out.println("Percentuale di tasse: " + tassaPercentuale);
            System.out.println("Totale: " + totale);
	}

        public void salvaNelFile(String nomefile) {
	// Crea un file con il nome fornito e scrive la ricevuta
	}

}</code></pre><p>Ed ecco la classe di fatturazione. Contiene anche alcuni campi riguardanti la ricevuta e 3 metodi:</p><ul><li>Metodo<strong> <code>calcolaTotale</code></strong>, che calcola il prezzo totale,</li><li>Metodo <strong><code>stampaRicevuta</code></strong>, che stampa la ricevuta sulla console, </li><li>Metodo <strong><code>salvaNelFile</code></strong>, che scrive la ricevuta su un file.</li></ul><p>Prenditi un attimo per pensare a cosa è sbagliato nel modello di questa classe prima di passare al prossimo paragrafo.</p><p>Ok, quindi qual è il problema? La nostra classe infrange il principio di singola responsabilità in diversi modi.</p><p>La prima violazione è il metodo <strong><code>stampaRicevuta</code></strong>, che contiene la nostra logica di stampa. L'SRP afferma che la nostra classe dovrebbe avere un solo motivo per cambiare, e in questo caso quella ragione dovrebbe essere il calcolo della ricevuta.</p><p>Ma con questa architettura, se volessimo cambiare il formato di stampa, avremmo bisogno di modificare la classe. Ecco perché non dovremmo mischiare la logica di stampa con la logica di business nella stessa classe.</p><p>C'è anche un altro metodo che viola l'SRP nella nostra classe: il metodo <strong><code>salvaNelFile</code></strong>. Mischiare la logica di persistenza dei dati e la logica di business è un errore estremamente comune.</p><p>Non pensare solo alla scrittura su file - potrebbe essere il salvataggio in un database, fare una chiamata a un'API, o altre cose legate alla persistenza dei dati.</p><p>Quindi ti chiederai come possiamo sistemare questa funzione di stampa.</p><p>Possiamo creare nuove classi per la nostra logica di stampa e di persistenza dei dati, in modo da non dover più modificare la classe di fatturazione per quegli scopi.</p><p>Creiamo 2 classi, <strong><code>StampaFattura</code> </strong>e <strong><code>MemorizzaFattura</code><strong>,</strong></strong> e spostiamo i metodi.</p><pre><code class="language-java">public class stampaFattura {
    private Fattura fattura;

    public stampaFattura(Fattura fattura) {
        this.fattura = fattura;
    }

    public void print() {
        System.out.println(fattura.quantita + "x " + fattura.libro.nome + " " + fattura.libro.prezzo + " €");
        System.out.println("Percentuale di sconto: " + fattura.scontoPercentuale);
        System.out.println("Percentuale di tasse: " + fattura.tassaPercentuale);
        System.out.println("Totale: " + fattura.totale + " €");
    }
}</code></pre><pre><code class="language-java">public class MemorizzaFattura {
    Fattura fattura;

    public MemorizzaFattura(Fattura fattura) {
        this.fattura = fattura;
    }

    public void salvaNelFile(String nomefile) {
        // Crea un file con il nome fornito e scrive la ricevuta
    }
}</code></pre><p>Ora la struttura della nostra classe rispetta il principio di responsabilità singola e ogni classe è responsabile di una sola porzione della nostra applicazione. Grandioso!</p><h2 id="il-principio-aperto-chiuso-ocp-">Il principio aperto/chiuso (OCP)</h2><p>Il principio aperto/chiuso stabilisce che <strong>le classi debbano essere aperte alle estensioni e chiuse alle modifiche<strong>.</strong></strong></p><p>Per modifica si intende il cambiamento del codice di una classe esistente, ed estensione significa aggiungere nuove funzionalità.</p><p>Questo principio sta a significare che dovremmo essere in grado di aggiungere nuove funzionalità senza toccare il codice attuale della classe. Questo perché ogni volta che modifichiamo il codice, rischiamo di dare vita a potenziali bug. Quindi dovremmo evitare di toccare un codice di produzione testato e affidabile dove possibile.</p><p>Potresti chiederti come fare ad aggiungere nuove funzionalità senza modificare la classe. Di solito, questo avviene con l'aiuto di interfacce e classi astratte.</p><p>Ora che abbiamo coperto le basi del principio, applichiamolo alla nostra applicazione di fatturazione.</p><p>Ipotizziamo che il nostro capo sia venuto da noi chiedendoci di salvare le fatture su un database, in modo che possano essere ricercate facilmente. Pensiamo: ok, facilissimo capo, dammi un secondo!</p><p>Creiamo il database, ci connettiamo e aggiungiamo un metodo di salvataggio alla nostra classe <strong><code>MemorizzaFattura</code></strong>:</p><pre><code class="language-java">public class MemorizzaFattura {
    Fattura fattura;

    public MemorizzaFattura(Fattura fattura) {
        this.fattura = fattura;
    }

    public void salvaNelFile(String nomefile) {
        // Crea un file con il nome fornito e scrive la ricevuta
    }

    public void salvaNelDatabase() {
        // Salva la fattura nel database
    }
}</code></pre><p>Sfortunatamente, proprio come lo sviluppatore pigro della libreria, non abbiamo costruito la classe in modo che sia facilmente estendibile nel futuro. Quindi per aggiungere questa funzionalità, abbiamo modificato la classe <strong><code>MemorizzaFattura</code></strong>.</p><p>Se il modello della nostra classe seguisse il principio aperto/chiuso non avremmo avuto bisogno di modificare questa classe.</p><p>Quindi, come farebbe lo sviluppatore pigro ma intelligente della libreria, notiamo il problema d'architettura e decidiamo di riscrivere il codice per fare in modo che rispetti il principio.</p><pre><code class="language-java">interface MemorizzaFattura {

    public void salva(Fattura fattura);
}</code></pre><p>Cambiamo il tipo di <strong><code>MemorizzaFattura</code> </strong>in Interfaccia e aggiungiamo il metodo <code>salva</code>. Ogni classe di persistenza implementerà il metodo <code>salva</code>.</p><pre><code class="language-java">public class PersistenzaDatabase implements MemorizzaFattura {

    @Override
    public void salva(Fattura fattura) {
        // Salva sul DB
    }
}</code></pre><pre><code class="language-java">public class PersistenzaFile implements MemorizzaFattura {

    @Override
    public void salva(Fattura fattura) {
        // Salva su file
    }
}</code></pre><p>Quindi la struttura della nostra classe appare così:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/09/temp.png" class="kg-image" alt="SOLID-Tutorial-1-1024x554" width="471" height="301" loading="lazy"></figure><p>Ora la nostra logica di persistenza è facilmente estendibile. Se il nostro capo ci chiede di aggiungere un altro database e avere 2 diversi tipi di database come MySQL e MongoDB, possiamo farlo facilmente.</p><p>Potresti pensare che potremmo semplicemente creare classi multiple senza interfacce e aggiungere un metodo salva a tutte queste classi.</p><p>Ma immaginiamo di voler estendere la nostra app e avere classi di persistenza multiple come <strong><code>MemorizzaFattura</code></strong>, <strong><code>MemorizzaLibro</code> </strong>e creiamo la classe <strong><code>GestionePersistenza</code> </strong>che gestisce tutte le classi di memorizzazione:</p><pre><code class="language-java">public class GestionePersistenza {
    MemorizzaFattura memorizzaFattura;
    MemorizzaLibro memorizzaLibro;
    
    public GestionePersistenza(MemorizzaFattura memorizzaFattura,
                              MemorizzaLibro memorizzaLibro) {
        this.memorizzaFattura = memorizzaFattura;
        this.memorizzaLibro = memorizzaLibro;
    }
}</code></pre><p>Ora possiamo passare qualsiasi classe che implementa l'interfaccia <strong><code>MemorizzaFattura</code></strong> a questa classe con l'aiuto del polimorfismo. Questa è la flessibilità che ci offrono le interfacce.</p><h2 id="il-principio-di-sostituzione-di-liskov-lsp-"><strong>Il principio di sostituzione di Liskov (LSP)</strong></h2><p>Il principio di sostituzione di Liskov stabilisce che le sottoclassi debbano essere sostituibili dalle loro classi d'origine.</p><p>Questo significa che, data una classe B, sottoclasse di una classe A, dobbiamo essere in grado di passare un oggetto della classe B a qualsiasi metodo che si aspetti un oggetto della classe A, senza che il metodo restituisca un output inatteso.</p><p>Questo è il comportamento previsto, perché quando usiamo l'ereditarietà diamo per scontato che la classe figlia erediti tutto quello che ha la superclasse. La classe figlia estende il comportamento senza mai limitarlo.</p><p>Quindi, quando una classe non rispetta questo principio, porta ad alcuni sgradevoli bug difficili da identificare.</p><p>Il principio di Liskov è facile da capire ma difficile da trovare nel codice. Quindi diamo un'occhiata a un esempio.</p><pre><code class="language-java">class Rettangolo {
	protected int larghezza, altezza;

	public Rettangolo() {
	}

	public Rettangolo(int larghezza, int altezza) {
		this.larghezza = larghezza;
		this.altezza = altezza;
	}

	public int getLarghezza() {
		return larghezza;
	}

	public void setLarghezza(int larghezza) {
		this.larghezza = larghezza;
	}

	public int getAltezza() {
		return altezza;
	}

	public void setAltezza(int altezza) {
		this.altezza = altezza;
	}

	public int getArea() {
		return larghezza * altezza;
	}
}</code></pre><p>Abbiamo una semplice classe <code>Rettangolo</code>, e una funzione <strong><strong><code>getArea</code></strong> </strong>che restituisce l'area del rettangolo.</p><p>Ora decidiamo di creare un'altra classe per i quadrati. Come saprai, il quadrato è solamente un rettangolo con altezza e larghezza uguali.</p><pre><code class="language-java">class Quadrato extends Rettangolo {
	public Quadrato() {}

	public Quadrato(int lato) {
		larghezza = altezza = lato;
	}

	@Override
	public void setLarghezza(int larghezza) {
		super.setLarghezza(larghezza);
		super.setAltezza(larghezza);
	}

	@Override
	public void setAltezza(int altezza) {
		super.setAltezza(altezza);
		super.setLarghezza(altezza);
	}
}</code></pre><p>La nostra classe <code>Quadrato</code> estende la classe <code>Rettangolo</code>. Impostiamo l'altezza e la larghezza con lo stesso valore nel costruttore, ma non vogliamo che un utente cambi altezza o larghezza in modo da violare le proprietà del quadrato.</p><p>Quindi sovrascriviamo i setter in modo da impostare entrambe le proprietà, ogni volta che ne viene modificata una. Facendo questo violiamo il principio di sostituzione di Liskov.</p><p>Creiamo una classe main per effettuare dei test sulla funzione <strong><strong><code>getArea</code></strong></strong>.</p><pre><code class="language-java">class Test {

   static void getAreaTest(Rettangolo r) {
      int larghezza = r.getLarghezza();
      r.setAltezza(10);
      System.out.println("Risultato previsto " + (larghezza * 10) + ", ottenuto " + r.getArea());
   }

   public static void main(String[] args) {
      Rettangolo rc = new Rettangolo(2, 3);
      getAreaTest(rc);

      Rettangolo sq = new Quadrato();
      sq.setLarghezza(5);
      getAreaTest(sq);
   }
}</code></pre><p>Il tester del tuo team ha appena creato la funzione di test <strong><strong><code>getAreaTest</code> </strong></strong>e ti dice che la tua funzione <strong><strong><code>getArea</code> </strong></strong>non ha passato il test per i quadrati.</p><p>Nel primo test, creiamo un rettangolo di larghezza 2 ed altezza 3 e chiamiamo <strong><strong><code>getAreaTest</code></strong></strong>. L'output è 20 come previsto, ma le cose vanno male se passiamo un quadrato. Questo perché la chiamata della funzione <strong><code><strong>set</strong>Altezza</code><strong> </strong></strong>del test sta impostando anche la larghezza, restituendoci un risultato inaspettato.</p><h2 id="il-principio-di-segregazione-delle-interfacce-isp-"><strong>Il principio di segregazione delle interfacce (ISP)</strong></h2><p>Segregare significa tenere delle cose separate, e il principio di segregazione delle interfacce si occupa di separare le interfacce.</p><p>Il principio stabilisce che avere interfacce specifiche per ogni client è meglio di avere un'interfaccia di uso generico. I client non dovrebbero essere forzati a implementare funzioni di cui non hanno bisogno.</p><p>Questo è un principio semplice da capire e applicare, vediamo un esempio.</p><pre><code class="language-java">public interface Parcheggio {

	void parcheggiaAuto();	// Diminuisce parcheggi vuoti di 1
	void esceAuto(); // Aumenta parcheggi vuoti di 1
	void getCapienza();	// Restituisce capienza auto
	double calcolaQuota(Auto auto); // Restituisce il prezzo in base al numero di ore
	void faiPagamento(Auto auto);
}

class Auto {

}</code></pre><p>Abbiamo modellato un parcheggio molto semplificato. Questo è un tipo di parcheggio nel quale paghi una quota oraria. Ora immagina di voler implementare un parcheggio gratuito.</p><pre><code class="language-java">public class ParcheggioGratis implements Parcheggio {

	@Override
	public void parcheggiaAuto() {
		
	}

	@Override
	public void esceAuto() {

	}

	@Override
	public void getCapienza() {

	}

	@Override
	public double calcolaQuota(Auto auto) {
		return 0;
	}

	@Override
	public void faiPagamento(Auto auto) {
		throw new Exception("Il parcheggio è libero");
	}
}</code></pre><p>Il nostro parcheggio è composto da 2 cose: la logica relativa al parcheggio (auto parcheggia, auto esce, ottieni capienza) e logica relativa al pagamento.</p><p>Ma è troppo specifico e a causa di questo, la classe <code>ParcheggioGratis</code> ha dovuto implementare i metodi relativi al pagamento che sono irrilevanti. Quindi separiamo/segreghiamo le interfacce.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/09/temp-1.png" class="kg-image" alt="SOLID-Tutorial-1024x432" width="561" height="241" loading="lazy"></figure><p>Ora abbiamo separato i parcheggi. Con questo nuovo modello, possiamo anche andare oltre e dividere <strong><code>ParcheggioPagamento</code><strong> </strong></strong>per supportare diverse modalità di pagamento.</p><p>Ora il nostro modello è molto più flessibile, estendibile e i client non hanno bisogno di implementare alcuna logica irrilevante visto che forniamo solo funzionalità relative al tipo specifico di parcheggio nelle varie interfacce.</p><h2 id="il-principio-di-inversione-delle-dipendenze-dip-"><strong>Il principio di inversione delle dipendenze (DIP)</strong></h2><p>Il principio di inversione delle dipendenze stabilisce che le classi debbano dipendere da interfacce o classi astratte invece che da classi concrete e funzioni.</p><p>Nel suo <a href="https://fi.ort.edu.uy/innovaportal/file/2032/1/design_principles.pdf">articolo </a>(2000), Uncle Bob riassume il principio così:</p><blockquote>"Se l' OCP stabilisce l'obiettivo dell'architettura orientata agli oggetti, il DIP ne stabilisce il meccanismo primario".</blockquote><p>Questi due principi sono legati ed abbiamo applicato questo schema mentre stavamo discutendo del principio aperto/chiuso.</p><p>Vogliamo che le nostre classi siano aperte all'estensione, quindi abbiamo riorganizzato le dipendenze in modo da dipendere da interfacce invece che da classi concrete. La nostra classe <code>GestionePersistenza</code> dipende da <code>MemorizzaFattura</code>, e non dalle classi che implementano questa interfaccia.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo, abbiamo iniziato con la storia dei principi SOLID, per poi tentare di acquisire una chiara comprensione delle ragioni dietro a ogni principio e come implementarli. Abbiamo addirittura riscritto una semplice applicazione di fatturazione per farle rispettare i principi SOLID.</p><p>Grazie per aver speso il tuo tempo leggendo l'intero articolo. Spero che i concetti espressi siano chiari.</p><p>Ti consiglio di tenere questi principi a mente mentre progetti, scrivi e riscrivi i tuoi codici in modo da avere un codice molto più pulito, estendibile e testabile.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 25 Progetti in Python per principianti – Idee per iniziare a programmare in Python ]]>
                </title>
                <description>
                    <![CDATA[ Il miglior modo per imparare un nuovo linguaggio di programmazione è usarlo per realizzare dei progetti. Ho creato una lista di 25 video tutorial (in lingua inglese) per realizzare progetti in Python per principianti. Il mio consiglio è di guardare il video, costruire il progetto, dividerlo in sezioni e ricostruirlo ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/25-progetti-in-python-per-principianti-idee-per-iniziare-a-programmare-in-python/</link>
                <guid isPermaLink="false">631b62229a423c074eb485ac</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tiziano Caruana ]]>
                </dc:creator>
                <pubDate>Mon, 12 Sep 2022 13:36:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/hitesh-choudhary-D9Zow2REm8U-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/python-projects-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">25 Python Projects for Beginners – Easy Ideas to Get Started Coding Python</a>
      </p><p>Il miglior modo per imparare un nuovo linguaggio di programmazione è usarlo per realizzare dei progetti.</p><p>Ho creato una lista di 25 video tutorial (in lingua inglese) per realizzare progetti in Python per principianti.</p><p>Il mio consiglio è di guardare il video, costruire il progetto, dividerlo in sezioni e ricostruirlo a modo tuo. Sperimenta aggiungendo nuove funzionalità o usando metodologie differenti.</p><p>In questo modo capirai se avrai veramente appreso i concetti o meno.</p><p>Puoi cliccare su un progetto qualsiasi di quelli elencati qui sotto per essere reindirizzato nella relativa sezione dell'articolo.</p><p>Se non hai familiarità con le basi di Python, suggerisco di guardare <a href="https://www.youtube.com/watch?v=rfscVS0vtbw">questa guida di freeCodeCamp su Python per principianti</a>. In alternativa, puoi consultare il <a href="https://www.freecodecamp.org/italian/news/manuale-python-per-principianti/">Manuale Python per principianti</a> (in italiano).</p><h2 id="progetti-in-python-che-puoi-realizzare">Progetti in Python che puoi realizzare</h2><!--kg-card-begin: markdown--><ul>
<li><a href="#parole-matte-mad-libs-in-python">Parole matte (Mad Libs) in Python</a></li>
<li><a href="#indovina-il-numero-in-python-computer-">Indovina il numero in Python (computer)</a></li>
<li><a href="#indovina-il-numero-in-python-utente-">Indovina il numero in Python (utente)</a></li>
<li><a href="#sasso-carta-forbice-in-python">Sasso, carta, forbice in Python</a></li>
<li><a href="#l-impiccato-in-python">L'impiccato in Python</a></li>
<li><a href="#conto-alla-rovescia-in-python">Conto alla rovescia in Python</a></li>
<li><a href="#generatore-di-password-in-python">Generatore di password in Python</a></li>
<li><a href="#codifica-decodifica-di-codici-qr-in-python">Codifica/decodifica di codici QR in Python</a></li>
<li><a href="#tris-in-python">Tris in Python</a></li>
<li><a href="#tris-con-intelligenza-artificiale-in-python">Tris con Intelligenza Artificiale in Python</a></li>
<li><a href="#ricerca-binaria-in-python">Ricerca binaria in Python</a></li>
<li><a href="#campo-minato-in-python">Campo minato in Python</a></li>
<li><a href="#risolutore-di-sudoku-in-python">Risolutore di sudoku in Python</a></li>
<li><a href="#manipolazione-di-foto-in-python">Manipolazione di foto in Python</a></li>
<li><a href="#compositore-testuale-di-catene-di-markov-in-python">Compositore testuale di catene di Markov in Python</a></li>
<li><a href="#pong-in-python">Pong in Python</a></li>
<li><a href="#snake-in-python">Snake in Python</a></li>
<li><a href="#forza-quattro-in-python">Forza quattro in Python</a></li>
<li><a href="#tetris-in-python">Tetris in Python</a></li>
<li><a href="#gioco-multigiocatore-online-in-python">Gioco multigiocatore online in Python</a></li>
<li><a href="#web-scraper-in-python">Web Scraper in Python</a></li>
<li><a href="#rinominatore-di-file-in-massa-in-python">Rinominatore di file in massa in Python</a></li>
<li><a href="#programma-meteorologico-in-python">Programma meteorologico in Python</a></li>
<li><a href="#sviluppa-un-bot-di-discord-con-python">Sviluppa un bot di Discord con Python</a></li>
<li><a href="#space-invaders-in-python">Space Invaders in Python</a></li>
</ul>
<!--kg-card-end: markdown--><h2 id="parole-matte-mad-libs-in-python">Parole matte (Mad Libs) in Python</h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=100s">In questo video di Kylie Ying</a>, imparerai come ottenere degli input da un utente, lavorare con le f-strings e vedere i risultati sulla console.</p><p>Questo progetto è un ottimo punto di partenza per prendere mano con la concatenazione di stringhe in Python.</p><h2 id="indovina-il-numero-computer-in-python">Indovina il numero (computer) in Python</h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=414s">In questo video di Kylie Ying, </a>imparerai a lavorare con <a href="https://docs.python.org/3/library/random.html">il modulo random di Python</a>, costruire funzioni, usare i loop while e i condizionali, e ottenere degli input da un utente.</p><h2 id="indovina-il-numero-utente-in-python">Indovina il numero (utente) in Python</h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=797s">In questo video di Kylie Ying, </a>costruirai un indovinello nel quale il computer dovrà indovinare il numero corretto. Lavorerai con <a href="https://docs.python.org/3/library/random.html">il modulo random di Python</a>, costruirai funzioni, lavorerai con i loop while e i condizionali, e otterrai degli input da un utente.</p><h2 id="sasso-carta-forbice-in-python">Sasso, carta, forbice in Python</h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=1274s">In questo video di Kylie Ying</a>, lavorerai con <code>random.choice()</code>, istruzioni if e otterrai degli input da un utente. Questo è un ottimo progetto per imparare a utilizzare principi fondamentali come condizionali e funzioni.</p><h2 id="l-impiccato-in-python"><strong>L'impiccato in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=1465s">In questo video di Kylie Ying,</a> lavorerai con i dizionari, le liste e le istruzioni if annidate. Lavorerai anche con le stringhe e <a href="https://docs.python.org/3/library/random.html">il modulo random di Python</a>.</p><h2 id="conto-alla-rovescia-in-python"><strong>Conto alla rovescia in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=1992s">In questo video di Code With Tomi</a>, costruirai un conto alla rovescia grazie al modulo <code>time</code> di Python. Questo è un ottimo progetto per familiarizzare con i loop while in Python.</p><h2 id="generatore-di-password-in-python"><strong>Generatore di password in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=2531s">In questo video di Code With Tomi</a>, costruirai un generatore di password casuale. Otterrai dati dall'utente sul numero di password da generare e la loro lunghezza ed il tuo programma produrrà una collezione di password con caratteri casuali.</p><p>Questo progetto ti impratichirà nell'utilizzo dei loop <code>for</code> e del <a href="https://docs.python.org/3/library/random.html">modulo <code>random</code> di Python</a>.</p><h2 id="codifica-decodifica-di-codici-qr-in-python">Codifica/decodifica di codici QR<strong> in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=3192s">In questo video di Code With Tomi</a>, creerai i tuoi codici QR e codificherai/decodificherai informazioni da essi. Questo progetto utilizza la libreria <code>qrcode</code>.</p><p>Questo è un ottimo progetto per prendere familiarità con l'installazione e l'utilizzo di diversi moduli Python.</p><h2 id="tris-in-python"><strong>Tris in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=2153s">In questo video di Kylie Ying, </a>svilupperai un tris a più giocatori su riga di comando. Imparerai a lavorare con i moduli Python <code>time</code> e <code>math</code> e ti eserciterai con le istruzioni if annidate.</p><h2 id="tris-con-intelligenza-artificiale-in-python">Tris con Intelligenza Artificiale in Python</h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=3599s">In questo video di Kylie Ying</a>, svilupperai un programma per giocare partite di tris contro un computer che non perde mai. Questo progetto utilizza l'algoritmo minimax, un algoritmo ricorsivo utilizzato per i processi decisionali.</p><h2 id="ricerca-binaria-in-python"><strong>Ricerca binaria in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=4553s">In questo video di Kylie Ying</a>, implementerai l'algoritmo <em>divide et impera</em> chiamato ricerca binaria. È un comune algoritmo di ricerca spesso utilizzato nei colloqui di lavoro, quindi importante da saper implementare. </p><h2 id="campo-minato-in-python"><strong>Campo minato in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=5236s">In questo video di Kylie Ying</a>, svilupperai il classico gioco campo minato su riga di comando. Questo progetto si concentra sulla ricorsività e le classi.</p><h2 id="risolutore-di-sudoku-in-python"><strong>Risolutore di sudoku in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=6715s">In questo video di Kylie Ying</a>, svilupperai un risolutore di Sudoku che utilizza la tecnica backtracking. Il backtracking è una tecnica ricorsiva che cerca ogni possibile combinazione per risolvere un problema.</p><h2 id="manipolazione-di-foto-in-python"><strong>Manipolazione di foto in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=7534s">In questo video di Kylie Ying</a>, creerai un filtro per immagini e cambierai contrasto, luminosità e sfocatura di immagini. Prima di iniziare il progetto, dovrai scaricare i <a href="https://github.com/kying18/pyphotoshop">file di partenza</a>.</p><h2 id="compositore-testuale-di-catene-di-markov-in-python">Compositore testuale di catene di Markov in Python</h2><p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=9109s">In questo video di Kylie Ying</a>, imparerai cos'è il modello grafico della catena di Markov e come può essere applicato alle relazioni tra testi di diverse canzoni. Questo progetto è un'ottima introduzione all'intelligenza artificiale in Python.</p><h2 id="pong-in-python"><strong>Pong in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=78s">In questo video di Christian Thompson</a>, ricreerai il classico videogioco pong in Python. Lavorerai con i moduli Python &nbsp;<code>os</code> e <code>turtle</code>, perfetti per creare grafiche di videogiochi.</p><h2 id="snake-in-python"><strong>Snake in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=2736s">In questo video di Tech with Tim</a>, ricreerai il classico videogioco snake in Python. Questo progetto si basa sulla programmazione orientata agli oggetti e Pygame, un popolare modulo Python per lo sviluppo di videogiochi.</p><h2 id="forza-quattro-in-python">Forza quattro in Python</h2><p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=5697s">In questo video di Keith Galli</a>, costruirai il classico gioco forza quattro in Python. Questo progetto utilizza i moduli Python <code>numpy</code>, <code>math</code>, <code>pygame</code> e <code>sys</code>.</p><p>È un ottimo progetto se hai già sviluppato altri progetti più piccoli in Python. Ma se non hai ancora creato alcun progetto in Python, consiglierei vivamente di iniziare con uno dei progetti citati precedentemente nella lista ed esercitarti un po' prima di tornare su questo.</p><h2 id="tetris-in-python"><strong>Tetris in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=9756s">In questo video di Tech with Tim</a>, ricreerai il classico videogioco Tetris. In questo progetto utilizzerai Pygame ed è ottimo per i programmatori principianti che vogliono portare le proprie conoscenze al livello successivo.</p><h2 id="gioco-multigiocatore-online-in-python"><strong>Gioco multigiocatore online in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=15732s">In questo video di Tech with Tim</a>, svilupperai un videogioco multiplayer che potrai giocare con chiunque abbia una connessione internet. Questo progetto è un'ottima introduzione a socket, reti e Pygame.</p><h2 id="web-scraper-in-python"><strong>Web Scraper in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=37s">In questo video di Code With Tomi</a>, imparerai come richiedere come input a un utente un link di un utente GitHub e produrre come output il link dell'immagine del profilo grazie al web scraping. Il web scraping è una tecnica che ti permette di raccogliere dati da una pagina web.</p><h2 id="rinominatore-di-file-in-massa-in-python">Rinominatore di file in massa in Python</h2><p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=833s">In questo video di Code With Tomi</a>, svilupperai un programma in grado di entrare in qualsiasi cartella del tuo computer e rinominare tutti i file in base a delle condizioni impostate dal tuo codice Python.</p><h2 id="programma-meteorologico-in-python"><strong>Programma meteorologico in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=1494s">In questo video di Code With Tomi</a>, svilupperai un programma in grado di raccogliere dati su una specifica località e produrre dettagli sulle previsioni per la località in questione. Questo è un ottimo progetto per imparare a ottenere dati da delle API.</p><h2 id="sviluppa-un-bot-di-discord-con-python">Sviluppa un bot di Discord con Python</h2><p><a href="https://www.youtube.com/watch?v=SPTfmiYiuok">In questo video di Beau Carnes</a>, svilupperai il tuo bot di Discord, una piattaforma dove le persone possono parlare e scriversi online. In questo progetto lavorerai con l'API di Discord e l'ambiente di sviluppo Replit.</p><p>Dopo la pubblicazione di questo video, Replit ha cambiato modo di memorizzare le variabili d'ambiente nei tuoi programmi. Leggi <a href="https://forum.freecodecamp.org/t/steps-on-how-to-setup-environment-variable-for-fcc-python-bot-tutorial/473303">questa guida</a> su come immagazzinare le variabili d'ambiente in modo corretto.</p><p><em>Nota: a causa di alcuni aggiornamenti di Discord, occorre fare degli aggiustamenti per far funzionare correttamente il bot.</em></p><h2 id="space-invaders-in-python"><strong>Space Invaders in Python</strong></h2><p><a href="https://www.youtube.com/watch?v=FfWpgLFMI7w">In questo video di buildwithpython</a>, svilupperai il classico gioco space invaders usando Pygame. Apprenderai le basi dello sviluppo di videogiochi come loop, rilevamento di collisioni, eventi legati alla pressione dei tasti e altro.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
