{"id":26649,"date":"2024-03-25T09:30:00","date_gmt":"2024-03-25T08:30:00","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=26649"},"modified":"2024-03-21T17:45:57","modified_gmt":"2024-03-21T16:45:57","slug":"programmazione-ad-oggetti-ci-sembra-cosi-complicata","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/","title":{"rendered":"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-oggetti-e-messaggi\">Oggetti e messaggi<\/h2>\n\n\n\n<p>Sono sicuro che la maggior parte di voi sar\u00e0 d\u2019accordo con me: nel mondo software abbiamo un problema con la Programmazione ad Oggetti. Il paradigma OOP ha origine gi\u00e0 dagli anni \u201850 ed \u00e8 stato formalizzato nella fine dei \u201860, eppure dopo tutti questi anni c\u2019e ancora una curva di apprendimento per molti complessa ed una forte discussione su alcune tematiche fondamentali.<\/p>\n\n\n\n<p>Secondo me, una cosa \u00e8 innegabile: qualcosa \u00e8 andato storto nel modo in cui nel mondo software si \u00e8 diffuso questo paradigma.<\/p>\n\n\n\n<p>Molti dev vedono la OOP in modo errato, ma non mi sento di dare totalmente loro la colpa: per qualche motivo quasi impossibile da ricostruire, nella storia del Software, le nozioni di Programmazione ad Oggetti si sono diffuse in modo poco efficace e molto impreciso.<\/p>\n\n\n\n<p>Partiamo dalla definizione originale di Programmazione ad Oggetti:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>un sistema fatto di oggetti che comunicano tra loro tramite messaggi<\/em><\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"324\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image1-1.png\" alt=\"Esempi di programmazione ad oggetti\" class=\"wp-image-26701\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image1-1.png 499w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image1-1-300x195.png 300w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/figure>\n\n\n\n<p>Prendiamo poi in considerazione anche le euristiche su cui si basa la Programmazione ad Oggetti, ancora pi\u00f9 sottovalutate della definizione stessa:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Tell, don\u2019t ask\n<ol class=\"wp-block-list\">\n<li>\ud83d\udd34&nbsp;A chiede a B i suoi dati interni per poi fare qualche calcolo con quei dati<\/li>\n\n\n\n<li>\u2705&nbsp;A chiede a B di eseguire quel calcolo e fargli sapere il risultato<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"401\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image2-1024x401.png\" alt=\"Esempi di programmazione ad oggetti\" class=\"wp-image-26702\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image2-1024x401.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image2-300x117.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image2-768x300.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image2-1536x601.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image2.png 1618w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Law of Demetra (aka: non parlare con gli sconosciuti)\n<ol class=\"wp-block-list\">\n<li>\ud83d\udd34&nbsp;A chiede a C di fare qualcosa tramite B (<code>$classA\u2192classB\u2192classC\u2192doSomething()<\/code>)<\/li>\n\n\n\n<li>\u2705&nbsp;A chiede a B di fare qualcosa, senza avere idea di come B sia in grado di farla perch\u00e8 non gli interessa (<code>$classA\u2192classB\u2192doSomething()<\/code>)<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image3-1024x402.png\" alt=\"Esempi di programmazione ad oggetti\" class=\"wp-image-26703\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image3-1024x402.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image3-300x118.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image3-768x302.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image3-1536x604.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/image3.png 1654w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Nonostante la relativa semplicit\u00e0 di questi concetti, ci sono tanti fraintendimenti che si sono diffusi nelal community &#8211; vediamone alcuni esempi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>OOP = Classi. Le classi sono sicuramente un concetto fondamentale di Programmazione ad Oggetti, ma sono solo un pezzo di un puzzle molto pi\u00f9 ampio.<\/li>\n\n\n\n<li>Trattare gli oggetti come semplici strutture dati: escludendo casi particolari, l\u2019idea dell\u2019OOP presuppone che gli oggetti abbiano uno stato (dati interni) e dei comportamenti (funzioni pubbliche), non uno solo dei due.<\/li>\n\n\n\n<li>Abuso di ereditariet\u00e0: Spesso l\u2019ereditariet\u00e0 viene usata con uno scopo differente da quello per cui nasce: ereditariet\u00e0 significa che tra due classi c\u2019e una relazione di tipo \u201cessere\u201d (un Cane \u201c\u00e8 un\u201d Animale) mentre troppo spesso viene usata anche in situazioni di tipo \u201cavere\u201d (un Cane \u201cha\u201d la Coda), per cui esiste invece la composizione. Come ci insegna il vecchio adagio, dovremmo sempre \u201cpreferire la composizione rispetto all\u2019ereditariet\u00e0\u201d &#8211; perch\u00e8 le relazioni di tipo \u201cavere\u201d sono molto pi\u00f9 frequenti.<\/li>\n\n\n\n<li>Usare getters, setters e dare accesso in modifica a propriet\u00e0 pubbliche: gli oggetti devono comunicare tramite messaggi, ovvero le funzioni pubbliche, ed esporre comportamenti, non dati; i getters\/setters sono un finto incapsulamento che non risolve il vero problema di esporre dati.<\/li>\n<\/ol>\n\n\n\n<p>Ci sono ovviamente altri fraintendimenti, ma con questi esempi spero di aver reso chiaro che la maggior parte di queste situazioni sembra derivare dal dimenticarsi che gli oggetti non devnon condividere dati ma comportamenti.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Come riconoscere un codice problematico<\/h2>\n\n\n\n<p>Nel Software \u00e8 molto difficile essere d\u2019accordo su quale sia il design migliore, perch\u00e8 non esiste il design perfetto &#8211; \u00e8 molto pi\u00f9 semplice, invece, essere d\u2019accordo su cosa significhi codice \u201cscritto male\u201d.<\/p>\n\n\n\n<p>In particolare, tra i principi di Clean Code esiste il concetto di Code Smells che ci aiuta a dare delle definizioni ai tipici pattern problematici che possiamo incontrare nel codice.<\/p>\n\n\n\n<p>I Code Smells sono uno dei concetti pi\u00f9 importanti in Programmazione ad Oggetti: una volta che hai imparato a riconoscerli, il tuo feedback loop interno mentre scrivi codice migliorer\u00e0 drasticamente. Come ho scritto prima, non esiste il design perfetto: c\u2019e sempre un compromesso da qualche parte, e conoscere i Code Smell ci permette di accettare consciamente un compromesso invece di subirlo senza renderci conto della sua presenza.<\/p>\n\n\n\n<p>Trovo rilevante anche riflettere sul fatto che non vengano chiamati errori, ma <code>smell<\/code> &#8211; odori, puzze. Il motivo per questo nome \u00e8 che questi pattern non sono di per s\u00e8 un problema, sono i sintomi di un problema &#8211; vengono infatti divisi in due categorie riferite al tipo di problema che stanno evidenziando: smell di design e smell di codice.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Design smells<\/h3>\n\n\n\n<p>Gli smells di design sono quelli pi\u00f9 ad alto livello e sono sintomi di un problema grave &#8211; danno per\u00f2 poche informazioni riguardo alla causa. Se riconosciamo qualcuno di questi smell, dobbiamo mettere in discussione l\u2019architettura ed il design del nostro sistema.<\/p>\n\n\n\n<p>I design smell sono<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>rigidit\u00e0 (il sistema \u00e8 difficile da cambiare)<\/li>\n\n\n\n<li>fragilit\u00e0 (i cambiamenti causano errori inaspettati)<\/li>\n\n\n\n<li>immobilit\u00e0 (\u00e8 difficile creare componenti riutilizzabili)<\/li>\n\n\n\n<li>viscosit\u00e0 (fare le cose bene \u00e8 piu difficile di fare le cose male)<\/li>\n\n\n\n<li>complessit\u00e0 inutile (componenti o pattern implementativi che non dannobenefici al sistema o non sono usati)<\/li>\n\n\n\n<li>ripetizioni inutili (duplicazione di comportamenti)<\/li>\n\n\n\n<li>opacit\u00e0 (difficile da leggere e capire, non espressivo)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Code smells<\/h3>\n\n\n\n<p>I code smells sono sintomi molto pi\u00f9 a basso livello, pi\u00f9 facili e meno costosi da correggere, perch\u00e8 danno feedback sul design locale del codice.<\/p>\n\n\n\n<p>Possiamo riconoscere 5 categorie di code smells:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bloaters &#8211; sintomi legati a componenti troppo grandi, alcuni esempi: Metodi o Classi troppo grandi, utilizzo dei tipi primitivi nei metodi pubblici<\/li>\n\n\n\n<li>Couplers &#8211; sintomi legati ad un accoppiamento troppo alto, alcuni esempi: chiamate tra classi concatenate, o classi che dipendono da dettagli implementativi di un altra<\/li>\n\n\n\n<li>Object-Orientation Abusers &#8211; sintomi legati ad un utilizzo errato dei concetti di OOP, alcuni esempi: property temporanee aggiunte runtime ad un oggetto, o una classe che eredita da un altra pur avendo bisogno solo di una piccola porzione delle sue parti<\/li>\n\n\n\n<li>Change preventers &#8211; sintomi legati a problematiche che rendono le modifiche difficili, alcuni esempi: una classe che cambia troppo spesso per motivi diversi, oppure al contrario un cambiamento che causa tante piccole modifiche in tante classi in giro per il sistema<\/li>\n\n\n\n<li>Dispensables &#8211; sintomi di problemi accessori, alcuni esempi: commenti che spiegano il codice, duplicazione, o generalizzazione prematura<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Come evitare di fare questi errori<\/h2>\n\n\n\n<p>Ricapitolando, vogliamo imparare a riconoscere i Code Smell per poterli evitare, rimuovere o in alcuni casi accettare come trade-off consapevole.<\/p>\n\n\n\n<p>Ma come facciamo ad evitare di incappare in questi Code Smell?<\/p>\n\n\n\n<p>C\u2019\u00e8 in realt\u00e0 una pratica tanto semplice quanto poco conosciuta che possiamo utilizzare per assicurarci che le fondamenta dei principi di OOP vengano rispettate in modo naturale nel nostro codice: l\u2019 Object Calisthenics.<\/p>\n\n\n\n<p>L\u2019Object Calisthenics \u00e8 una pratica introdotta da Jeff Bay nella ThoughtWorks Anthology, e consiste in un set di 10 regole da rispettare quando scrivi il tuo codice &#8211; regole che hanno lo scopo di dare un confine alle nostre decisioni di design: non ti dicono cosa fare, ma pi\u00f9 che altro cosa non fare.<\/p>\n\n\n\n<p>Il nome prende ispirazione dalla pratica sportiva del&nbsp;Calisthenics, il cui nome nasce da due parole greche: &#8220;kal\u00f2s&#8221;, che significa bello, e &#8220;sth\u00e8nos&#8221;, che significa forte &#8211; perch\u00e8 il corpo di chi pratica questo sport diventer\u00e0 \u201cbello e forte\u201d. Le caratteristiche di questo sport sono quelle di poter essere praticato con nessun attrezzo (o quasi) e che gli esercizi possono essere adattati a qualunque livello atletico. Il parallelismo con le regole di Object Calisthenics \u00e8 evidente e spiega perch\u00e8 abbiano derivato il nome: grazie a queste regole, il nostro codice diventer\u00e0 \u201cbello e forte\u201d, ovvero \u201cfacile da leggere e cambiare\u201d, ed anche queste regole non richiedono uno specifico contesto o buy in da parte del team: possiamo semplicemente iniziare ad utilizzarle nel nostro lavoro individuale quotidiano.<\/p>\n\n\n\n<p>Credo fortemente che l\u2019Object Calisthenics sia troppo sottovalutato, e sia anzi il miglior modo di iniziare ad imparare la Programmazione ad Oggetti mettendo delle basi chiare e solide. Queste regole nascono con l\u2019obiettivo di prevenire i Code Smell e sono strettamente correlate ai principi SOLID, fornendo quindi un primo step verso la scrittura di un design facile da capire, mantenere ed estendere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Le 10 regole di Object Calisthenics<\/h3>\n\n\n\n<p><strong>1)<\/strong>&nbsp;Un solo livello di indentazione<\/p>\n\n\n\n<p>Mantieni un solo livello di indentazione nel codice, evitando di innestare tanti costrutti uno dentro l\u2019altro: questo favorisce sia la leggibilit\u00e0 che la creazione di metodi che facciano una sola cosa.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongExample<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">doSomething<\/span><span class=\"hljs-params\">(int $a)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> ($a &gt; <span class=\"hljs-number\">0<\/span>) {\n   <span class=\"hljs-keyword\">if<\/span> ($a &lt; <span class=\"hljs-number\">10<\/span>) {\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">true<\/span>;\n   }\n  }\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CorrectExample<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">isBetween1And10<\/span><span class=\"hljs-params\">(int $a)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> ($a &gt; <span class=\"hljs-number\">0<\/span>) {\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt; checkIfLowerThan10($a);\n  }\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n }\n\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">checkIfLowerThan10<\/span><span class=\"hljs-params\">(int $a)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> ($a &lt; <span class=\"hljs-number\">10<\/span>) {\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">true<\/span>;\n  }\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>2)<\/strong>&nbsp;Non usare gli \u201celse\u201d<\/h3>\n\n\n\n<p>Evitare gli \u201celse\u201d rende pi\u00f9 leggibile il codice perch\u00e8 possiamo avere una strada principale che si conclude alla fine del metodo, e nel mezzo gestire i casi particolari con delle guardie.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongExample<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">doSomething<\/span><span class=\"hljs-params\">(int $a)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> ($a &lt; <span class=\"hljs-number\">0<\/span>) {\n   <span class=\"hljs-comment\">\/\/ do something<\/span>\n  } <span class=\"hljs-keyword\">else<\/span> {\n   <span class=\"hljs-comment\">\/\/ handle special case<\/span>\n  }\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;<em><strong>(with guard)<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CorrectExample<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">doSomething<\/span><span class=\"hljs-params\">(int $a)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> ($a &gt; <span class=\"hljs-number\">0<\/span>) {\n   <span class=\"hljs-comment\">\/\/ guard to handle special case<\/span>\n   <span class=\"hljs-keyword\">return<\/span>;\n  }\n  <span class=\"hljs-comment\">\/\/ do something<\/span>\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>3)<\/strong>&nbsp;<strong>Wrap all primitives and string<\/strong><\/h3>\n\n\n\n<p>Nei metodi pubblici non dovremmo mai avere primitive come parametri, ma sempre oggetti.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongShop<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">buy<\/span><span class=\"hljs-params\">(int $money, string $productId)<\/span> <\/span>{\n  <span class=\"hljs-comment\">\/\/ do something<\/span>\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CorrectShop<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">buy<\/span><span class=\"hljs-params\">(Money $money, Product $product)<\/span> <\/span>{\n  <span class=\"hljs-comment\">\/\/ do something<\/span>\n }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Money<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">convert<\/span><span class=\"hljs-params\">(Currency $from, Currency $to)<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__toString<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... for example a specific format like \"$ 1.000,00\" *\/<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>4)<\/strong>&nbsp;<strong>First-class collections<\/strong><\/p>\n\n\n\n<p>Uguale alle 3, ma per gli array: nei metodi pubblici non dovremmo mai avere array nativi come parametri, ma sempre oggetti.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongLeague<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">newParticipants<\/span><span class=\"hljs-params\">(array $newParticipantsList)<\/span> <\/span>{\n  <span class=\"hljs-comment\">\/\/ do something<\/span>\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CorrectLeague<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">newParticipants<\/span><span class=\"hljs-params\">(Participants $newParticipants)<\/span> <\/span>{\n  <span class=\"hljs-comment\">\/\/ do something<\/span>\n }\n}\n\n<span class=\"hljs-comment\">\/\/ Participants class allow us to create a list of participants validating data and offer behavior of order and go throught all the list<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>5)<\/strong>&nbsp;<strong>No getters\/setters\/properties<\/strong><\/h3>\n\n\n\n<p>Come abbiamo gi\u00e0 detto: \u201cTell, don\u2019t ask\u201d. Scriviamo classi che espongano comportamenti, non dati.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongUser<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> Id $id;\n <span class=\"hljs-keyword\">public<\/span> Email $email;\n <span class=\"hljs-keyword\">public<\/span> Password $password;\n\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">setId<\/span><span class=\"hljs-params\">(Id $newId)<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">setEmail<\/span><span class=\"hljs-params\">(Email $newEmail)<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">setPassword<\/span><span class=\"hljs-params\">(Password $newPassword)<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getId<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;id; }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getEmail<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;email; }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getPassword<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;password; }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span> <\/span>{\n <span class=\"hljs-keyword\">private<\/span> Id $id;\n <span class=\"hljs-keyword\">private<\/span> Email $email;\n <span class=\"hljs-keyword\">private<\/span> Password $password;\n\n <span class=\"hljs-comment\">\/\/ you can only set them in constructor, then we only expose behaviors<\/span>\n\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">login<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n <span class=\"hljs-comment\">\/\/ ...<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>6)<\/strong>&nbsp;<strong>One dot per line<\/strong><\/h3>\n\n\n\n<p>Legge di Demetra, ricordate? Non devo conoscere dettagli implementativi di un metodo che utilizzo, ma solo la sua firma. Come svolge quel comportamento che mi fornisce non mi interessa.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongDog<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> WrongDogBody $body;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">body<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">WrongDogBody<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;body; }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongDogBody<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> WrongDogTail $tail;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">tail<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">WrongDogTail<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;tail; }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WrongDogTail<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">wag<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">void<\/span> <\/span>{ <span class=\"hljs-comment\">\/** wag the tail action *\/<\/span> }\n}\n<span class=\"hljs-comment\">\/\/ used somewhere<\/span>\n$dog = <span class=\"hljs-keyword\">new<\/span> WrongDog();\n$dog-&gt;body()-&gt;tail()-&gt;wag();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Dog<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> DogBody $body;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">expressHappiness<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">void<\/span> <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;body-&gt;wagTail(); }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DogBody<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">wagTail<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">void<\/span> <\/span>{ <span class=\"hljs-comment\">\/** do something *\/<\/span> <span class=\"hljs-keyword\">return<\/span>; }\n}\n\n<span class=\"hljs-comment\">\/\/ used somewhere<\/span>\n$dog = <span class=\"hljs-keyword\">new<\/span> Dog();\n$dog-&gt;expressHappiness();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>7)<\/strong>&nbsp;<strong>Don&#8217;t abbreviate<\/strong><\/h3>\n\n\n\n<p>Rendi sempre i nomi espliciti, senza usare abbreviazioni che possano causare fraintendimenti.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Calc<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">calcSumTwoNums<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** *\/<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Calculator<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">calculateSumOfTwoNumbers<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** *\/<\/span> }\n}\n\n<span class=\"hljs-comment\">\/\/ sum would be a good name for this method, just made an example to show problems with abbreviations so I didn't care about choosing the best name possible.<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>8)<\/strong>&nbsp;<strong>Keep all entities small<\/strong><\/h3>\n\n\n\n<p>Tieni tutte le \u201centit\u00e0\u201d di software esistenti di dimensioni piccole: classi piccole che si focalizzano su una sola cosa, metodi piccoli, moduli piccoli. In questo modo favorirai la coesione in modo naturale.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>9)<\/strong>&nbsp;<strong>No classes with more than 2 instance variables<\/strong><\/h3>\n\n\n\n<p>Piu variabili d\u2019istanza significano minore coesione nella classe: tipicamente definiamo \u201cattuatori\u201d le classi con un parametro d\u2019istanza e \u201corchestratori\u201d quelli con due. Dovremmo evitare di averne pi\u00f9 di due.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Example<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">(string $firstName, string $lastName, string $email, string $password)<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Example<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">(User $user)<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>10) All classes must have state<\/strong><\/h3>\n\n\n\n<p>Non usare i metodi statici, ed evita di creare classi \u201cutility\u201d\/\u201dhelpers\u201d che raggruppano comportamenti randomici scorrelati tra loro. Crea classi con responsabilit\u00e0 chiare ed uno stato interno da mantenere.<\/p>\n\n\n\n<p><em><strong>Wrong Example<\/strong><\/em>&nbsp;\u274c<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Utilities<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">translate<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... *\/<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em><strong>Correct Example<\/strong><\/em>&nbsp;\u2705<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Logger<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... it's state might include the logger technique and some persisted logs ... *\/<\/span> }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Translator<\/span> <\/span>{\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">translate<\/span><span class=\"hljs-params\">()<\/span> <\/span>{ <span class=\"hljs-comment\">\/** ... it's state might include the translations and languages ... *\/<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Se questo articolo ti \u00e8 piaciuto, sappi che \u00e8 parte di una serie mensile a tema Agile, il che significa che puoi\u00a0<a href=\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/agile-ed-il-suo-manifesto-quanto-sono-ancora-rilevanti-nel-2024\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">recuperare i precedenti<\/a>\u00a0e che ne arriveranno altri nei prossimi mesi! In pi\u00f9, se ti piace il mio stile, dai un occhiata a Learn Agile Practices, il mio ecosistema di contenuti online nei quali parlo di pratiche e metodologie Agile come TDD, CI, CD e molto altro a tema programmazione. <\/p>\n\n\n\n<p>Scopri tutto su <a href=\"https:\/\/www.learnagilepractices.com\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">learnagilepractices.com<\/a> e seguimi su <a href=\"https:\/\/www.linkedin.com\/in\/daniele-scillia\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">LinkedIn<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggetti e messaggi Sono sicuro che la maggior parte di voi sar\u00e0 d\u2019accordo con me: nel mondo software abbiamo un problema con la Programmazione ad Oggetti. Il paradigma OOP ha origine gi\u00e0 dagli anni \u201850 ed \u00e8 stato formalizzato nella fine dei \u201860, eppure dopo tutti questi anni c\u2019e ancora una curva di apprendimento per&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\">Read more<\/a><\/p>\n","protected":false},"author":194,"featured_media":26699,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10291],"tags":[],"collections":[11708],"class_list":{"0":"post-26649","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-cloud-it","8":"collections-dalla-community","9":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata? - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Questo articolo di Danthedev riflette sull difficile rapporto tra gli sviluppatori e la programmazione ad oggetti (OOP).\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?\" \/>\n<meta property=\"og:description\" content=\"Questo articolo di Danthedev riflette sull difficile rapporto tra gli sviluppatori e la programmazione ad oggetti (OOP).\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-25T08:30:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"danthedev\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@danielescillia\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"danthedev\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\"},\"author\":{\"name\":\"danthedev\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/ad992babe79ce1c495801784b71eedda\"},\"headline\":\"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?\",\"datePublished\":\"2024-03-25T08:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\"},\"wordCount\":1720,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp\",\"articleSection\":[\"Cloud\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\",\"name\":\"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata? - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp\",\"datePublished\":\"2024-03-25T08:30:00+00:00\",\"description\":\"Questo articolo di Danthedev riflette sull difficile rapporto tra gli sviluppatori e la programmazione ad oggetti (OOP).\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp\",\"width\":1792,\"height\":1024,\"caption\":\"programmazione a oggetti\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cloud\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/ad992babe79ce1c495801784b71eedda\",\"name\":\"danthedev\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/profile-pic-150x150.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/profile-pic-150x150.png\",\"caption\":\"danthedev\"},\"description\":\"XP Advocate, Agile practices and methodologies enthusiast, driven from his passion for Software Development. I am deeply passionate about Extreme Programming and Agile methodologies and practices, believing that they allow software development teams to be more effective and aim for technical excellence. I enjoy investing time to stay updated on new technologies and methodologies and improve my skills: I consider continuous improvement extremely important and I approach it through books, courses, conferences, meetups, and continuous training; my ideal company promotes and encourages this approach.\",\"sameAs\":[\"https:\/\/danthedev.carrd.co\/\",\"https:\/\/www.linkedin.com\/in\/daniele-scillia\/\",\"https:\/\/x.com\/danielescillia\",\"https:\/\/www.youtube.com\/channel\/UCow5aybmZhzR7HbPf8JmcmA\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/danthedev\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata? - Codemotion Magazine","description":"Questo articolo di Danthedev riflette sull difficile rapporto tra gli sviluppatori e la programmazione ad oggetti (OOP).","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/","og_locale":"en_US","og_type":"article","og_title":"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?","og_description":"Questo articolo di Danthedev riflette sull difficile rapporto tra gli sviluppatori e la programmazione ad oggetti (OOP).","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-03-25T08:30:00+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp","type":"image\/webp"}],"author":"danthedev","twitter_card":"summary_large_image","twitter_creator":"@danielescillia","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"danthedev","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/"},"author":{"name":"danthedev","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/ad992babe79ce1c495801784b71eedda"},"headline":"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?","datePublished":"2024-03-25T08:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/"},"wordCount":1720,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp","articleSection":["Cloud"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/","name":"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata? - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp","datePublished":"2024-03-25T08:30:00+00:00","description":"Questo articolo di Danthedev riflette sull difficile rapporto tra gli sviluppatori e la programmazione ad oggetti (OOP).","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp","width":1792,"height":1024,"caption":"programmazione a oggetti"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/programmazione-ad-oggetti-ci-sembra-cosi-complicata\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/"},{"@type":"ListItem","position":3,"name":"Cloud","item":"https:\/\/www.codemotion.com\/magazine\/it\/devops-it\/cloud-it\/"},{"@type":"ListItem","position":4,"name":"Perch\u00e8 la Programmazione ad Oggetti ci sembra cos\u00ec complicata?"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/ad992babe79ce1c495801784b71eedda","name":"danthedev","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/profile-pic-150x150.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/10\/profile-pic-150x150.png","caption":"danthedev"},"description":"XP Advocate, Agile practices and methodologies enthusiast, driven from his passion for Software Development. I am deeply passionate about Extreme Programming and Agile methodologies and practices, believing that they allow software development teams to be more effective and aim for technical excellence. I enjoy investing time to stay updated on new technologies and methodologies and improve my skills: I consider continuous improvement extremely important and I approach it through books, courses, conferences, meetups, and continuous training; my ideal company promotes and encourages this approach.","sameAs":["https:\/\/danthedev.carrd.co\/","https:\/\/www.linkedin.com\/in\/daniele-scillia\/","https:\/\/x.com\/danielescillia","https:\/\/www.youtube.com\/channel\/UCow5aybmZhzR7HbPf8JmcmA"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/danthedev\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-600x600.webp","author_info":{"display_name":"danthedev","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/danthedev\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/DALL\u00b7E-2024-03-21-17.38.50-A-minimalistic-and-diverse-digital-article-cover-in-widescreen-format-showcasing-the-relationship-between-software-developers-and-object-oriented-pro-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"danthedev","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/danthedev\/"},"uagb_comment_info":0,"uagb_excerpt":"Oggetti e messaggi Sono sicuro che la maggior parte di voi sar\u00e0 d\u2019accordo con me: nel mondo software abbiamo un problema con la Programmazione ad Oggetti. Il paradigma OOP ha origine gi\u00e0 dagli anni \u201850 ed \u00e8 stato formalizzato nella fine dei \u201860, eppure dopo tutti questi anni c\u2019e ancora una curva di apprendimento per&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/26649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/194"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=26649"}],"version-history":[{"count":2,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/26649\/revisions"}],"predecessor-version":[{"id":26704,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/26649\/revisions\/26704"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/26699"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=26649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=26649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=26649"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=26649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}