J'écris une classe qui représente un bouton. Ce bouton peut avoir ou non divers attributs tels qu'un texte écrit dessus, un raccourci, une texture ou un remplissage de couleur plat. Donc, si par exemple, ce bouton n'a aucun ensemble de texture, le processus de dessin de texture est ignoré. Ma première solution a été d'utiliser des valeurs par défaut inventées qui indiqueraient que l'attribut donné est inutilisé (si la valeur alpha de la couleur était 0, le dessin de remplissage de couleur serait ignoré etc.).Utilisation des valeurs std :: optionnel vs "inutilisé/par défaut"
L'autre option que j'ai est d'utiliser std :: optionnel nouvellement ajouté qui serait beaucoup plus clair et plus simple à utiliser.
Voici les 2 exemples cités:
class Button {
void draw() {
if (fill)
drawRectangle(*fill);
if (sprite)
drawSprite(*sprite);
if (font)
drawText(name, *font);
}
std::optional<std::string> font;
std::optional<std::string> sprite;
std::optional<Color> fill;
}
class Button {
void draw() {
if (fill.alpha != 0)
drawRectangle(fill);
if (sprite != "")
drawSprite(sprite);
if (font != "")
drawText(name, font);
}
std::string font;
std::string sprite;
Color fill;
}
Que peuvent les avantages et l'utilisation disadvatages std :: en option dans ce cas? Ce qui m'intéresse principalement, ce sont l'utilisation de la mémoire et les différences de frais généraux.
Devrais-je simplement, au lieu d'utiliser si pour vérifier si facultatif contient une valeur, appeler la valeur() et attraper l'exception?
En ce qui concerne votre question sur l'utilisation de '.value()' et d'attraper l'exception au lieu de vérifier si elle a une valeur: C'est une mauvaise idée. Comme son nom l'indique, les exceptions sont exceptionnelles, et le surcoût causé par le déroulement de la pile n'est pas négligeable. En supposant que beaucoup de boutons, par ex. n'a pas de couleur, l'option étant vide n'est pas un cas exceptionnel du tout. – Corristo
Je ne vois pas 'std :: optionnel' comme extrêmement utile, à moins qu'une chaîne vide ne soit différente d'aucune chaîne. –
'std :: optional' était destiné aux retours de fonctions, pas aux membres de la classe. C'est une chose très inutile à faire. Notez également que 'sprite.empty()' devrait être utilisé sur 'sprite ==" "'. – Pubby