{"id":2566,"date":"2025-01-04T14:23:52","date_gmt":"2025-01-04T14:23:52","guid":{"rendered":"https:\/\/www.giuseppemaccario.com\/it\/?p=2566"},"modified":"2025-01-08T13:47:56","modified_gmt":"2025-01-08T13:47:56","slug":"comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php","status":"publish","type":"post","link":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/","title":{"rendered":"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\">Sommario<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#introduzione\">Introduzione<\/a><\/li>\n\n\n\n<li><a href=\"#cos-%C3%A9-lo-strategy-pattern\">Cos&#8217;\u00e9 lo Strategy Pattern?<\/a><\/li>\n\n\n\n<li><a href=\"#strategy-pattern-un-esempio-concreto\">Strategy Pattern: un esempio concreto<\/a><\/li>\n\n\n\n<li><a href=\"#vantaggi-dello-strategy-pattern\">Vantaggi dello Strategy Pattern<\/a><\/li>\n\n\n\n<li><a href=\"#confronto-con-approcci-alternativi-istruzioni-condizionali\">Confronto con approcci alternativi: istruzioni condizionali<\/a><\/li>\n\n\n\n<li><a href=\"#confronto-con-approcci-alternativi-ereditariet%C3%A1\">Confronto con approcci alternativi: ereditariet\u00e1<\/a><\/li>\n\n\n\n<li><a href=\"#conclusione\">Conclusione<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"introduzione\">Introduzione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uno degli argomenti pi\u00fa interessanti quando parlo di programmazione \u00e9 sicuramente quello riguardante i <strong>Design Pattern<\/strong>. I Design Pattern sono soluzioni standard a problemi ricorrenti nella programmazione. Non \u00e9 un argomento nuovo, infatti uno dei libri pi\u00fa famosi e importanti a riguardo risale al 1994 e si intitola <em>&#8220;Design Patterns: Elements of Reusable Object-Oriented Software&#8221;<\/em> scritto dalla <em>Gangs of Four<\/em> (Gamma, Helm, Johnson, Vlissides). Il libro racchiude 23 Design Pattern, con esempi concreti come Lexi, un editor di testo, e spiega come utilizzare ed implementare i diversi pattern in diverse situazioni reali. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.giuseppemaccario.com\/it\/churn-php-refactoring-come-identificare-i-mostri-nel-tuo-progetto\/\">Dopo l&#8217;articolo su Churn PHP<\/a>, voglio estendere il discorso sullo <strong>Strategy Pattern<\/strong> che ho utilizzato molto spesso e che ho sempre trovato utilissimo per due motivi: migliorare la qualit\u00e1 del codice, e facilitare l&#8217;estendibilit\u00e0 del sistema. Questo pattern infatti permette di aggiungere nuovi comportamenti (o algoritmi) senza modificare il codice esistente, rispettando il secondo principio S.O.L.I.D., l&#8217;Open\/Closed, ovvero quel principio che afferma che un software deve essere aperto per estensioni, e chiuso per modifiche.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cos\u00e9-lo-strategy-pattern\">Cos&#8217;\u00e9 lo Strategy Pattern?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lo Strategy Pattern \u00e9 un <strong>Behavioral Design Pattern<\/strong> (o modello di progettazione comportamentale in italiano), che ci permette di organizzare una famiglia di algoritmi in differenti classi e ci permette di rendere gli oggetti di queste classi intercambiabili. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo approccio promuove il principio di composizione rispetto all&#8217;ereditariet\u00e0, consentendo di cambiare il comportamento di un oggetto a <em>runtime<\/em> senza dover modificare il suo codice. Lo Strategy Pattern \u00e8 particolarmente utile quando si desidera evitare complessi costrutti condizionali (come if-else o switch-case) e garantire una maggiore manutenibilit\u00e0 e flessibilit\u00e0 del codice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo come con un esempio pratico, scritto in PHP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"strategy-pattern-un-esempio-concreto\">Strategy Pattern: un esempio concreto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Immagina di avere diversi veicoli come macchina, moto, bus, camion, treno, nave e aereo. Ogni veicolo ha un motore e un modo di spostamento diverso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Auto diesel o a benzina, moto, bus, camion: hanno motori a combustione (diesel o benzina) e si spostano sulla terra.<\/li>\n\n\n\n<li>Auto elettrica: ha un motore elettrico e si sposta sulla terra.<\/li>\n\n\n\n<li>Treno: ha un motore elettrico o a combustione e si sposta su binari (terra).<\/li>\n\n\n\n<li>Nave: ha un motore marino e si sposta sull&#8217;acqua.<\/li>\n\n\n\n<li>Aereo: ha un motore a reazione o turbofan e si sposta nell&#8217;aria.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Usando lo <em>Pattern Strategy<\/em>, separiamo il comportamento del motore e del modo di spostamento in classi separate. Ogni veicolo avr\u00e0 delle strategie per il motore e per il modo di spostamento, che possono essere intercambiabili a runtime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per prima cosa dobbiamo definire un&#8217;interfaccia che ci permetter\u00e1 di raggruppare le classi secondo un contratto comune. Partiamo scrivendo l&#8217;interfaccia del motore.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Engine \n{\n    public function getEngineType(): string;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto possiamo creare tutti i tipi di motore necessari alla nostra applicazione:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class CombustionEngine implements Engine \n{\n    public function getEngineType(): string \n    {\n        return \"Internal combustion engine\";\n    }\n}\n\nclass ElectricEngine implements Engine \n{\n    public function getEngineType(): string \n    {\n        return \"Electric engine\";\n    }\n}\n\nclass DieselEngine implements Engine \n{\n    public function getEngineType(): string \n    {\n        return \"Diesel engine\";\n    }\n}\n\nclass FuelEngine implements Engine \n{\n    public function getEngineType(): string \n    {\n        return \"Fuel engine\";\n    }\n}\n\nclass ReactionEngine implements Engine \n{\n    public function getEngineType(): string \n    {\n        return \"Reaction engine\";\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Facciamo la stessa cosa con i differenti modi di spostamento. Per prima cosa scriviamo un&#8217;interfaccia comune:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Movement \n{\n    public function move(): string;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E quindi scriviamo le classi specifiche:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class LandMovement implements Movement \n{\n    public function move(): string \n    {\n        return \"Moving on land\";\n    }\n}\n\nclass WaterMovement implements Movement \n{\n    public function move(): string \n    {\n        return \"Moving on water\";\n    }\n}\n\nclass AirMovement implements Movement \n{\n    public function move(): string \n    {\n        return \"Flying in the air\";\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ora ci serve un <em>contesto<\/em>, ovvero una classe che deve avere i campi per memorizzare i riferimento delle strategie. Il contesto delega il lavoro a un oggetto strategia collegato, invece di eseguirlo da solo. Vediamo come:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Vehicle \n{\n    public function __construct(\n        private Engine $engine, \n        private Movement $movement,\n    ) {}\n\n    public function move() \n    {\n        return $this-&gt;movement-&gt;move();\n    }\n\n    public function getEngineType() \n    {\n        return $this-&gt;engine-&gt;getEngineType();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nota<\/strong>: come vedete, abbiamo sfruttato la funzionalit\u00e1 di PHP 8 chiamata <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.decon.php#language.oop5.decon.constructor.promotion\"><em>constructor property promotion<\/em><\/a>, in questo modo non dobbiamo scrivere esplicitamente le propriet\u00e1 <em>engine<\/em> e <em>movement<\/em> della class <em>Vehicle<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo tutto quello che ci serve per poter lavorare con i nostri veicoli. Ecco un esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$car = new Vehicle(new DieselEngine(), new LandMovement());\necho $car-&gt;move() . \" with \" . $car-&gt;getEngineType() . PHP_EOL;\n\n$car = new Vehicle(new ElectricEngine(), new LandMovement());\necho $car-&gt;move() . \" with \" . $car-&gt;getEngineType() . PHP_EOL;\n\n$ship = new Vehicle(new DieselEngine(), new WaterMovement());\necho $ship-&gt;move() . \" with \" . $ship-&gt;getEngineType() . PHP_EOL;\n\n$train = new Vehicle(new CombustionEngine(), new LandMovement());\necho $train-&gt;move() . \" with \" . $train-&gt;getEngineType() . PHP_EOL;\n\n$airplane = new Vehicle(new ReactionEngine(), new AirMovement());\necho $airplane-&gt;move() . \" with \" . $airplane-&gt;getEngineType() . PHP_EOL;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco il nostro output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Moving on land with Diesel engine\nMoving on land with Electric engine\nMoving on water with Diesel engine\nMoving on land with Internal combustion engine\nFlying in the air with Reaction engine<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Credo sia importante sottolineare come l&#8217;<strong>interfaccia<\/strong>, o <strong>contratto<\/strong>, sia il punto fondamentale qui. Sfruttando un&#8217;interfaccia comune, \u00e9 possibile sostituire gli oggetti durante l&#8217;esecuzione, ed \u00e9 proprio questo meccanismo che rende lo <em>Strategy Pattern<\/em> cos\u00ed potente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vantaggi-dello-strategy-pattern\">Vantaggi dello Strategy Pattern<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flessibilit\u00e0: \u00e9 possibile combinare qualsiasi tipo di motore con qualsiasi tipo di movimento. <\/li>\n\n\n\n<li>Modularit\u00e0: ogni comportamento (motore e movimento) \u00e8 separato in classi dedicate, quindi \u00e8 pi\u00f9 facile modificare o aggiungere nuove funzionalit\u00e0.<\/li>\n\n\n\n<li>Estensibilit\u00e0: \u00e9 possibile aggiungere nuovi tipi di motori e movimenti senza modificare le classi esistenti, rendendo il codice pi\u00f9 facile da mantenere e rispettando cos\u00ed il principio <em>Open\/Closed<\/em> (vedi S.O.L.I.D.).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ogni veicolo \u00e8 costruito &#8220;a pezzi&#8221; combinando un motore e un movimento. Questo rende pi\u00f9 facile estendere il sistema senza cambiare le classi esistenti, ed evita una complessa gerarchia di classi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"confronto-con-approcci-alternativi-istruzioni-condizionali\">Confronto con approcci alternativi: istruzioni condizionali<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lo <em>Strategy Pattern<\/em> \u00e8 preferibile rispetto a metodi pi\u00f9 classici come grandi istruzioni condizionali: manutenibilit\u00e0, flessibilit\u00e0, leggibilit\u00e0 e estensibilit\u00e0 del codice sono aspetti che lo <em>Strategy Pattern<\/em> aiuta a migliorare, permettendo di separare le diverse logiche di comportamento in classi distinte e intercambiabili, riducendo la complessit\u00e0 del codice e facilitando l&#8217;aggiunta di nuove funzionalit\u00e0 senza dover modificare il codice esistente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel caso di grandi istruzioni condizionali, lo <em>Strategy Pattern<\/em> aiuta ad evitare la crescita esponenziale della complessit\u00e0 e riducendo il rischio di errori in fase di manutenzione. Immagina di avere un sistema in cui la logica per determinare come si spostano i veicoli e quale motore utilizzano \u00e8 gestita tramite grandi istruzioni condizionali, come if o switch. Ecco un esempio di come potrebbe essere strutturato:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Vehicle \n{\n    public function __construct(\n        private string $type,\n    ) {}\n\n    public function move() \n    {\n        if ($this-&gt;type == \"car\") {\n            return \"Moving on land with Internal combustion engine\";\n        } elseif ($this-&gt;type == \"truck\") {\n            return \"Moving on land with Diesel engine\";\n        } elseif ($this-&gt;type == \"airplane\") {\n            return \"Flying in the air with Jet engine\";\n        } elseif ($this-&gt;type == \"ship\") {\n            return \"Moving on water with Diesel engine\";\n        } else {\n            return \"Unknown vehicle\";\n        }\n    }\n}\n\n$car = new Vehicle(\"car\");\necho $car-&gt;move() . PHP_EOL;\n\n$ship = new Vehicle(\"ship\");\necho $ship-&gt;move() . PHP_EOL;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E questo \u00e9 l&#8217;output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Moving on land with Internal combustion engine\nMoving on water with Diesel engine\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo ora i problemi principali di questo tipo di approccio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crescita esponenziale della complessit\u00e0: man mano che aggiungi nuovi veicoli o nuovi comportamenti, la logica condizionale cresce rapidamente. Ogni volta che un nuovo tipo di veicolo o di motore viene introdotto, devi aggiornare la logica condizionale, aumentando la complessit\u00e0 (<a href=\"https:\/\/www.giuseppemaccario.com\/it\/churn-php-refactoring-come-identificare-i-mostri-nel-tuo-progetto\/\">pu\u00f3 tornare utile ricordarsi del churn<\/a>).<\/li>\n\n\n\n<li>Difficolt\u00e0 di manutenzione: se, ad esempio, cambiano le specifiche di come un veicolo deve muoversi (ad esempio, cambiano i dettagli del motore di un aereo o di un camion), devi modificare tutte le condizioni interessate. Questo rende il codice difficile da mantenere nel lungo termine.<\/li>\n\n\n\n<li>Scalabilit\u00e0 limitata: ogni nuova funzionalit\u00e0 che richiede una logica complessa basata su condizioni (come l\u2019aggiunta di un nuovo tipo di movimento o di motore) richiede modifiche alle strutture condizionali esistenti, che non sono facili da estendere senza compromettere la leggibilit\u00e0 e la robustezza del codice.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"confronto-con-approcci-alternativi-ereditariet\u00e1\">Confronto con approcci alternativi: ereditariet\u00e1<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ora mettiamo in evidenza la differenza tra ereditariet\u00e0 e composizione. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ricordiamo il nostro dominio: ogni mezzo di trasporto ha un motore che pu\u00f2 variare a seconda del tipo di veicolo (ad esempio, un motore a combustione per una macchina, un motore elettrico per un treno, e cos\u00ec via). Inoltre, ogni mezzo si sposta in un ambiente diverso: terra, acqua, o aria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con l&#8217;ereditariet\u00e0, la gerarchia delle classi dipende dalle caratteristiche comuni dei mezzi di trasporto, ma se volessimo aggiungere nuove modalit\u00e0 o comportamenti, sarebbe necessario estendere le classi gi\u00e0 esistenti. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ecco lo stesso esempio usando l&#8217;ereditariet\u00e1:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Vehicle \n{\n    public function move() \n    {\n        return \"Moving...\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Generic engine\";\n    }\n}\n\nclass Car extends Vehicle \n{\n    public function move() \n    {\n        return \"Moving on land\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Internal combustion engine\";\n    }\n}\n\nclass Motorcycle extends Vehicle \n{\n    public function move() \n    {\n        return \"Moving on land\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Internal combustion engine\";\n    }\n}\n\nclass Bus extends Vehicle \n{\n    public function move() \n    {\n        return \"Moving on land\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Diesel engine\";\n    }\n}\n\nclass Truck extends Vehicle \n{\n    public function move() \n    {\n        return \"Moving on land\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Diesel engine\";\n    }\n}\n\nclass Train extends Vehicle \n{\n    public function move() \n    {\n        return \"Moving on rails\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Electric engine\";\n    }\n}\n\nclass Ship extends Vehicle \n{\n    public function move() \n    {\n        return \"Moving on water\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Diesel engine\";\n    }\n}\n\nclass Airplane extends Vehicle \n{\n    public function move() \n    {\n        return \"Flying in the air\";\n    }\n\n    public function getEngineType() \n    {\n        return \"Jet engine\";\n    }\n}\n\n\/\/ Application\n$car = new Car();\necho $car-&gt;move() . \" with \" . $car-&gt;getEngineType() . PHP_EOL;\n\n$ship = new Ship();\necho $ship-&gt;move() . \" with \" . $ship-&gt;getEngineType() . PHP_EOL;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ed ecco il nostro output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Moving on land with Internal combustion engine\nMoving on water with Diesel engine\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con l&#8217;ereditariet\u00e1 definiamo un comportamento comune tramite l&#8217;estensione di una classe base (superclasse).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo ora i problemi principali di questo tipo di approccio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il comportamento \u00e8 fisso una volta definita la gerarchia.<\/li>\n\n\n\n<li>Cambiare o aggiungere comportamenti richiede modifiche alla gerarchia o la creazione di nuove sottoclassi.<\/li>\n\n\n\n<li>Pu\u00f2 portare a una gerarchia complessa e difficile da gestire nel tempo.<\/li>\n\n\n\n<li>Duplicazione del codice: abbiamo definito almeno 3 volte il &#8220;Diesel engine&#8221;, una volta per ogni veicolo a motore diesel.<\/li>\n\n\n\n<li>Ogni classe ha pi\u00fa di una responsabilit\u00e1, violando cos\u00ed il primo principio S.O.L.I.D. riguardo la responsabilit\u00e1 singola di classi e metodi.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusione\">Conclusione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lo <em>Strategy Pattern<\/em> rappresenta una soluzione elegante e flessibile per gestire comportamenti intercambiabili nel nostro codice. Ci insegna un principio fondamentale della programmazione orientata agli oggetti: separare i comportamenti dalla logica principale per promuovere flessibilit\u00e0 e riusabilit\u00e0. Questo pattern consente di creare un codice che non solo soddisfa i requisiti attuali, ma \u00e8 anche progettato per adattarsi facilmente a nuove necessit\u00e0 senza compromettere la stabilit\u00e0 del sistema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel nostro esempio dei veicoli, il passaggio da approcci tradizionali basati su istruzioni condizionali o gerarchie complesse all&#8217;uso dello <em>Strategy Pattern<\/em> ha evidenziato come la composizione possa rendere il codice pi\u00f9 chiaro, manutenibile e facilmente estendibile. Questo approccio evita la proliferazione di classi specifiche o di condizioni nidificate, rendendo pi\u00f9 semplice gestire l&#8217;aggiunta di nuovi comportamenti o caratteristiche.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come dimostrato, separare i comportamenti in classi dedicate ci permette di costruire sistemi che rispettano i principi <em>Single responsability<\/em> e <em>Open\/Closed<\/em> di S.O.L.I.D., semplificando l&#8217;aggiunta di nuove funzionalit\u00e0 senza rischiare di introdurre regressioni o errori. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In definitiva, lo <em>Strategy Pattern<\/em> non \u00e8 solo una tecnica fondamentale di programmazione, ma una filosofia di progettazione che pone l&#8217;enfasi sull&#8217;organizzazione modulare e sulla capacit\u00e0 di evolversi. Adottarlo nei nostri progetti significa investire in un codice di qualit\u00e0, pronto a rispondere alle sfide di domani.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uno degli argomenti pi\u00fa interessanti quando parlo di programmazione \u00e9 sicuramente quello riguardante i Design Pattern. Vediamo come implementare lo Strategy Pattern in PHP per creare codice pi\u00f9 flessibile e manutenibile. <\/p>\n","protected":false},"author":1,"featured_media":2567,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","ngg_post_thumbnail":0,"footnotes":""},"categories":[84,38,27,82],"tags":[85,41],"class_list":["post-2566","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","category-php","category-programming","category-refactoring","tag-design-pattern","tag-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Comprendere lo Strategy Pattern in PHP - Giuseppe Maccario<\/title>\n<meta name=\"description\" content=\"Scopri come implementare lo Strategy Pattern in PHP per migliorare la qualit\u00e1 del codice e facilitare l&#039;estendibilit\u00e0 del sistema.\" \/>\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.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comprendere lo Strategy Pattern in PHP - Giuseppe Maccario\" \/>\n<meta property=\"og:description\" content=\"Scopri come implementare lo Strategy Pattern in PHP per migliorare la qualit\u00e1 del codice e facilitare l&#039;estendibilit\u00e0 del sistema.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/\" \/>\n<meta property=\"og:site_name\" content=\"Giuseppe Maccario\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-04T14:23:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-08T13:47:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/strategy-pattern-pexels-pixabay-46240-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1709\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"giuseppemaccario\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"giuseppemaccario\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/\"},\"author\":{\"name\":\"giuseppemaccario\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"headline\":\"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP\",\"datePublished\":\"2025-01-04T14:23:52+00:00\",\"dateModified\":\"2025-01-08T13:47:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/\"},\"wordCount\":1430,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/strategy-pattern-pexels-pixabay-46240-scaled.jpg\",\"keywords\":[\"design pattern\",\"php\"],\"articleSection\":[\"Design Pattern\",\"PHP\",\"Programming\",\"refactoring\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/\",\"name\":\"Comprendere lo Strategy Pattern in PHP - Giuseppe Maccario\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/strategy-pattern-pexels-pixabay-46240-scaled.jpg\",\"datePublished\":\"2025-01-04T14:23:52+00:00\",\"dateModified\":\"2025-01-08T13:47:56+00:00\",\"description\":\"Scopri come implementare lo Strategy Pattern in PHP per migliorare la qualit\u00e1 del codice e facilitare l'estendibilit\u00e0 del sistema.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/strategy-pattern-pexels-pixabay-46240-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/strategy-pattern-pexels-pixabay-46240-scaled.jpg\",\"width\":2560,\"height\":1709,\"caption\":\"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/\",\"name\":\"Giuseppe Maccario\",\"description\":\"Sviluppatore Software in Amsterdam (NL)\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/#\\\/schema\\\/person\\\/cb06a58fab509a897056972173e2e5dc\",\"name\":\"giuseppemaccario\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"url\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\",\"width\":50,\"height\":50,\"caption\":\"giuseppemaccario\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.giuseppemaccario.com\\\/it\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/giuseppe-maccario-experienced-software-developer-logo.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Comprendere lo Strategy Pattern in PHP - Giuseppe Maccario","description":"Scopri come implementare lo Strategy Pattern in PHP per migliorare la qualit\u00e1 del codice e facilitare l'estendibilit\u00e0 del sistema.","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.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/","og_locale":"it_IT","og_type":"article","og_title":"Comprendere lo Strategy Pattern in PHP - Giuseppe Maccario","og_description":"Scopri come implementare lo Strategy Pattern in PHP per migliorare la qualit\u00e1 del codice e facilitare l'estendibilit\u00e0 del sistema.","og_url":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/","og_site_name":"Giuseppe Maccario","article_published_time":"2025-01-04T14:23:52+00:00","article_modified_time":"2025-01-08T13:47:56+00:00","og_image":[{"width":2560,"height":1709,"url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/strategy-pattern-pexels-pixabay-46240-scaled.jpg","type":"image\/jpeg"}],"author":"giuseppemaccario","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"giuseppemaccario","Tempo di lettura stimato":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#article","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/"},"author":{"name":"giuseppemaccario","@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"headline":"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP","datePublished":"2025-01-04T14:23:52+00:00","dateModified":"2025-01-08T13:47:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/"},"wordCount":1430,"commentCount":0,"publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/strategy-pattern-pexels-pixabay-46240-scaled.jpg","keywords":["design pattern","php"],"articleSection":["Design Pattern","PHP","Programming","refactoring"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/","url":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/","name":"Comprendere lo Strategy Pattern in PHP - Giuseppe Maccario","isPartOf":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#primaryimage"},"image":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#primaryimage"},"thumbnailUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/strategy-pattern-pexels-pixabay-46240-scaled.jpg","datePublished":"2025-01-04T14:23:52+00:00","dateModified":"2025-01-08T13:47:56+00:00","description":"Scopri come implementare lo Strategy Pattern in PHP per migliorare la qualit\u00e1 del codice e facilitare l'estendibilit\u00e0 del sistema.","breadcrumb":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#primaryimage","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/strategy-pattern-pexels-pixabay-46240-scaled.jpg","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2025\/01\/strategy-pattern-pexels-pixabay-46240-scaled.jpg","width":2560,"height":1709,"caption":"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP"},{"@type":"BreadcrumbList","@id":"https:\/\/www.giuseppemaccario.com\/it\/comprendere-lo-strategy-pattern-soluzioni-eleganti-per-un-codice-flessibile-in-php\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.giuseppemaccario.com\/it\/"},{"@type":"ListItem","position":2,"name":"Comprendere lo Strategy Pattern: Soluzioni Eleganti per un Codice Flessibile in PHP"}]},{"@type":"WebSite","@id":"https:\/\/www.giuseppemaccario.com\/it\/#website","url":"https:\/\/www.giuseppemaccario.com\/it\/","name":"Giuseppe Maccario","description":"Sviluppatore Software in Amsterdam (NL)","publisher":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.giuseppemaccario.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":["Person","Organization"],"@id":"https:\/\/www.giuseppemaccario.com\/it\/#\/schema\/person\/cb06a58fab509a897056972173e2e5dc","name":"giuseppemaccario","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","url":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","contentUrl":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png","width":50,"height":50,"caption":"giuseppemaccario"},"logo":{"@id":"https:\/\/www.giuseppemaccario.com\/it\/wp-content\/uploads\/2018\/08\/giuseppe-maccario-experienced-software-developer-logo.png"}}]}},"_links":{"self":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/2566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/comments?post=2566"}],"version-history":[{"count":4,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/2566\/revisions"}],"predecessor-version":[{"id":2574,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/posts\/2566\/revisions\/2574"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media\/2567"}],"wp:attachment":[{"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/media?parent=2566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/categories?post=2566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giuseppemaccario.com\/it\/wp-json\/wp\/v2\/tags?post=2566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}