{"id":10878,"date":"2014-02-01T18:31:08","date_gmt":"2014-02-01T17:31:08","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=10878"},"modified":"2014-02-04T15:38:52","modified_gmt":"2014-02-04T14:38:52","slug":"clean-coding-la-ricerca-dell-estetica-nel-codice-sorgente","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/clean-coding-la-ricerca-dell-estetica-nel-codice-sorgente\/","title":{"rendered":"Clean coding: la ricerca dell\u2019estetica nel codice sorgente"},"content":{"rendered":"<p>Inizier\u00f2 questo articolo con un&#8217;affermazione che mi far\u00e0 apparire un po&#8217; matto:<\/p>\n<blockquote><p>Ad una parte di codice che funziona, ma scritta male, io ne preferisco una che non funziona, ma scritta bene.<\/p><\/blockquote>\n<p>(anche se a prima vista pu\u00f2 sembrare controintutivo, perch\u00e9 il nostro scopo alla fine \u00e8 scrivere applicazioni che funzionino).<\/p>\n<p>Il motivo di questa affermazione risulta comprensibile se si tiene conto anche del fattore tempo. Perch\u00e9 nel corso del tempo, quando bisogner\u00e0 cambiare quella riga di codice (e dico <em>quando<\/em>, non <em>se<\/em>) allora ci saranno altissime probabilit\u00e0 che la parte scritta male smetta di funzionare, mentre quella scritta bene potr\u00e0 essere analizzata e debuggata con successo e inizier\u00e0 velocemente a funzionare correttamente.<\/p>\n<p>Inoltre il tempo per apportare le modifiche ad un pezzo di codice scritto male \u00e8 infinitamente pi\u00f9 lungo rispetto alla stessa modifica fatta su un progetto scritto secondo delle regole che vedremo pi\u00f9 avanti.<\/p>\n<p>Ecco quindi che, se si tiene conto del fatto che il codice \u00e8 scritto una volta e modificato <em>n<\/em> volte, \u00e8 chiaramente pi\u00f9 efficiente nel tempo avere una porzione di codice che funzioni <em>n-1<\/em> volte (e che richieda brevi tempi d&#8217;intervento) piuttosto che una porzione che vada bene soltanto la prima volta e che poi richieda lacrime e sangue per ciascuna successiva modifica.<\/p>\n<p>Chi mi conosce sul <a href=\"http:\/\/forum.devapp.it\" target=\"_blank\">forum<\/a> sa che questo \u00e8 un po&#8217; il mio pallino da sempre e che preferisco rispondere a una domanda sullo stile piuttosto che fornire una riga di codice che risolva il problema e in quest&#8217;articolo vorrei affrontare proprio questo problema, fornendo delle risorse utili a chi volesse approfondire l&#8217;argomento e soprattutto per dimostrare che non sono l&#8217;unico pazzo a questo mondo \ud83d\ude42<!--more--><\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/02\/clean-coding-ios-mobile.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10888\" alt=\"clean-coding-ios-mobile\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/02\/clean-coding-ios-mobile.jpg\" width=\"642\" height=\"336\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/02\/clean-coding-ios-mobile.jpg 642w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/02\/clean-coding-ios-mobile-300x157.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/02\/clean-coding-ios-mobile-500x261.jpg 500w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><\/a><\/p>\n<h1>Cosa si intende per clean coding?<\/h1>\n<p>Quando si parla di <strong>clean coding<\/strong> si intendono tutta una serie di pratiche e di accorgimenti, non necessariamente legati ad uno specifico linguaggio, il cui obiettivo \u00e8 rendere il codice sorgente pi\u00f9 chiaro da comprendere e con una struttura che renda pi\u00f9 agevole apportare modifiche successive.<\/p>\n<p>Possiamo quindi dire che l&#8217;obiettivo ultimo del clean coding non \u00e8 quello di avere programmi pi\u00f9 veloci o file sorgenti pi\u00f9 piccoli o altri tipi di ottimizzazione, ma \u00e8 esclusivamente quello di ottenere codice sorgete in definitiva pi\u00f9 manutenibile.<\/p>\n<h1>Chi dovrebbe curarsi del clean coding?<\/h1>\n<p>Come cercher\u00f2 di spiegare pi\u00f9 avanti, curarsi del clean coding non aggiunge overhead alla stesura di un codice sorgente, quindi in un certo senso possiamo dire che non ha controindicazioni e che quindi pu\u00f2 essere applicato anche al progetto pi\u00f9 piccolo e insignificante.<\/p>\n<p>\u00c8 chiaro che se il progetto, invece, riveste anche una minima importanza economica e strategica, dal condizionale si passa all&#8217;imperativo ed \u00e8 necessario occuparsi del clean coding fin da subito, per non ostacolare la buona riuscita del progetto.<\/p>\n<h1>Ho fretta e devo consegnare il progetto, non posso pensarci dopo?<\/h1>\n<p>Questa obiezione \u00e8 spesso mossa da chi crede che tener conto del clean coding rubi del tempo alla fase di scrittura del codice, e questo \u00e8 totalmente falso. Come abbiamo detto all&#8217;interno del clean coding rientrano una moltitudine di pratiche e di best practice e, anche se alcune di esse possono richiedere un investimento in termini di tempo, la maggior parte delle tecniche richiedono esclusivamente un modo diverso di scrivere il nostro codice sorgente, e quindi non \u00e8 richiesto alcuno sforzo aggiuntivo.<\/p>\n<p>Non curarsi del clean coding per risparmiare tempo \u00e8 come scrivere &#8220;xk\u00e8&#8221; al posto di &#8220;perch\u00e9&#8221; per risparmiare fatica.<\/p>\n<p>La convinzione, poi, che sia possibile in qualche modo tornare sui propri passi ed effettuare una fase di ripulita \u00e8 anch&#8217;essa errata per la ragione fondamentale che, visto che le regole del clean coding non sono state seguite, allora effettuare le modifiche al codice sar\u00e0 difficile e <em>error-prone<\/em> per cui di fronte ad un&#8217;applicazione funzionante, nessuno vuol modificare il codice sorgente correndo il rischio di introdurre un bug.<\/p>\n<p>Il codice in questo contesto viene paragonato ad un palazzo abbandonato dove un giorno viene spaccato un vetro, il giorno dopo rubata una porta e cos\u00ec via aspettando che poi, un giorno, ci sia una fase di ristrutturazione completa. Come invece ci insegnano i boyscout \u00e8 necessario che ogni singolo intervento lasci il bosco (o nel nostro caso il sorgente) pi\u00f9 pulito di come l&#8217;abbiamo trovato. Soltanto in questo modo si pu\u00f2 garantire nel tempo lo stato di salute del progetto.<\/p>\n<h1>In dettaglio di che tecniche stai parlando?<\/h1>\n<p>Non esiste un elenco completo di regole da seguire affinch\u00e9 il codice possa essere considerato <em>clean<\/em> o <em>non-clean<\/em>. Con un approccio un po&#8217; Zen potremmo dire che un codice \u00e8 clean quando guardandolo, capisci che \u00e8 clean \ud83d\ude42<\/p>\n<p>Scherzi a parte, l&#8217;intero processo di sviluppo dell&#8217;applicazione pu\u00f2 e dovrebbe essere indirizzato all&#8217;ottenimento di un sorgente chiaro e utilizzabile, in tutte le sue fasi, dalla fase di stima alla fase di manutenzione.<br \/>\nPer questa ragione quando si parla di clean coding si tende a considerare anche la metodologia di sviluppo, la struttura del progetto, il versioning, i test case fino alla fase di manutenzione e archiviazione, passando ovviamente dalla struttura degli oggetti e delle classi.<\/p>\n<p>Un progetto clean quindi passa per:<\/p>\n<ul>\n<li>Una chiara metodologia di sviluppo<\/li>\n<li>Una struttura ordinata delle risorse che costituiscono il progetto.<\/li>\n<li>Un&#8217;organizzazione delle versioni e dei branch di sviluppo.<\/li>\n<li>Un nutrito set di test case e integration test per agevolare il refactoring.<\/li>\n<li>Una struttura del codice chiara e che permette agevolmente le modifiche.<\/li>\n<\/ul>\n<p>In alcuni casi la scelta effettuata per ciascuno di questi punti pu\u00f2 non essere di cruciale importanza, ma \u00e8 la scelta in s\u00e9, insieme alla consapevolezza dell&#8217;esistenza di questi punti a creare un <em>processo<\/em> di sviluppo software.<\/p>\n<h1>Puoi descrivere pi\u00f9 in dettaglio questi punti?<\/h1>\n<p>Certo, dei primi quattro punti dar\u00f2 qualche accenno, per l&#8217;ultimo punto cercher\u00f2 di spendere qualche parola in pi\u00f9.<\/p>\n<h2>Metodologia di sviluppo<\/h2>\n<p>L&#8217;approccio classico allo sviluppo di un software passa dalle fasi di:<\/p>\n<ol>\n<li>Analisi<\/li>\n<li>Progetto<\/li>\n<li>Realizzazione<\/li>\n<li>Collaudo<\/li>\n<li>Manutenzione.<\/li>\n<\/ol>\n<p>Questo \u00e8 banalmente il modello denominato <strong>waterfall<\/strong> ed \u00e8 in genere l&#8217;approccio usato anche dal vostro idraulico quando vi sostituisce la caldaia.<\/p>\n<p>Esamina il guasto (analisi) fa un progetto (&#8220;bisogna cambiare la caldaia&#8221;), la realizza (cambia la caldaia), la collauda (si accende? Ok) e ne pianifica la manutenzione (ci vediamo il prossimo anno\u2026).<br \/>\nNel corso degli anni (a partire dagli anni &#8217;80) qualcuno si \u00e8 chiesta se questo approccio un po&#8217; &#8220;ingenuo&#8221; fosse l&#8217;approccio pi\u00f9 performante anche per lo sviluppo di applicazioni, e nuove metodologie sono apparse come funghi, la maggior parte delle quali rientranti all&#8217;interno delle famiglia delle cosiddette <strong>metodologie agili<\/strong>.<\/p>\n<p>L&#8217;accusa pi\u00f9 grossa rivolta verso l&#8217;approccio waterfall \u00e8 la difficolt\u00e0 nel gestire un cambiamento di requirement in corso di progetto, perch\u00e9 per sua natura una modifica richiesta durante la fase di realizzazione pu\u00f2 richiedere un notevole rework di analisi, progetto e realizzazione.<\/p>\n<p>Su un progetto la cui durata prevista \u00e8 un anno \u00e8 impensabile non ricevere richieste di modifiche in corso d&#8217;opera quindi il modello waterfall non gode di molta popolarit\u00e0.<\/p>\n<p>Un&#8217;altra accusa \u00e8 quella di causare l&#8217;<em>analysis paralysis<\/em>, cio\u00e8 una fase di stallo durante la fase di analisi causata dalla necessit\u00e0 di dettagliare il comportamento del software fin nel pi\u00f9 piccolo dettaglio, visto che non sono previste nel modello altre fasi di analisi.<\/p>\n<h2>Una struttura ordinata per le risorse del progetto<\/h2>\n<p>Non mi soffermer\u00f2 molto su questo aspetto, direi soltanto che \u00e8 impensabile gestire un progetto le cui risorse (sorgenti, documentazione, risorse) non sono organizzate secondo una rigida e condivisa gerarchia.<br \/>\nConsiglio di dare un&#8217;occhiata alle slide di Massimo Oliviero ( <a href=\"http:\/\/goo.gl\/H7e1nh\" target=\"_blank\">http:\/\/goo.gl\/H7e1nh<\/a> ) sull&#8217;organizzazione delle risorse all&#8217;interno di un progetto Xcode con il quale concordo al 100% (trovate anche <a href=\"http:\/\/www.devapp.it\/wordpress\/xcode-tips-tricks-gestione-del-filesystem-un-progetto-piu-versioni-plugin.html\" target=\"_blank\">un mio articolo<\/a> qui su devAPP che pu\u00f2 tornarvi utile).<\/p>\n<h2>Organizzazione delle versioni e branch<\/h2>\n<p>Credo che sia ormai scontata l&#8217;esigenza di utilizzare un sistema di controllo versione (CVS) in qualsiasi progetto di qualsiasi dimensione, ma viene invece spesso sottovalutata la logica con cui il sofware deve essere utilizzato. Quale che sia quindi il tool che si sia deciso di utilizzare (git, svn, mercurial) (svn? really? \ud83d\ude42 ) \u00e8 importante stabilire come vengono gestiti tag, branch e version number.<\/p>\n<p>Per GIT sono stati studiati diversi workflow come, gitflow, featured branch, etc. se volete scegliere quello che fa per voi date una lettura a questo articolo (<a href=\"http:\/\/goo.gl\/hV6Zan\" target=\"_blank\">http:\/\/goo.gl\/hV6Zan<\/a>) come sempre, non \u00e8 importante quale scegliete, ma il fatto di aver preso una scelta!<\/p>\n<h2>Unit test e integration test<\/h2>\n<p>I test hanno lo scopo di assicurare che il software abbia determinati requisiti. L&#8217;utilizzo di un elevato numero di test che copra tutte le funzionalit\u00e0 dell&#8217;applicazione permette in ultima analisi di poter effettuare il refactoring del codice con la sicurezza di non introdurre nessun bug di regressione.<\/p>\n<p>L&#8217;utilizzo di unit test offre anche un innumerevole numero di altri vantaggi (qui <a href=\"http:\/\/goo.gl\/hQBmFZ\" target=\"_blank\">http:\/\/goo.gl\/hQBmFZ<\/a> un assaggio) ma quello che vorrei sottolineare \u00e8 che anche per i test esistono diversi <em>approcci<\/em> come il classico TDD o il pi\u00f9 moderno BDD. Anche in questo caso, fate la vostra scelta magari dando un&#8217;occhiata a questo articolo (<a href=\"http:\/\/goo.gl\/MycWDl\" target=\"_blank\">http:\/\/goo.gl\/MycWDl<\/a> e questa interessante lista <a href=\"http:\/\/goo.gl\/qAfE0\" target=\"_blank\">http:\/\/goo.gl\/qAfE0<\/a>).<\/p>\n<h2>Design e struttura del codice sorgente<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" alt=\"Bob Martin\" src=\"http:\/\/goo.gl\/siqwsQ\" width=\"208\" height=\"208\" \/> Non si pu\u00f2 parlare di clean coding e codice sorgente senza citare il pi\u00f9 grande (e divertente) divulgatore e autore di testi sull&#8217;argomento, lo zio <strong>Bob Martin<\/strong>.<\/p>\n<p>Autore dei due principali volumi sull&#8217;argomento (link pi\u00f9 avanti nell&#8217;articolo) e di una serie di video che potremmo quantomeno definire <em>bizzarri<\/em>, lo zio Bob ha fatto come sua personale crociata (e business&#8230;) proprio il clean code\u2026 che prende questo il nome proprio dai suoi libri.<\/p>\n<p>\u00c8 impossibile riassumere in poche righe i consigli e i suggerimenti raccolti nei suoi libri, vi avviso per\u00f2 che guarderete al vostro codice veramente con occhi nuovi.<\/p>\n<p>Quanto deve essere lungo un metodo? 6 righe al massimo. E una classe? 30. Hai un &#8220;if&#8221; all&#8217;interno di un metodo? \u00e8 indice di un cattivo modello. Hai uno &#8220;switch&#8221; ? hai sbagliato mestiere.<\/p>\n<p>L&#8217;acronimo <strong>SOLID<\/strong> in programmazione fa prorio riferimento a 5 principi fondamentali raccolti da Martin alla base della buona scrittura di un codice sorgente:<\/p>\n<table>\n<thead>\n<tr>\n<th>Lettera<\/th>\n<th>Definizione<\/th>\n<th>Descrizione<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>S<\/td>\n<td>Single Responsability Principle<\/td>\n<td>Deve esistere una sola ragione affinch\u00e9 una classe (o un metodo) debba essere modificato.<\/td>\n<\/tr>\n<tr>\n<td>O<\/td>\n<td>Open-closed Principle<\/td>\n<td>Una classe deve essere aperta per le estensioni e chiusa per le modifiche<\/td>\n<\/tr>\n<tr>\n<td>L<\/td>\n<td>Liskov substitution Principle<\/td>\n<td>Una subclasse deve sempre poter essere usata al posto di una sua superclass<\/td>\n<\/tr>\n<tr>\n<td>I<\/td>\n<td>Interface segregation Principle<\/td>\n<td>Molte interfacce specializzate sono meglio di una grande intefaccia generica<\/td>\n<\/tr>\n<tr>\n<td>D<\/td>\n<td>Dependency Inversion Principle<\/td>\n<td>Oggetti di alto livello non devono dipendere da oggetti di basso livello, ma entrambi devono dipende da interfacce<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Ciascuno di essi meriterebbe un articolo a s\u00e9, il consiglio \u00e8 quello di leggere almeno uno dei due suoi libri, presente in dodicesima posizione tra i libri di programmazione pi\u00f9 influenti della storia (vedi: <a href=\"http:\/\/goo.gl\/REx2\" target=\"_blank\">http:\/\/goo.gl\/REx2<\/a> preceduto da libri come GEB, K&amp;R e GoF\u2026 mica Topolino).<\/p>\n<p>Un altro autore che ha dedicato del tempo a spiegare a noi mortali <em>come<\/em> un codice sorgente deve essere scritto \u00e8 Martin Fowler che nel 1999 ha scritto un libro poi divenuto la Bibbia del Code Refactoring (<a href=\"http:\/\/www.amazon.it\/gp\/product\/0201485672\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=0201485672&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/2j7tgy<\/a>) che contiene uno tra i pi\u00f9 apprezzati elenchi di <strong>code smell<\/strong>, ovvero segni evidenti nel codice sorgente di un cattivo design e struttura delle codice o pi\u00f9 in generale di scarsa attenzione alla qualit\u00e0 del codice prodotto.<br \/>\nPer fare un esempio &#8220;Primitive Obsession&#8221; e un tipo di <em>code smell<\/em> presente quando il programmatore tende ad usare i tipi primitivi (dizionary, array, stringhe) per rappresentare oggetti che sarebbe pi\u00f9 indicato rappresentare con classi.<\/p>\n<p>\u00c8 importante notare che bench\u00e9 <strong>code smell<\/strong> e <strong>SOLID<\/strong> Principles siano tecnicamente molto diversi tra loro, sono in un certo senso correlati: i primi sono dei &#8220;difetti&#8221; che possiamo notare nel codice sorgente, i secondi sono dei &#8220;principi&#8221; da seguire per evitare di incapparvi. Ad esempio il code smell &#8220;shotgun surgery&#8221; che si ha quando a causa di una piccola modifica \u00e8 necessario modificare una lunga lista di classi, \u00e8 strettamente legato al principio SRP (Single Reponsability Principle) cio\u00e8 se tentiamo di programmare rispettando il SRP non ci troveremo mai con il problema dello &#8220;shotgun surgery&#8221;.<\/p>\n<h1>Ok mi hai convinto, dammi qualche link su cui trovare materiale aggiuntivo&#8221;<\/h1>\n<p>Per le metodologie di sviluppo il punto di riferimento iniziale \u00e8 sicuramente wikipedia: (<a href=\"http:\/\/it.wikipedia.org\/wiki\/Metodologia_di_sviluppo_del_software\" target=\"_blank\">http:\/\/it.wikipedia.org\/wiki\/Metodologia_di_sviluppo_del_software<\/a>) e poi sicuramente il gruppo che sta dietro l&#8217;agile day (<a href=\"http:\/\/www.agileday.it\/front\/\" target=\"_blank\">http:\/\/www.agileday.it\/front\/<\/a>) il prossimo \u00e8 fissato per novembre 2014, save the date!<br \/>\nSe volete leggere un testo sullo sviluppo Agile posso suggerire questo qui: <a href=\"http:\/\/www.amazon.it\/gp\/product\/1934356581\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=1934356581&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/i0J8Yf<\/a> non sono un espertissimo in materia e questo libro mi ha chiarito un po&#8217; le idee.<\/p>\n<p>Per l&#8217;utilizzo di GIT trovate un esempio dei diversi workflow qui: <a href=\"http:\/\/goo.gl\/hV6Zan\" target=\"_blank\">http:\/\/goo.gl\/hV6Zan<\/a>, mentre se proprio siete a digiuno di GIT ecco un paio di link:<\/p>\n<ul>\n<li>Git Pro: Il libro di Scott Chacon completametne gratuito e liberamente consultabile.<a href=\"http:\/\/git-scm.com\/book\/it\" target=\"_blank\">http:\/\/git-scm.com\/book\/it<\/a><\/li>\n<li>Try git: Un breve corso interattivo per imparare i rudimenti di Git. Il tutto alla maniera dei ragazzi di Envylabs e CodeShool. <a href=\"http:\/\/try.github.io\/levels\/1\/challenges\/1\" target=\"_blank\">http:\/\/try.github.io\/levels\/1\/challenges\/1<\/a><\/li>\n<li>Learn git branching: Un videogioco, no un tutorial, no un videogioco\u2026 insomma imparare Git in modo interattivo. <a href=\"http:\/\/pcottle.github.io\/learnGitBranching\/\" target=\"_blank\">http:\/\/pcottle.github.io\/learnGitBranching\/<\/a><\/li>\n<li>Github Help: A chi chiedi aiuto su git se non al dio di git Github?<a href=\"%20https:\/\/help.github.com\/\" target=\"_blank\"> https:\/\/help.github.com\/<\/a><\/li>\n<\/ul>\n<p>Per unit test su iOS non c&#8217;\u00e8 moltissimo, l&#8217;unico libro \u00e8 uscito gi\u00e0 un po&#8217; di tempo fa e quindi non \u00e8 aggiornato con i nuovi <em>XCTest<\/em> per\u00f2 a parte questa differenza sintattica il succo del libro resta sempre validissimo.<\/p>\n<p>Segnalo poi il blog di Jhon Reid (<a href=\"http:\/\/qualitycoding.org\/\" target=\"_blank\">http:\/\/qualitycoding.org\/<\/a>) autore tra l&#8217;altro di due framework molto diffusi per l&#8217;obj mock e testing.<\/p>\n<p>Segnatevi anche il feed di questo blog (<a href=\"http:\/\/iosunittesting.com\/\" target=\"_blank\">http:\/\/iosunittesting.com\/<\/a>) uno dei pochi che scrive esclusivamente di TDD e iOS.<\/p>\n<p>Per l&#8217;approccio BDD il framework pi\u00f9 diffuso \u00e8 Kiwi (<a href=\"https:\/\/github.com\/allending\/Kiwi\u200e\" target=\"_blank\">https:\/\/github.com\/allending\/Kiwi\u200e<\/a>) e se la guida non fosse sufficiente vi consiglio un piccolo ebook disponibile su <a href=\"https:\/\/itunes.apple.com\/it\/book\/test-driving-ios-development\/id502345143?mt=11\" target=\"_blank\">iBook store<\/a>, io l&#8217;ho comprato qualche anno fa ed \u00e8 stato molto interessante da seguire.<\/p>\n<p>Per tutto quello che riguarda la stesura del codice sorgente non posso non partire dalla bibbia del design pattern (<a href=\"http:\/\/www.amazon.it\/gp\/product\/0201633612\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=0201633612&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/y28PaX<\/a>) o la sua versione aggiornata specifica per iOS (<a href=\"http:\/\/www.amazon.it\/gp\/product\/1430233303\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=1430233303&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/2fCLVK<\/a>) o Cocoa (<a href=\"http:\/\/www.amazon.it\/gp\/product\/0321535022\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=0321535022&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/yHqWB4<\/a>)<br \/>\nIl sito di Bob Martin \u00e8 <a href=\"http:\/\/cleancoders.com\/\" target=\"_blank\">http:\/\/cleancoders.com\/<\/a>, mentre i due libri pi\u00f9 famosi sono &#8220;Clean Code&#8221; (<a href=\"http:\/\/www.amazon.it\/gp\/product\/0132350882\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=0132350882&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/uZ7N9o<\/a>) e &#8220;The Clean Coders&#8221; (<a href=\"http:\/\/www.amazon.it\/gp\/product\/0137081073\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=0137081073&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/EwvapW<\/a>)<\/p>\n<p>Sul code smell potete leggere l&#8217;articolo di Jeff Atwood (coding horror <a href=\"http:\/\/goo.gl\/JASkO\" target=\"_blank\">http:\/\/goo.gl\/JASkO<\/a>) o direttamente il libro di Martin Fowler (<a href=\"http:\/\/www.amazon.it\/gp\/product\/0201485672\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=3370&amp;creative=23322&amp;creativeASIN=0201485672&amp;linkCode=as2&amp;tag=de0d-21\" target=\"_blank\">http:\/\/goo.gl\/2j7tgy<\/a>). Se cercate invece un riassunto da stampare e tenere sempre a portata di mano ecco un bel PDF: <a href=\"http:\/\/goo.gl\/cwSWxQ\" target=\"_blank\">http:\/\/goo.gl\/cwSWxQ<\/a>.<\/p>\n<p>Personalmente ho apprezzato anche una serie di video realizzati da uno sviluppatore rumeno Patkos Csaba (<a href=\"http:\/\/goo.gl\/4YyRCg\" target=\"_blank\">http:\/\/goo.gl\/4YyRCg<\/a> video a pagamento) dove i <em>code smell<\/em> sono spiegati utilizzando codice PHP, ma sono comunque validi per qualsiasi linguaggio e non \u00e8 richiesta una competenza specifica di php.<\/p>\n<p>Se volete analizzare il vostro codice iOS per valutarne lo stato di salute, potete utilizzare due strumenti: il primo \u00e8 <strong>AppCode<\/strong> un ide alternativo ad XCode (<a href=\"http:\/\/www.jetbrains.com\/objc\/\" target=\"_blank\">http:\/\/www.jetbrains.com\/objc\/<\/a> programma a pagamento) che tra le mille funzionalit\u00e0 ha anche quella di &#8220;inspect code&#8221; evidenziando problemi come codice non utilizzato, codice non raggiungibile, stringhe non localizzate etc.<\/p>\n<p>L&#8217;altra alternativa \u00e8 free e richiede per\u00f2 un po&#8217; di dimestichezza nell&#8217;utilizzo: <strong>OC-Lint<\/strong> (<a href=\"http:\/\/oclint.org\/\" target=\"_blank\">http:\/\/oclint.org\/<\/a>) in grado di analizzare il codice sorgente, confrontarlo con delle regole standard oppure definite da voi (massima lunghezza di una riga 120 caratteri) e generare un report in formato HTML.<\/p>\n<p>Spero di aver dimostrato con questo articolo che, superato quel momento in cui si riesce a scrivere del codice\u00a0<em>che funziona, <\/em>c&#8217;\u00e8 tutto un intero mondo di roba da studiare per affinare il proprio stile. Un po&#8217; come i bambini che prima imparano a scrivere, poi cercano di scrivere\u00a0<em>bene,\u00a0<\/em>se l&#8217;importante fosse solo comunicare i libri sui nostri scaffali sarebbero pieni di xk\u00e9, LOL e cmq.<\/p>\n<p>A questo punto non mi resta che augurarvi buona programmazione (<strong>clean<\/strong> mi raccomando!)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Inizier\u00f2 questo articolo con un&#8217;affermazione che mi far\u00e0 apparire un po&#8217; matto: Ad una parte di codice&#8230;<\/p>\n","protected":false},"author":53,"featured_media":10888,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8],"tags":[1342,1341,1339,1340],"class_list":["post-10878","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-varie","tag-agile-development","tag-clean-coding","tag-code-smell","tag-solid"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=10878"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10878\/revisions"}],"predecessor-version":[{"id":10908,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10878\/revisions\/10908"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/10888"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=10878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=10878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=10878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}