Command pattern: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto"
 
(25 versioni intermedie di 20 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 ==
Riga 94:
 
== 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:命令模式]]