Comment imiter des transactions sur des objets. Par exemple, je souhaite supprimer l'élément d'une collection, puis ajouter le même élément à une autre collection en tant qu'action atomique. Il est possible de faire beaucoup de vérifications quand quelque chose a échoué et de tout reculer mais c'est ennuyeux. Y at-il une technique (pas de différence quelle langue (Java/C++/C#)) pour réaliser cela.Comment avoir des transactions sur des objets
Répondre
Pour les petits objets simples, vous pouvez utiliser un idiome copy-modify-swap. Copiez l'objet original. Faites les changements. Si tous les changements ont réussi, échangez la copie avec l'original. (En C++, swap est généralement efficace et sans échec.) Le destructeur nettoie alors l'original, au lieu de la copie.
Dans votre cas, vous copiez les deux collections. Supprimez l'objet de la première, ajoutez-le à la seconde, puis échangez les collections d'origine avec les copies. Cependant, cela peut ne pas être pratique si vous avez des objets volumineux ou difficiles à copier. Dans ces cas, vous devez généralement faire plus de travail manuellement.
Oui, modèle Memento http://en.wikipedia.org/wiki/Memento_pattern
Software transactional memory est une approche. Il n'y a pas de technologie agnostique pour cela que je connaisse.
Vous pouvez utiliser la méthode de Herb Sutters
Comme
class EmployeeDatabase
{
public void TerminateEmployee(int index)
{
// Clone sensitive objects.
ArrayList tempActiveEmployees =
(ArrayList) activeEmployees.Clone();
ArrayList tempTerminatedEmployees =
(ArrayList) terminatedEmployees.Clone();
// Perform actions on temp objects.
object employee = tempActiveEmployees[index];
tempActiveEmployees.RemoveAt(index);
tempTerminatedEmployees.Add(employee);
// Now commit the changes.
ArrayList tempSpace = null;
ListSwap(ref activeEmployees,
ref tempActiveEmployees,
ref tempSpace);
ListSwap(ref terminatedEmployees,
ref tempTerminatedEmployees,
ref tempSpace);
}
void ListSwap(ref ArrayList first,
ref ArrayList second,
ref ArrayList temp)
{
temp = first;
first = second;
second = temp;
temp = null;
}
private ArrayList activeEmployees;
private ArrayList terminatedEmployees;
}
Principalement, cela signifie diviser le code en 2 parties:
void ExceptionNeutralMethod()
{
//——————————
// All code that could possibly throw exceptions is in this
// first section. In this section, no changes in state are
// applied to any objects in the system including this.
//——————————
//——————————
// All changes are committed at this point using operations
// strictly guaranteed not to throw exceptions.
//——————————
}
Bien sûr, il est juste de montrer la méthode I signifie concernant ArrayList :). Il vaut mieux utiliser les médicaments génériques si possible, etc ...
EDIT
En outre, si vous avez une extrême fiabilité des exigences s'il vous plaît jeter un oeil à Régions d'exécution avec contraintes aussi.
Ce genre de chose devient plus facile lorsque vous utilisez des collections immuables. Dans une collection immutable, l'ajout ou la suppression d'un membre ne modifie pas la collection, elle renvoie une collection nouvelle. (La mise en œuvre de collections immuables qui peuvent le faire en utilisant peu de temps et d'espace est un problème délicat.)
Mais si vous avez des collections immuables, la logique devient beaucoup plus facile. Supposons que vous souhaitiez déplacer un élément de la collection de gauche vers la collection de droite:
newLeft = left.Remove(item);
newRight = right.Add(item);
gauche et droite n'ont pas changé; ils sont immuables. Maintenant, le problème que vous devez résoudre est un ensemble atomique de left = newLeft et right = newRight, ce qui n'est pas si difficile à résoudre.
Voir l'immuabilité d'Eric dans la série C# pour des exemples de collections immuables: http: // blogs.msdn.com/ericlippert/archive/tags/Immutability/default.aspx. – Brian
- 1. Comment avoir des objets imbriqués dans JS?
- 2. Comment gérer des sous-transactions ou des transactions imbriquées?
- 3. Win32: transactions sur des canaux anonymes
- 4. Contrôle des transactions sur plusieurs JVMs
- 5. Gestion des transactions Django
- 6. Couplage des transactions de messagerie et des transactions ADO.NET
- 7. Gestion des transactions
- 8. Comment implémentez-vous GetHashCode() sur des objets?
- 9. Comment lire le journal des transactions Oracle
- 10. Comment intercepter des événements sur des objets d'exécution
- 11. mysql_fetch_object sur des objets complexes
- 12. validation des transactions d'ouverture vb.net
- 13. Comment convertir des objets avec des objets imbriqués
- 14. Utilisation efficace des transactions SQL
- 15. Dois-je stocker des objets entiers ou des pointeurs sur des objets dans des conteneurs?
- 16. Les objets Javascript simples peuvent-ils avoir des événements?
- 17. SQL Server détecter des transactions et valider?
- 18. Portée des transactions dans WCF
- 19. évolutivité des transactions défaillantes mysql
- 20. la journalisation des transactions mercurial
- 21. La visibilité des objets sur les threads
- 22. Itiner sur des objets dans pyquery
- 23. Comment puis-je utiliser des transactions couvrant des procédures chaînées sur plusieurs serveurs?
- 24. Attente sur des objets après les avoir placés dans la file d'attente prioritaire en Java
- 25. Préserver la position sur l'écran après avoir mélangé des objets autour de
- 26. Django - filtrage sur des objets connexes génériques
- 27. Créer des objets tactiles interactifs sur Android
- 28. Spring: gestionnaire de transactions basé sur des annotations
- 29. Comment combiner des objets ActiveRecord?
- 30. Comment récupérer des objets Aggregate?
J'ai vu seulement 866 téléchargements. Est-il mature pour la production? –
Désolé; J'ai remarqué que c'était un projet plus ancien après avoir posté. Le commentaire a été mis à jour pour faire référence à l'entrée de Wikipédia, qui couvre certains des concepts sous-jacents. C'est un domaine de l'informatique en cours de développement. –