2009-07-11 7 views
0

Un grand nombre d'écrans différents dans mon application font référence à la même entité/objets métier encore et encore.
Actuellement, chaque écran fait référence à leur propre copie de chaque objet.
En outre, les objets d'entité peuvent eux-mêmes exposer l'accès à d'autres objets d'entité, à nouveau de nouvelles copies d'objets sont créées.
J'essaie de trouver une solution de mise en cache.Conception du cache: poids mouche des objets entité mutables basés sur une clé immuable

Je cherche quelque chose de similaire à boost :: flyweight.
Cependant, basé sur la valeur de clé/mutable immuable et la référence comptée.

boost::flyweight<key_value<long, SomeObject>, tag<SomeObject> > object; 

Ce qui précède est presque parfait. Je suis à la recherche d'un conteneur similaire qui donnera un accès mutable à SomeObject

Édition: J'aime la syntaxe et la sémantique du flyweight. Cependant, mouche poids ne permet que const SomeObject & accès, aucune chance de modifier l'objet.

Edit2: Code doit compiler sur MSVC++ 6

Toutes les idées?

+0

"Ce qui précède est presque parfait" - qu'est-ce qui ne va pas? –

+0

poids mouche permet uniquement l'accès const à l'objet (const SomeObject &) –

+0

voulez-vous qu'il soit modifiable pour ajouter des informations extrinsèques par poids mouche ou simplement pour modifier les informations intrinsèques partagées? – p00ya

Répondre

1

Tant que vous êtes heureux affectant l'état intrinsèque, puis à partir des internes dans boost/flyweight/key_value.hpp il semble que vous pouvez sortir avec un const_cast. Si vous avez votre propre extracteur de clé, vous devez vous assurer qu'il ne varie pas avec les opérations que le x mutable l'exposera.

flyweight<key_value<long, SomeObject> > kvfw(2); 
SomeObject &x = const_cast<SomeObject &>(static_cast<const SomeObject&>(kvfw)); 
+0

Je dois compiler sur MSVC++ 6, alors heurtez un hic avec boost. J'aurais dû mettre cela comme une exigence. –

+0

Cela fonctionne plutôt bien. J'ai caché les moulages dans l'opérateur-> et l'opérateur * –

0

Je pense que si vous faites des flyweights mutables, alors ils ne peuvent pas être légalement appelés flyweights. Imaginez une situation où les glyphes sont représentés comme des poids volants. Que se passera-t-il si une fonction change le code de la glyphe qui représente la lettre «A»? Une autre fonction qui affiche les glyphes à l'écran, essayera de dessiner 'A' et l'utilisateur pourrait finir par voir 'B' ou autre chose! Je pense que vous avez besoin de clés immuables se référant à des objets mutables. Ensuite, pensez à utiliser un hash table couplé à un mécanisme de comptage de référence.

+0

Je comprends votre point. Bien, n'est-ce pas ce que font les poids volants? Fournir une table de hachage statique des objets comptés de référence? J'aime la syntaxe de flyweights donc je voudrais trouver quelque chose qui est similaire. –

Questions connexes