{"id":11377,"date":"2015-08-07T11:12:23","date_gmt":"2015-08-07T09:12:23","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11377"},"modified":"2016-02-03T17:18:16","modified_gmt":"2016-02-03T16:18:16","slug":"come-utilizzare-oclint-e-valutare-la-qualita-del-codice-sorgente","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/come-utilizzare-oclint-e-valutare-la-qualita-del-codice-sorgente\/","title":{"rendered":"Come utilizzare OCLint e &#8220;valutare&#8221; la qualit\u00e0 del codice sorgente"},"content":{"rendered":"<p>Si pu\u00f2 dimostrare la qualit\u00e0 oggettiva di un codice sorgente? Quando penso a questa domanda non posso fare a meno di associarla alla scena de &#8220;L&#8217;attimo Fuggente&#8221; (qui:\u00a0<a href=\"https:\/\/www.youtube.com\/watch?v=s81k8faP_6o\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=s81k8faP_6o<\/a>) nel quale viene citato (e condannato) un metodo\u00a0<em>scientifico<\/em> e\u00a0<em>matematico<\/em> per valutare la qualit\u00e0 di una poesia.<\/p>\n<p>Allo stesso modo gli sviluppatori hanno definito delle metriche il cui scopo \u00e8 definire,\u00a0in maniera formale,\u00a0quando una porzione di codice \u00e8 migliore di un&#8217;altra. \u00a0La cosa divertente \u00e8 che ovviamente non c&#8217;\u00e8 nulla di formale in queste metriche, per cui dibattiti e controversie sono lontane dall&#8217;essere risolte. C&#8217;\u00e8 chi \u00e8 convinto che una <em>code-coverage<\/em> del 99% sia migliore di una del 60%, c&#8217;\u00e8 chi crede che una classe da 50 righe sia per forza migliore di una da 100.. ma c&#8217;\u00e8 anche chi \u00e8 religiosamente convinto del contrario.<\/p>\n<p>La mia personale opinione \u00e8 che l&#8217;unica valida misura della qualit\u00e0 del codice sorgente sia questa:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/code_review.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11380 size-full\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/code_review.jpg\" alt=\"code_review\" width=\"500\" height=\"453\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/code_review.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/code_review-300x272.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Esistono per\u00f2 casi in cui tenere sotto controllo la qualit\u00e0 generale del codice sorgente \u00e8 utile e doveroso, specialmente quando il team inizia a diventare grande, in questo caso ci facciamo aiutare da tool come <strong>OCLint<\/strong>.<\/p>\n<p>OCLint (qui:\u00a0<a href=\"http:\/\/oclint.org\" target=\"_blank\">http:\/\/oclint.org<\/a>) \u00e8 un tool molto potente e versatile per l&#8217;<strong>analisi di codice C, C++ e Objective-C<\/strong>.<\/p>\n<p>Il modo pi\u00f9 semplice per utilizzarlo \u00e8 per\u00f2 insieme ad un altro tool: <a href=\"https:\/\/github.com\/facebook\/xctool\" target=\"_blank\">xctool<\/a>, iniziamo quindi con l&#8217;installazione di quest&#8217;ultimo.<\/p>\n<p>&nbsp;<\/p>\n<h3>XCTool<\/h3>\n<p>XCTool \u00e8 un wrapper per xcodebuild\u00a0che serve\u00a0per compilare progetti Xcode via command line veramente utile e versatile. Potete installare XCTool sia tramite HomeBrew sia scaricando direttamente il progetto da github. Io ho preferito questa seconda soluzione perch\u00e9 mi da la possibilit\u00e0 di utilizzare la versione 0.2.4 mentre su homebrew siamo fermi alla 0.2.3<\/p>\n<p>Una volta scaricato il progetto github per utilizzarlo baster\u00e0 invocare il comando:<\/p>\n<pre class=\"lang:sh decode:true\">&lt;path&gt;\/xctool\/xctool.sh<\/pre>\n<p>Scaricate anche questo <a href=\"https:\/\/www.dropbox.com\/s\/voqutj3yyzzufa4\/LearnOCLint.zip?dl=0\" target=\"_blank\">progetto Xcode di esempio<\/a> e provate a compilarlo con XCTool digitando:<\/p>\n<pre class=\"lang:sh decode:true\">\/&lt;path&gt;\/xctool\/xctool.sh -project \"LearnOCLint.xcodeproj\" -scheme \"LearnOCLint\" build<\/pre>\n<p>Il risultato dovrebbe essere simile a questo:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.44.05.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11383 size-full\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.44.05.png\" alt=\"Screenshot 2015-08-07 08.44.05\" width=\"928\" height=\"548\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.44.05.png 928w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.44.05-300x177.png 300w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/a><\/p>\n<p>XCTool pu\u00f2 generare un report in formato json che pu\u00f2 essere poi interpretato da OCLint, basta specificarlo tramite l&#8217;apposito parametro:<\/p>\n<pre class=\"lang:sh decode:true \">\/&lt;path&gt;\/xctool\/xctool.sh -project \"LearnOCLint.xcodeproj\" -scheme \"LearnOCLint\" -reporter json-compilation-database:compile_commands.json clean build<\/pre>\n<p>In questo caso al termine della compilazione dovreste trovare il file <em>compile_commands.json<\/em> direttamente nella root del progetto.<\/p>\n<p>Da notare che ho anche aggiunto il comando &#8220;clean&#8221;, altrimenti il file json sar\u00e0 vuoto.<\/p>\n<h3>OCLint<\/h3>\n<p>Anche in questo caso decidete voi come meglio installare questo tool, io ho preferito scaricare i binari dal sito e procedere all&#8217;installazione manuale. Trovate tutte le info qui:\u00a0<a href=\"http:\/\/docs.oclint.org\/en\/dev\/intro\/installation.html\" target=\"_blank\">http:\/\/docs.oclint.org\/en\/dev\/intro\/installation.html<\/a><\/p>\n<p>Per eseguire finalmente l&#8217;analisi digitate questo comando:<\/p>\n<pre class=\"lang:sh decode:true\">oclint-json-compilation-database -v oclint_args \"-report-type html -o report.html -rc=LONG_LINE=120\"; open report.html<\/pre>\n<ul>\n<li>oclint_args: specifica i parametri che verranno passati ad OCLint<\/li>\n<li>report_type html: genera un report in formato html.<\/li>\n<li>-o report.html: \u00a0nome del file che verr\u00e0 generato<\/li>\n<li>-rc=LONG_LINE=120: specifica un modificatore per una regola di default. Genera un warning se nel codice ci sono righe lunghe pi\u00f9 di 120 caratteri.<\/li>\n<li>open report.html: \u00a0apre il report al termine del processo.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.57.49.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11384 size-large\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.57.49-1024x440.png\" alt=\"Screenshot 2015-08-07 08.57.49\" width=\"978\" height=\"420\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.57.49-1024x440.png 1024w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-08.57.49-300x129.png 300w\" sizes=\"auto, (max-width: 978px) 100vw, 978px\" \/><\/a><\/p>\n<p>Ecco il report generato da un progetto Xcode vuoto. In questo caso sono gi\u00e0 presenti 7 warning perch\u00e9 Apple inserisce nel file <em>Appdelegate.m<\/em> dei commenti che sono ben pi\u00f9 lunghi di 120 caratteri.<\/p>\n<p>Alcune metriche possono essere veramente utili, come\u00a0NESTED_BLOCK_DEPTH che di default \u00e8 impostata a 5 ma io setterei a 3.<\/p>\n<p>Questo codice:<\/p>\n<pre class=\"lang:objc decode:true \">    int a, b, c, d, e;\r\n    if (a) {\r\n        if (b) {\r\n            if (c) {\r\n                if (d){\r\n                    if (e) {\r\n                        NSLog(@\"do something\");\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }<\/pre>\n<p>Genera questo tipo di warning:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-09.10.22.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11385 size-large\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-09.10.22-1024x30.png\" alt=\"Screenshot 2015-08-07 09.10.22\" width=\"978\" height=\"29\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-09.10.22-1024x30.png 1024w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-09.10.22-300x9.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2015\/08\/Screenshot-2015-08-07-09.10.22.png 1712w\" sizes=\"auto, (max-width: 978px) 100vw, 978px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Il vero neo di questo tool \u00e8 di generare spesso molto rumore, ad esempio qualche giorno fa analizzando un grosso progetto ho scoperto che un file mi dava complessit\u00e0 ciclomatica (&#8230;si, una di quelle metriche un po&#8217; cos\u00ec&#8230;) 112 mentre il limite di default \u00e8 10. Analizzando il report ho scoperto che il file in questione fa parte di una libreria molto ben quotata per il parsing delle date in formato ISO8601. Quale dovrebbe essere allora il mio giudizio su quella classe?<\/p>\n<p>Il mio consiglio \u00e8 quello di fidarvi innanzitutto del vostro fiuto e della vostra esperienza perch\u00e9 non esistono termini matematici per definire quando un codice \u00e8 migliore di un altro, e utilizzate tool come OCLint per verificare che lo standard aziendale sia rispettato perch\u00e9 alla fine \u00e8 sempre questione di trade-off. (Kent Beck \u00e8 ufficialmente il mio idolo dopo aver visto <a href=\"http:\/\/martinfowler.com\/articles\/is-tdd-dead\/\" target=\"_blank\">questi<\/a> video)<\/p>\n<p>&nbsp;<\/p>\n<p><a title=\"Kent Beck's tradeoffs\" href=\"http:\/\/makeagif.com\/ZULuNO\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/cdn.makeagif.com\/media\/5-20-2014\/ZULuNO.gif\" alt=\"Kent Beck's tradeoffs\" width=\"320\" height=\"180\" \/><\/a><\/p>\n<div style=\"font-size: 11px;\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Si pu\u00f2 dimostrare la qualit\u00e0 oggettiva di un codice sorgente? Quando penso a questa domanda non posso&#8230;<\/p>\n","protected":false},"author":53,"featured_media":11380,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8],"tags":[1440,1522,1525,1524,1523],"class_list":["post-11377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-varie","tag-ios-devs","tag-oclint","tag-qualita-codice-sorgente-ios","tag-tool-ios-developers","tag-xctool"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11377","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=11377"}],"version-history":[{"count":13,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11377\/revisions"}],"predecessor-version":[{"id":11730,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11377\/revisions\/11730"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/11380"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}