Je suis en train de concevoir une classe qui stocke (met en cache) un ensemble de données. Je veux rechercher une valeur, si la classe contient la valeur puis l'utiliser et modifier une propriété de la classe. Je suis préoccupé par la conception de l'interface publique.
Voici comment la classe va être utilisé:Meilleure conception pour la méthode de recherche et de modification possible
ClassItem *pClassItem = myClass.Lookup(value); if (pClassItem) { // item is found in class so modify and use it pClassItem->SetAttribute(something); ... // use myClass } else { // value doesn't exist in the class so add it myClass.Add(value, something); }
Cependant, je ne veux pas avoir à exposer CLASSITEM à ce client (CLASSITEM est un détail de mise en œuvre de MyClass). pour contourner que les éléments suivants pourraient être envisagées:
bool found = myClass.Lookup(value); if (found) { // item is found in class so modify and use it myClass.ModifyAttribute(value, something); ... // use myClass } else { // value doesn't exist in the class so add it myClass.Add(value, something); }
Toutefois, elle est inefficace Modifier devra recommencer la recherche. Cela suggère un type lookupAndModify de la méthode:
bool found = myClass.LookupAndModify(value, something); if (found) { // item is found in class ... // use myClass } else { // value doesn't exist in the class so add it myClass.Add(value, something); }
Mais rouler LookupAndModify dans une méthode qui semble être la conception très pauvre. Il ne modifie également que si la valeur est trouvée et donc le nom est non seulement lourd mais trompeur aussi bien.
Y a-t-il un autre meilleur design qui contourne ce problème? Tous les modèles de conception pour cela (je ne pouvais rien trouver par google)?
C'est quelque chose que j'ai d'abord considéré mais que j'ai oublié quand j'ai posté ma question. Je n'aime pas beaucoup utiliser des objets opaques car la sécurité de type devient un problème mais je suppose que tant que la classe est soigneusement construite c'est OK. – danio
Les objets opaques peuvent facilement être protégés. Vous n'avez pas besoin d'utiliser void *, vous pouvez utiliser MySecretThing * à la place. MySecretThing peut contenir beaucoup de choses privées ou un vide *. –