From 55d0ed4285b6c7771bb1536ffcd4b17f79d9aa8a Mon Sep 17 00:00:00 2001 From: Francesco Colonna Date: Sat, 13 Oct 2018 16:46:43 +0200 Subject: [PATCH 1/4] typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7b141c6e..d956d2d3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 1. [Introduzione](#introduzione) 2. [Variabili](#variabili) 3. [Funzioni](#funzioni) - 4. [Ogetti e strutture dati](#objects-and-data-structures) + 4. [Oggetti e strutture dati](#oggetti-e-strutture-dati) 5. [Classi](#Classi) 6. [SOLID](#solid) 7. [Test](#Test) @@ -852,7 +852,7 @@ inventoryTracker('apples', req, 'www.inventory-awesome.io'); ``` **[⬆ torna su](#lista-dei-contenuti)** -## **Ogetti e strutture dati** +## **Oggetti e strutture dati** ### Utilizza getter e setter Utilizzare getter e setter per acceedere ai dati di un oggetto può essere meglio che accedere direttamente alle sue proprietà. Ti starai sicuramente chiedendo il motivo. Eccoti qualche motivo per cui utilizzare getter e setter: From 61e51a78be6c9268f3fa8f36e7c1110c4e55769e Mon Sep 17 00:00:00 2001 From: Francesco Colonna Date: Sat, 13 Oct 2018 16:50:34 +0200 Subject: [PATCH 2/4] typo --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d956d2d3..147da2ad 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,14 @@ 2. [Variabili](#variabili) 3. [Funzioni](#funzioni) 4. [Oggetti e strutture dati](#oggetti-e-strutture-dati) - 5. [Classi](#Classi) + 5. [Classi](#classi) 6. [SOLID](#solid) 7. [Test](#Test) - 8. [Concurrency](#concurrency) - 9. [Error Handling](#error-handling) - 10. [Formatting](#formatting) - 11. [Comments](#comments) - 12. [Translation](#translation) + 8. [Consequenzialità](#consequenzialità) + 9. [Gestione degli errori](#gestione-degli-errori) + 10. [Formattazione](#formattazione) + 11. [Commenti](#commenti) + 12. [Traduzioni](#traduzioni) ## Introduzione ![Immagine umoristica che rappresenta quanto sia possibile stimare la qualità di un software attraverso il numero di parolacce espresse durante la lettura del codice](http://www.osnews.com/images/comics/wtfm.jpg) @@ -1894,7 +1894,7 @@ review.perfReview(); **[⬆ torna su](#lista-dei-contenuti)** -## **Commento** +## **Commenti** ### Commenta solo il codice che ha un alto livello di complessità Commentare è una scusa, non un requisito. Un buon codice *spesso* si spiega da solo. **Da evitare** From 3331219ba2664080b12ae0b0c3cbcad8354dc846 Mon Sep 17 00:00:00 2001 From: Francesco Colonna Date: Sat, 13 Oct 2018 17:05:24 +0200 Subject: [PATCH 3/4] TOC --- README.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 147da2ad..3719c03f 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,68 @@ # clean-code-javascript ## Lista dei contenuti - 1. [Introduzione](#introduzione) - 2. [Variabili](#variabili) - 3. [Funzioni](#funzioni) - 4. [Oggetti e strutture dati](#oggetti-e-strutture-dati) - 5. [Classi](#classi) - 6. [SOLID](#solid) - 7. [Test](#Test) - 8. [Consequenzialità](#consequenzialità) - 9. [Gestione degli errori](#gestione-degli-errori) - 10. [Formattazione](#formattazione) - 11. [Commenti](#commenti) - 12. [Traduzioni](#traduzioni) + - [**Lista dei contenuti**](#lista-dei-contenuti) + - [**Introduzione**](#introduzione) + - [**Variabili**](#variabili) + - [Utilizza nomi di variabili comprensibili e pronunciabili](#utilizza-nomi-di-variabili-comprensibili-e-pronunciabili) + - [Usa la stessa semantica per lo stesso tipo di variabili](#usa-la-stessa-semantica-per-lo-stesso-tipo-di-variabili) + - [Utilizza nomi che possano essere cercati](#utilizza-nomi-che-possano-essere-cercati) + - [Utilizza nomi di variabili esplicartivi](#utilizza-nomi-di-variabili-esplicartivi) + - [Evita mappe mentali](#evita-mappe-mentali) + - [Non contestualizzare inutilmente](#non-contestualizzare-inutilmente) + - [Utilizza i valori di default (predefiniti), anzichè usare condizioni o valutazioni minime](#utilizza-i-valori-di-default-predefiniti-anzichè-usare-condizioni-o-valutazioni-minime) + - [**Funzioni**](#funzioni) + - [Argomenti di una funzione (idealmente 2 o anche meno)](#argomenti-di-una-funzione-idealmente-2-o-anche-meno) + - [Un metodo dovrebbe fare una sola cosa](#un-metodo-dovrebbe-fare-una-sola-cosa) + - [I nomi delle funzioni dovrebbero farti capire cosa fanno](#i-nomi-delle-funzioni-dovrebbero-farti-capire-cosa-fanno) + - [Le funzioni dovrebbero avere un solo livello di astrazione](#le-funzioni-dovrebbero-avere-un-solo-livello-di-astrazione) + - [Rimuovi il codice duplicato](#rimuovi-il-codice-duplicato) + - [Estendi un oggetto con Object.assign](#estendi-un-oggetto-con-objectassign) + - [Non usare valori flag (true/false) come parametri di una funzione](#non-usare-valori-flag-truefalse-come-parametri-di-una-funzione) + - [Evitare effetti inattesi (parte 1)](#evitare-effetti-inattesi-parte-1) + - [Evitare effetti inattesi (parte 2)](#evitare-effetti-inattesi-parte-2) + - [Non aggiungere funzioni globali](#non-aggiungere-funzioni-globali) + - [Preferisci la programmazione funzionale a quella imperativa](#preferisci-la-programmazione-funzionale-a-quella-imperativa) + - [Incapsula le condizioni](#incapsula-le-condizioni) + - [Evita di verificare condizioni in negativo](#evita-di-verificare-condizioni-in-negativo) + - [Evita le condizioni](#evita-le-condizioni) + - [Evita la validazione dei tipi (parte 1)](#evita-la-validazione-dei-tipi-parte-1) + - [Evita la validazione dei tipi (part 2)](#evita-la-validazione-dei-tipi-part-2) + - [Non ottimizzare eccessivamente](#non-ottimizzare-eccessivamente) + - [Rimuovi il codice inutilizzato](#rimuovi-il-codice-inutilizzato) + - [**Oggetti e strutture dati**](#oggetti-e-strutture-dati) + - [Utilizza getter e setter](#utilizza-getter-e-setter) + - [Imposta proprietà private in un oggetto](#imposta-proprietà-private-in-un-oggetto) + - [**Classi**](#classi) + - [Utilizza le classi ES2015/ES6 piuttosto che le funzioni di ES5](#utilizza-le-classi-es2015es6-piuttosto-che-le-funzioni-di-es5) + - [Concatena i metodi](#concatena-i-metodi) + - [Preferisci una struttura compositiva all'ereditarietà](#preferisci-una-struttura-compositiva-allereditarietà) + - [**SOLID**](#solid) + - [Single Responsibility Principle (SRP) (Principio di singola responsabilità)](#single-responsibility-principle-srp-principio-di-singola-responsabilità) + - [Open/Closed Principle (OCP) (Principio aperto/chiuso)](#openclosed-principle-ocp-principio-apertochiuso) + - [Liskov Substitution Principle (LSP) (Principio di sostituzione di Liskov)](#liskov-substitution-principle-lsp-principio-di-sostituzione-di-liskov) + - [Interface Segregation Principle (ISP) (Principio di segregazione delle interfacce)](#interface-segregation-principle-isp-principio-di-segregazione-delle-interfacce) + - [Dependency Inversion Principle (DIP) (Principio di inversione delle dipendenze)](#dependency-inversion-principle-dip-principio-di-inversione-delle-dipendenze) + - [**Test**](#test) + - [Un singolo comportamento per test](#un-singolo-comportamento-per-test) + - [**Consequenzialità**](#consequenzialità) + - [utilizza le Promise, non funzioni di callback](#utilizza-le-promise-non-funzioni-di-callback) + - [Async/Await sono addirittura più chiari delle Promise](#asyncawait-sono-addirittura-più-chiari-delle-promise) + - [**Gestione degli errori**](#gestione-degli-errori) + - [Non ingnorare gli errori intercettati](#non-ingnorare-gli-errori-intercettati) + - [Non ignorare le Promise quando vengono rigettate](#non-ignorare-le-promise-quando-vengono-rigettate) + - [**Formattazione**](#formattazione) + - [Utilizza le maiuscole in modo consistente](#utilizza-le-maiuscole-in-modo-consistente) + - [Richiami e dichiarazioni di funzioni dovrebbero essere vicini](#richiami-e-dichiarazioni-di-funzioni-dovrebbero-essere-vicini) + - [**Commenti**](#commenti) + - [Commenta solo il codice che ha un alto livello di complessità](#commenta-solo-il-codice-che-ha-un-alto-livello-di-complessità) + - [Non lasciare parti del tuo codice commentate all'interno dei sorgenti](#non-lasciare-parti-del-tuo-codice-commentate-allinterno-dei-sorgenti) + - [Non utilizzare i commenti come un diario](#non-utilizzare-i-commenti-come-un-diario) + - [Evita di specificare di cosa si tratta](#evita-di-specificare-di-cosa-si-tratta) + - [Traduzioni](#traduzioni) ## Introduzione + ![Immagine umoristica che rappresenta quanto sia possibile stimare la qualità di un software attraverso il numero di parolacce espresse durante la lettura del codice](http://www.osnews.com/images/comics/wtfm.jpg) Principi di Ingegneria del Software, dal libro di Robert C. Martin @@ -33,6 +81,7 @@ Ogni singola parte di codice parte come bozza, inizialmente, per per poi prender Solo alla fine perfezioneremo il nostro software, quando revisioneremo il codice con i nostri colleghi. Ma non abbatterti tu la prima volta che il tuo codice sarà revisionato e richiederà miglioramenti: *Abbatti il codice!* ## **Variabili** + ### Utilizza nomi di variabili comprensibili e pronunciabili **Da evitare** @@ -41,14 +90,17 @@ const yyyymmdstr = moment().format('YYYY/MM/DD'); ``` **Bene:** + ```javascript const currentDate = moment().format('YYYY/MM/DD'); ``` + **[⬆ torna su](#lista-dei-contenuti)** ### Usa la stessa semantica per lo stesso tipo di variabili **Da evitare** + ```javascript getUserInfo(); getClientData(); @@ -56,12 +108,15 @@ getCustomerRecord(); ``` **Bene:** + ```javascript getUser(); ``` + **[⬆ torna su](#lista-dei-contenuti)** ### Utilizza nomi che possano essere cercati + Leggiamo molto più codice di quanto non ne scriveremo mai. È importante che il codice che noi scriviamo sia leggibile e ricercabile. Nominando variabili che non assumono uno specifico contesto all'interno del nostro software, possiamo irritare chi lo legge. Fai in modo che i nomi delle tue variabili siano ricercabili. Strumenti come [buddy.js](https://github.com/danielstjules/buddy.js) e @@ -2013,7 +2068,7 @@ const actions = function() { ``` **[⬆ torna su](#lista-dei-contenuti)** -## Traduzioni +## **Traduzioni** Questa guida è disponibile in altre lingue: From 44da7d38fb71713efb74ea3fb9558ed783f734bd Mon Sep 17 00:00:00 2001 From: Silvia Date: Thu, 4 Nov 2021 12:04:44 +0100 Subject: [PATCH 4/4] intro, variables reviewed --- README.md | 57 +++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 3719c03f..e4fec48e 100644 --- a/README.md +++ b/README.md @@ -69,16 +69,16 @@ Principi di Ingegneria del Software, dal libro di Robert C. Martin [*Clean Code*](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882), adattati a JavaScript. -Non si tratta di una guida stilistica, bensì una guida per cercare di produrre software +Non si tratta di una guida stilistica, bensì di una guida per cercare di produrre software [leggibile, riutilizzabile e rifattorizzabile](https://github.com/ryanmcdermott/3rs-of-software-architecture) in JavaScript. -Non tutti i principi di questa guida devono essere seguiti alla lettera, e solo alcuni sono universalmente condivisi. Sono linee guida e niente più, ma sono state tutte apprese in anni di esperienza collettiva dall'autore di *Clean code*. +Non tutti i principi di questa guida devono essere seguiti alla lettera, e solo alcuni sono universalmente condivisi. Sono linee guida e niente più, ma sono linee guida che derivano da anni di esperienza collettiva degli autori di *Clean code*. -Il nostro lavoro come software engeneer esiste da soli 50 anni e stiamo ancora cercando di apprendere molto. Quando l'architettura del software godrà della stessa anzianità dell'architettura in sè, probabilmente avremo regole più rigide da seguire. Per ora facciamo si che queste linee guida servano come termine di paragone per valutare la qualità del software che tu ed il tuo team producete. +Il nostro lavoro come ingegneri del software esiste da soli 50 anni, e stiamo ancora imparando molto. Quando l'architettura del software godrà della stessa anzianità dell'architettura in sé, probabilmente avremo regole più rigide da seguire. Per ora, facciamo sì che queste linee guida servano come termine di paragone per valutare la qualità del software che producete tu ed il tuo team. -Un ultima cosa: conoscere queste regole non farà di te immediatamente un developer migliore, e lavorare per tanti anni come tale non ti eviterà di commettere errori. -Ogni singola parte di codice parte come bozza, inizialmente, per per poi prendere forma esattamente come una scultura di argilla. -Solo alla fine perfezioneremo il nostro software, quando revisioneremo il codice con i nostri colleghi. Ma non abbatterti tu la prima volta che il tuo codice sarà revisionato e richiederà miglioramenti: *Abbatti il codice!* +Un'ultima cosa: conoscere queste regole non ti trasformerà immediatamente in uno sviluppatore migliore, e lavorare tenendole presenti, anche per tanti anni, non ti impedirà di commettere errori. +Ogni singola parte di codice nasce come una bozza, per poi prendere forma, proprio come una scultura di argilla. +Solo alla fine perfezioneremo il nostro software, revisionando il codice con i nostri colleghi. Non abbatterti se il codice iniziale si deve migliorare. Piuttosto, vacci giù duro con il codice! ## **Variabili** @@ -89,7 +89,7 @@ Solo alla fine perfezioneremo il nostro software, quando revisioneremo il codice const yyyymmdstr = moment().format('YYYY/MM/DD'); ``` -**Bene:** +**Corretto** ```javascript const currentDate = moment().format('YYYY/MM/DD'); @@ -107,7 +107,7 @@ getClientData(); getCustomerRecord(); ``` -**Bene:** +**Corretto** ```javascript getUser(); @@ -115,12 +115,12 @@ getUser(); **[⬆ torna su](#lista-dei-contenuti)** -### Utilizza nomi che possano essere cercati +### Utilizza nomi che siano facili da cercare -Leggiamo molto più codice di quanto non ne scriveremo mai. È importante che il codice che noi scriviamo sia leggibile e ricercabile. Nominando variabili che non assumono uno specifico contesto all'interno del nostro software, possiamo irritare chi lo legge. -Fai in modo che i nomi delle tue variabili siano ricercabili. +Leggiamo molto più codice di quanto ne scriviamo. È importante che il codice che produciamo sia leggibile e consultabile. Se non assegnamo un nome a variabili importanti per capire il nostro software, infastidiamo chi lo legge. +Fai in modo che i nomi delle tue variabili siano facili da cercare. Strumenti come [buddy.js](https://github.com/danielstjules/buddy.js) e -[ESLint](https://github.com/eslint/eslint/blob/660e0918933e6e7fede26bc675a0763a6b357c94/docs/rules/no-magic-numbers.md) possono aiutarti ad identificare, per esempio, costanti non rinominate. +[ESLint](https://github.com/eslint/eslint/blob/660e0918933e6e7fede26bc675a0763a6b357c94/docs/rules/no-magic-numbers.md) possono essere utili per identificare costanti a cui dovrebbe essere assegnato un nome. **Da evitare** ```javascript @@ -129,17 +129,17 @@ setTimeout(blastOff, 86400000); ``` -**Bene:** +**Corretto** ```javascript -// Dichiarala come costante in maiuscolo. -const MILLISECONDI_IN_UN_GIORNO = 86400000; +// Dichiara la costante assegnandole un nome e usando lettere maiuscole. +const MILLISECONDI_IN_UN_GIORNO = 86400000; //86400000; setTimeout(blastOff, MILLISECONDI_IN_UN_GIORNO); ``` **[⬆ torna su](#lista-dei-contenuti)** -### Utilizza nomi di variabili esplicartivi +### Utilizza nomi di variabili esplicativi **Da evitare** ```javascript const address = 'One Infinite Loop, Cupertino 95014'; @@ -147,7 +147,7 @@ const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/; saveCityZipCode(address.match(cityZipCodeRegex)[1], address.match(cityZipCodeRegex)[2]); ``` -**Bene:** +**Corretto** ```javascript const address = 'One Infinite Loop, Cupertino 95014'; const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/; @@ -156,8 +156,8 @@ saveCityZipCode(city, zipCode); ``` **[⬆ torna su](#lista-dei-contenuti)** -### Evita mappe mentali -Essere espliciti è meglio che non esserlo. +### Evita collegamenti mentali impliciti +È meglio essere espliciti piuttosto che non esserlo. **Da evitare** ```javascript @@ -168,12 +168,12 @@ locations.forEach((l) => { // ... // ... // ... - // A cosa fa riferimento esattamente `l`? + // Un momento, a cosa si riferiva `l`? dispatch(l); }); ``` -**Bene:** +**Corretto** ```javascript const locations = ['Austin', 'New York', 'San Francisco']; locations.forEach((location) => { @@ -187,9 +187,9 @@ locations.forEach((location) => { ``` **[⬆ torna su](#lista-dei-contenuti)** -### Non contestualizzare inutilmente +### Non aggiungere informazioni inutili -Se il nome della tua classe/oggetto ti indica a cosa fa riferimento, non ripeterlo nei nomi delle sue proprietà o funzioni. +Se il nome della tua classe o oggetto è già esplicativo, non ripeterlo nei nomi delle sue proprietà o funzioni. **Da evitare** ```javascript @@ -204,7 +204,7 @@ function paintCar(car) { } ``` -**Bene:** +**Corretto** ```javascript const Car = { make: 'Honda', @@ -218,11 +218,10 @@ function paintCar(car) { ``` **[⬆ torna su](#lista-dei-contenuti)** -### Utilizza i valori di default (predefiniti), anzichè usare condizioni o valutazioni minime +### Utilizza parametri predefiniti, anzichè usare condizionali o short-circuiting -I valori di default, generalmente sono più chiari dei [valutazioni minime](https://it.wikipedia.org/wiki/Valutazione_a_corto_circuito). Tieni presente che se non utilizzerai questo approccio, la tua funzione restituirà solo `undefined` come valore di default. -Tutti gli altri valori "falsy" come `''`, `""`, `false`, `null`, `0`, e -`NaN`, non saranno sostituiti da un valore predefinito. +I parametri predefiniti, generalmente, sono più chiari di condizionali o short-circuiting [valutazioni minime](https://it.wikipedia.org/wiki/Valutazione_a_corto_circuito). Ricorda che, se utilizzi parametri predefiniti, la tua funzione assegnerà il valore predefinito solamente ai parametri che non le verranno forniti (`undefined`). +Gli altri valori assimilabili al booleano falso, ovvero `''`, `""`, `false`, `null`, `0`, e `NaN`, non saranno sostituiti dal valore predefinito specificato. **Da evitare** ```javascript @@ -233,7 +232,7 @@ function createMicrobrewery(name) { ``` -**Bene:** +**Corretto** ```javascript function createMicrobrewery(name = 'Hipster Brew Co.') { // ...