<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>strategy Archivi - Cesare Bordi | Innovation Manager &amp; Back-end Developer</title>
	<atom:link href="https://cesarebordi.it/tag/strategy/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cesarebordi.it/tag/strategy/</link>
	<description>Innovare con soluzioni software efficaci e gioco di squadra</description>
	<lastBuildDate>Sat, 15 Apr 2023 11:13:35 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://cesarebordi.it/wp-content/uploads/2016/02/CB-logo-88x88.png</url>
	<title>strategy Archivi - Cesare Bordi | Innovation Manager &amp; Back-end Developer</title>
	<link>https://www.cesarebordi.it/tag/strategy/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Design Pattern Strategy in Php</title>
		<link>https://cesarebordi.it/design-pattern-strategy-php/</link>
					<comments>https://cesarebordi.it/design-pattern-strategy-php/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Wed, 22 Mar 2023 08:43:26 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[contro]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[strategy]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=1427</guid>

					<description><![CDATA[<p>Lo strategy è tra i design pattern comportamentali più utilizzati. Permette di definire algoritmi e renderli interscambiabili. Vediamo come implementarlo in php.</p>
<p>L'articolo <a href="https://cesarebordi.it/design-pattern-strategy-php/">Design Pattern Strategy in Php</a> sembra essere il primo su <a href="https://cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Lo <strong>strategy</strong> è tra i <a href="https://www.cesarebordi.it/design-pattern-gof-guida/" target="_blank" rel="noreferrer noopener">design pattern comportamentali</a> più utilizzati nella <strong>programmazione ad oggetti</strong> (<strong>OOP</strong>) soprattutto in approcci <strong>MVC.</strong><br />Vediamo come <strong>implementarlo correttamente in PHP</strong> partendo dalla definizione data dalla <a href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank" rel="noreferrer noopener">Gang of Four</a> (GoF).</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Lo <strong>Strategy pattern</strong> definisce una famiglia di algoritmi, li incapsula e li rende interscambiabili tra di loro. Strategy permette di variare gli algoritmi indipendentemente dai client che li usano.</p>
</blockquote>



<p class="wp-block-paragraph">Il <strong>design pattern Strategy</strong> è utile quando si desidera selezionare l&#8217;algoritmo da utilizzare in fase di esecuzione ed è composto da tre elementi fondamentali:</p>



<ul class="wp-block-list">
<li>L&#8217;<strong>interfaccia o la classe astratta &#8220;Strategy&#8221;</strong>: definisce il contratto che deve essere implementato dalle classi che rappresentano le diverse strategie di algoritmo. L&#8217;interfaccia o la classe astratta può includere un o più metodi, che rappresentano le operazioni che l&#8217;algoritmo deve essere in grado di eseguire.</li>



<li>Le <strong>classi concrete delle strategie</strong>: queste classi implementano l&#8217;interfaccia o la classe astratta &#8220;Strategy&#8221; e rappresentano le diverse implementazioni degli algoritmi.</li>



<li>La <strong>classe &#8220;Context&#8221;</strong>: rappresenta il contesto in cui viene eseguito l&#8217;algoritmo e che utilizza una delle strategie disponibili per l&#8217;esecuzione. La classe &#8220;Context&#8221; deve accettare un&#8217;istanza di una delle classi concrete delle strategie attraverso il costruttore e/o un metodo setter.</li>
</ul>



<h2 class="wp-block-heading">Scenario di utilizzo</h2>



<p class="wp-block-paragraph">Il <strong>desgin pattern Strategy</strong> è utile in situazioni in cui è necessario avere la possibilità di cambiare il comportamento di un&#8217;operazione in modo flessibile e senza dover modificare il codice dell&#8217;operazione stessa.</p>



<p class="wp-block-paragraph">Esempi concreti di impiego possono essere:</p>



<ul class="wp-block-list">
<li><strong>Nel controller di un framework MVC</strong>, è possibile utilizzare il pattern Strategy per incapsulare la logica di business associata a un&#8217;azione specifica. Ad esempio, se un&#8217;azione richiede la validazione dei dati di input, è possibile utilizzare una classe di validazione Strategy per gestire questo compito in modo indipendente dalla logica di business principale.</li>



<li><strong>Nel modello di un framework MVC</strong>, è possibile utilizzare il pattern Strategy per gestire la connessione ai diversi database utilizzati dall&#8217;applicazione. In questo modo, è possibile rendere la scelta del database dinamica e intercambiabile a runtime.</li>



<li><strong>Nel template di un framework MVC</strong>, è possibile utilizzare il pattern Strategy per definire diverse strategie di rendering a seconda del tipo di visualizzazione richiesta. Ad esempio, è possibile utilizzare una classe di rendering HTML per le visualizzazioni web e una classe di rendering JSON per le API REST.</li>
</ul>



<h2 class="wp-block-heading">Esempio di pattern Strategy in PHP</h2>



<p class="wp-block-paragraph">Supponiamo di dover calcolare il prezzo di un prodotto in un negozio online, ma il prezzo può variare in base a diversi fattori, come il tipo di sconto, le imposte applicabili e le tariffe di spedizione.</p>



<p class="wp-block-paragraph">Invece di creare un metodo per ogni combinazione possibile di fattori, possiamo utilizzare il design pattern Strategy per creare un insieme di algoritmi, o strategie, che possono essere scelti in fase di esecuzione in base ai fattori specifici.</p>



<p class="wp-block-paragraph">Vediamo ora il codice di base per <strong>implementare</strong> questo pattern.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php" data-line="">// Creazione dell&#039;interfaccia della strategia
interface PricingStrategy {
    public function calculatePrice($product);
}

// Implementazione della prima strategia: nessuno sconto
class NoDiscountStrategy implements PricingStrategy {
    public function calculatePrice($product) {
        return $product-&gt;getPrice();
    }
}

// Implementazione della seconda strategia: sconto del 10%
class TenPercentDiscountStrategy implements PricingStrategy {
    public function calculatePrice($product) {
        return $product-&gt;getPrice() * 0.9;
    }
}

// Implementazione della terza strategia: sconto del 20%
class TwentyPercentDiscountStrategy implements PricingStrategy {
    public function calculatePrice($product) {
        return $product-&gt;getPrice() * 0.8;
    }
}

// Implementazione della classe prodotto
class Product {
    private $price;
    private $pricingStrategy;
    
    public function __construct($price, $pricingStrategy) {
        $this-&gt;price = $price;
        $this-&gt;pricingStrategy = $pricingStrategy;
    }
    
    public function getPrice() {
        return $this-&gt;pricingStrategy-&gt;calculatePrice($this);
    }
    
    public function setPricingStrategy($pricingStrategy) {
        $this-&gt;pricingStrategy = $pricingStrategy;
    }
}

// Utilizzo del codice
$product = new Product(100, new NoDiscountStrategy());
echo $product-&gt;getPrice(); // output: 100

$product-&gt;setPricingStrategy(new TenPercentDiscountStrategy());
echo $product-&gt;getPrice(); // output: 90

$product-&gt;setPricingStrategy(new TwentyPercentDiscountStrategy());
echo $product-&gt;getPrice(); // output: 80</code></pre>



<p class="wp-block-paragraph">In questo esempio, abbiamo creato un&#8217;interfaccia <code class="" data-line="">PricingStrategy</code> che definisce un metodo <code class="" data-line="">calculatePrice()</code>, che viene implementato dalle classi <code class="" data-line="">NoDiscountStrategy</code>, <code class="" data-line="">TenPercentDiscountStrategy</code> e <code class="" data-line="">TwentyPercentDiscountStrategy</code>.</p>



<p class="wp-block-paragraph">Abbiamo quindi creato una classe <code class="" data-line="">Product</code> che accetta un oggetto <code class="" data-line="">PricingStrategy</code> nel suo costruttore e ha un metodo <code class="" data-line="">getPrice()</code> che utilizza la strategia selezionata per calcolare il prezzo del prodotto.</p>



<p class="wp-block-paragraph">Infine, abbiamo creato un oggetto <code class="" data-line="">Product</code> con un prezzo di 100 e senza sconto, e abbiamo utilizzato il metodo <code class="" data-line="">setPricingStrategy()</code> per selezionare le altre strategie di sconto e calcolare il prezzo del prodotto in base ad esse.</p>



<h2 class="wp-block-heading">Vantaggi del design pattern strategy</h2>



<ul class="wp-block-list">
<li>Consente di isolare la logica di business in classi separate, rendendo il codice più modulare e facile da testare.</li>



<li>Permette di sostituire gli algoritmi utilizzati in modo semplice e senza dover modificare il codice esistente.</li>



<li>Favorisce l&#8217;estendibilità del codice, poiché nuovi algoritmi possono essere facilmente aggiunti senza dover modificare la struttura esistente.</li>
</ul>



<h2 class="wp-block-heading">Svantaggi del design pattern strategy</h2>



<ul class="wp-block-list">
<li>L&#8217;uso del pattern Strategy può portare a un aumento della complessità del codice, poiché richiede la creazione di molte classi aggiuntive.</li>



<li>Il pattern Strategy potrebbe non essere necessario in tutti i casi e potrebbe rappresentare una soluzione eccessiva in alcune situazioni.</li>
</ul>



<h2 class="wp-block-heading">Conclusioni</h2>



<p class="wp-block-paragraph">Il design pattern Strategy può essere una soluzione potente per creare codice modulare e flessibile, ma deve essere utilizzato con cautela e solo quando è effettivamente necessario.</p>



<p class="wp-block-paragraph">Per un panoramica generale consiglio di leggere l&#8217;<a href="https://www.cesarebordi.it/design-pattern-gof-guida/">articolo introduttivo sui <strong>design patterns</strong></a>.</p>
<p>L'articolo <a href="https://cesarebordi.it/design-pattern-strategy-php/">Design Pattern Strategy in Php</a> sembra essere il primo su <a href="https://cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cesarebordi.it/design-pattern-strategy-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
