2011-05-23 1 views
3

Je me suis toujours demandé quelle est la meilleure façon de gérer un bouton d'annulation d'une manière plus OO. Dans la hâte je finis toujours par mettre la vérification laide d'une propriété de forme booléenne si le bouton a été annulé de pas. Le fait est que cela rend le code sale, ayant beaucoup de "vérifications d'annulation" entre la logique qui compte.Meilleure façon OO de gérer le bouton "annuler"

je reçois toujours à quelque chose comme ceci:

void doLogic() 
{ 
    checkIfIsCancelled(); 
    callOtherFunction(); 

    checkIfIsCancelled(); 
    callAnotherFunction(); 

    checkIfIsCancelled(); 
    callAnotherFunction(); 

    checkIfIsCancelled(); 
    callAnotherFunction(); 
} 

J'espère avoir été assez clair. Je veux juste une façon plus propre de le faire :)

Répondre

1

Une bonne façon de gérer cela est le strategy pattern, où vous avez une stratégie par défaut où vous effectuez le traitement normal et vous avez une stratégie annulée. L'annulation change la stratégie en cancelledStrategy qui ne fait rien d'autre qu'un nettoyage. L'appel suivant ira à la cancelledStrategy. De cette façon, même le nettoyage est assez simple car vous savez exactement où dans le flux il a été annulé.

Une autre solution possible (mais très dépendante de votre situation) serait le modèle d'état, mais si vous en avez seulement besoin pour l'annuler, cela crée beaucoup de surcharge.

0

cela aiderait vraiment savoir ce que kit graphique que vous utilisez ici. Juste de cela, il est impossible de savoir si vous prenez à propos d'une machine windows, linux ou mac. Ajoutez à cela que je ne peux pas penser à une seule interface graphique qui fonctionnerait de cette manière.

La plupart des GUI fonctionnent avec un modèle 'callback' Des widgets (boutons, menus, listboxes etc.) sont créés et votre code attache un callback, un code pièce ou une méthode & qui est exécutée lorsqu'une action est exécutée sur un widget.

en java par exemple: "je poussais"

Button b = JButton("Push") ; 
listener = new ActionListener()_ { 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("I was pushed!") ; 
    } 
} ; 
b.addActionListener(listener) 

pour le message Organise à imprimer lorsque le bouton est enfoncé. Bien sûr, ces exemples minuscules omettent tout le travail que vous devez faire pour configurer votre fenêtre, peupler ce widget, etc.

+0

Je ne comprends pas pourquoi la connaissance de la boîte à outils ou de toute préoccupation de l'interface utilisateur devrait avoir de l'importance ici. Si la vue et le modèle sont correctement séparés, la manière dont la méthode d'annulation atteint la couche du modèle cesse d'être la question. Dans votre exemple, le rappel est juste un mécanisme pour envoyer le message au modèle. La manière dont le modèle accepte les entrées de la vue peut se faire via une interface. La question, si je comprends bien, est sur la façon de séparer la vérification basée sur l'état du flux logique par défaut. –

0

Vous pouvez utiliser le motif de commande le long d'une pile pour implémenter le support d'annulation multi-niveau.

Questions connexes