D'après ce que j'ai compris, l'objectif du modèle Command est d'aider à séparer l'interaction avec l'interface utilisateur de la logique de l'application. Avec des commandes correctement implémentées, un clic sur l'élément de menu "Imprimer" pourrait entraîner une chaîne d'interaction comme celle-ci :
(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
Cela vous encourage à séparer l'interface utilisateur de la logique de l'application.
J'ai regardé les commandes WPF, et pour la plupart, je vois comment ils ont implémenté ce modèle. Cependant, j'ai l'impression que dans une certaine mesure, ils ont compliqué le modèle Command et a réussi à l'implémenter de telle sorte que vous êtes découragé de séparer l'interface utilisateur de la logique de l'application.
Prenons par exemple cette simple fenêtre WPF qui comporte un bouton permettant de coller du texte dans la zone de texte :
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Paste"
Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<StackPanel>
<TextBox x:Name="txtData" />
<Button Command="Paste" Content="Paste" />
</StackPanel>
</Window>
Voici le code-behind :
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ApplicationCommands.Paste.Execute(null, txtData);
}
}
}
Qu'ai-je retiré de cette commande ? Il me semble que j'aurais pu tout aussi bien intégrer le code du gestionnaire d'événements de liaison de la commande dans le gestionnaire d'événements du bouton Click
événement. Bien sûr, je peux maintenant associer plusieurs éléments d'interface utilisateur à la commande Coller et je ne dois utiliser qu'un seul gestionnaire d'événement, mais que se passe-t-il si je veux coller dans plusieurs zones de texte différentes ? Je devrais rendre la logique du gestionnaire d'événements plus compliquée ou écrire plus de gestionnaires d'événements. Donc maintenant, j'ai l'impression d'avoir ceci :
(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|
Qu'est-ce que je rate ici ? Ça ressemble à une couche supplémentaire d'indirection pour moi.