Implémentation de la fonctionnalité annuler/rétablir

Description

Il s'agit d'une implémentation de la fonctionnalité annuler/rétablir, et d'un exemple qui l'accompagne.

Cette source peut bien sûr servir de base pour implémenter cette fonctionnalité, mais peut aussi servir plus généralement d'exemple sur l'utilisation de la réflection, des interfaces, des attributs, des piles, et du dessin personnalisé de ListBox.

Cette implémentation utilise:
1. un objet pour centraliser la fonctionnalité,
2. une interface identifiant les objets proposant cette fonctionnalité, ainsi qu'une structure pour renseigner les informations sur l'annulation d'une méthode.
3. ou un attribut et une structure pour définir la manière dont une méthode peut s'annuler.

Une documentation pour cette source a été générée à l'aide de NDoc 3.1.3 ( http://ndoc.sourceforge.net/ ) qui est distribué sous licence OSI ( http://www.opensource.org/ ).

Cette source est d'abord compactée au format .tar, puis au format .zip pour tenir en moins de 500 Ko (c'est la documentation qui pèse le plus lourd).

Source / Exemple :


Des instructions sont présentes dans le fichier lisez-moi.txt à la racine de la source, ainsi que des commentaires sur l'implémentation.

Conclusion :


La source utilise la source RandomTools que je 'développe' aussi indépendemment, mais je ne mettrais pas systématiquement à jour RandomTools dans cette source.
Cette source risque fort d'être modifiée pour plusieurs raisons (ces remarques concernent l'utilisation avec attribut):
La réflection ne prend pas en compte les méthode privées pour le moment (mais cela ne devrait pas poser de problèmes).
La documentation est partiellement en anglais.
La structure ReversibleMethodFullInfo risque de se voir privée de ses champs de type string pour avoir des champs de type MethodInfo.
Les propriétés InvertParamMethod et ReinvertParamMethod de l'attribut InvertMethodAttribute devraient faire l'objet d'autres attributs directements apposés sur ces méthodes d'inversions de paramètres.
Cette source devrait être testable automatiquement.
Une commutativité 'simple' a été implémentée. Elle consiste à spécifier des classes de méthodes et à pouvoir intervertir l'ordre des actions lorsqu'elles appartiennent à deux classes différentes (ces classes ne forment pas forcemment une partition de l'ensemble des actions possibles, ce qui étends les possibilités). Pour l'instant une méthode n'appartient qu'à une classe, et peut être commutables avec les méthodes de plusieurs classes. Cette commutativité simple pourra être remplacée par une version plus élaborée tenant compte des paramètres des actions pour gérer leur commutativité.
La classe ImageListBox peut être améliorée : j'ai constaté de nombreux clignotements, et le redimensionnement des images ne fonctionne pas comme nous pourrions l'attendre (il faut réinitialiser ListBox.DrawMode).
Enfin, l'idéal serait de ne pas avoir à utiliser la méthode Push dans la méthode à annuler. Il faudrait pour cela un attribut qui permet d'exécuter une méthode lorsqu'une méthode s'exécute. Le seul moyen que je connais pour faire cela est de reconstruire un compilateur. Je vais me renseigner à ce sujet, et je suis à l'écoute de toute suggestion.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.