Command pattern: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto"
 
(26 versioni intermedie di 21 utenti non mostrate)
Riga 1:
Nella [[Programmazione orientata agli oggetti|programmazione ada oggetti]], il '''Command pattern''' è uno dei pattern fondamentali, definiti originariamente dalla [[gangGang of fourFour (scrittori)|Gang of Four]].
 
Il Command pattern è uno dei [[design pattern]] che permette di isolare la porzione di codice che effettua un'azione (eventualmente molto complessa) dal codice che ne richiede l'esecuzione; l'azione è incapsulata nell'oggetto Command.
Riga 7:
== Struttura ==
 
[[File:CommandPattern.png|center|Struttura del Design Pattern '''Command'''|bordo|549x549px]]
 
== Esempio ==
 
In un modulo (python) è definitodefinita la classe che segue.
 
<sourcesyntaxhighlight lang=python>
class RoomHandler:
...
</syntaxhighlight>
</source>
 
Questa è destinata ada occuparsi della gestione delle camere di una casa nonché, attualmente, allo svolgimento di alcuni lavori da eseguire.
 
Sono infatti definite alcune sottoclassi che implementano diversi lavori che è possibile svolgere sulle pareti delle camere.
 
<sourcesyntaxhighlight lang=python>
class Painter(RoomHandler)
...
Riga 39:
def actionWork(self, arguments):
""" mount shelves to some walls """
</syntaxhighlight>
</source>
 
Questo approccio presenta diversi aspetti negativi.
 
# A fronte di ''n'' possibili lavori (azioni) si rendono necessarie diverse sottoclassi: una per ciascuna azione da implementare ede una per ogni possibile composizione di azioni base (adper esempio dipingere camera e montare di seguito gli scaffali). Qualora invece le azioni fossero ''Command'' indipendenti dal RoomHandler, sarebbe possibile creare istanze su quest'ultimo piuttosto che creare sottoclassi.
# ''RoomHandler'' contiene sia il codice di gestione delle camere che il codice che esegue le azioni: esso è sovraccarico di responsabilità ed estendere un'azione comporta un' aumento della complessità del ''RoomHandler''.
# Testare di oggetti con numerose responsabilità è in genere complesso ede oneroso. Incapsulare le azioni in ''Command'' rende possibile il testing esclusivo su ciascuna azione (eventualmente ricorrendo all'uso di [[Mock Objects|Mock]]) il che semplifica notevolmente la fase di testing e validazione.
 
Segue il codice equivalente strutturato seguendo le indicazioni del pattern:
 
<sourcesyntaxhighlight lang=python>
class Command:
 
Riga 69:
def execute(self, wall):
""" mount shelf to a wall """
</syntaxhighlight>
</source>
 
Sia nell'atto di creazione di un'istanza ''RoomHandler'', sia a ''run-time'', è possibile selezionare le azioni che si intende svolgere:
 
<sourcesyntaxhighlight lang=python>
def createRoomHandler(self):
handler = RoomHandler()
Riga 84:
for work in self.getWorks():
work.execute(self.getSelectedWall())
</syntaxhighlight>
</source>
 
== Considerazioni ==
 
# Il riceventeL'oggetto dell'operazione (nel nostro casonell'esempio unala parete) non è deciso al momento della creazione deidelle lavoriazioni ma a tempo di esecuzione.
# È possibile incapsulare un'azione in modo che essaquesta sia atomica. InÈ questocosì modopossibile si implementaimplementare un meccanismoparadigma basato disu transazionalitàtransazioni in cui un insieme di operazioni è svolto in toto o per nulla.
# I ''Command'', conoscendoi lequali sono a conoscenza delle operazioni che devonosono chiamati a svolgere, possono implementare anchefunzioni undi ''unexecute'' o ''undo''. SeIn necessariocasi ilcome Commandquesti, primail diCommand eseguire,può ricordamemorizzare lo stato precedente alla sua esecuzione, inripristinandolo modoqualora dal'operazione poterdebba annullareessere la sua operazioneannullata.
# È possibile rendere asincrona la scelta dei comandi rispetto alla loro esecuzione. Un certo numero di command, selezionati da un client, possono essere ''consumati'' da un altro oggetto che li riceve in un tempo diverso dalla loro selezione.
 
== Bibliografia ==
* [[Erich Gamma|Gamma, E.]], [[Richard Helm|Helm, R.]], [[Ralph Johnson (informatico)|Johnson, R.]] e [[John Vlissides|Vlissides, J.]], '' [[Design Patterns]]: elementi per il riuso di software a oggetti'', Addison Wesley, [[1995]], ISBN 88-7192-150-X.
** Originale: ''Design Patterns: Elements of Reusable Object-Oriented Software'', Addison Wesley, [[1995]], ISBN 0-201-63361-2.
 
== Altri progetti ==
{{interprogetto|preposizione=sul}}
 
{{Design Patterns Patternspattern}}
{{Portale|informatica}}
 
[[Categoria:PatternDesign pattern]]
 
[[bg:Команда (шаблон)]]
[[de:Kommando (Entwurfsmuster)]]
[[en:Command pattern]]
[[es:Command (patrón de diseño)]]
[[fr:Commande (patron de conception)]]
[[he:תבנית Command]]
[[ja:Command パターン]]
[[ko:Command 패턴]]
[[pl:Polecenie (wzorzec projektowy)]]
[[ru:Command]]
[[uk:Команда (шаблон проектування)]]
[[zh:命令模式]]