Je fais donc une méthode pour créer une ligne de salutation basée sur deux personnes à partir d'une base de données.
Il y a quatre paramètres: les deux noms ( name1
et name2
) et les deux sexes ( gender
et gender2
).
Pour chaque combinaison de genre, j'ai une sorte de sortie différente.
Par exemple: si le genre 1 est M
(homme) et le genre 2 l'est également M
, le résultat devrait être quelque chose comme:
Dear Sir name1 and Sir name2,
À ce moment, mon interrupteur ressemble à ceci:
switch(gender1){
case 'M':
switch(gender2){
case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break;
case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break;
case 'R': ...
}
break;
case 'W':
switch(gender2){
case 'M': printf("Dear Madame %s and Sir %s", name1, name2); break
case 'W': printf("Dear Madame %s and Madame %s", name1, name2); break;
case 'R': ...
}
break;
case ...etc.
}
Notez que j'ai plusieurs options de genre, comme 'R'
pour "Dear Relation"
et plus que je n'ai pas le temps de traduire.
Comment puis-je réduire cette déclaration de double commutation?
Mettre le deuxième commutateur dans une méthode n'est pas une option car il y a aussi un cas où les deux noms sont identiques et la sortie doit être combinée comme: "Dear Sir and Madame name1,"
gender1+gender2
.Madam
pasMadame
.Madame
est la forme française.Réponses:
Ajoutez le titre aux paramètres du printf:
vous pouvez extraire le commutateur à sa propre fonction pour la réutilisation et la compacité.
la source
genderToTitle
pour que vous n'ayez pas à la répéter? (Ou utilisez une boucle)Solution radicale: laissez l'utilisateur spécifier son propre titre (à partir d'une liste prédéfinie que vous fournissez).
Votre solution (vue à travers les yeux anglais) ne semble répondre qu'aux Lords ("Sir") et aux dames; la plupart des hommes seraient appelés "M.", la plupart des femmes "Miss", "Mrs" ou "Ms", selon leur état civil et leurs opinions personnelles. Ensuite, il y a toute une série d'autres titres honorifiques basés sur des classements professionnels - "Médecins", "Professeurs", "Révérends" et même, si vous vous sentez vraiment optimiste quant à votre site, "Sainteté"!
Solution plus simple: vous avez besoin d'une fonction [unique] pour traduire «genre» en un titre honorifique. Codez-le une fois et appelez-le pour les deux personnes:
la source
Dear Sir
comme forme d'adresse est parfaitement acceptable pour tous les hommes. Je conviens qu'en tant que titre , Sir (comme dansSir Phill
) devrait être réservé aux chevaliers (pas aux seigneurs), mais c'est une autre affaire.Les titres appartiennent vraiment à la base de données, mais vous avez déclaré que vous n'aviez aucun contrôle sur cela. Vous n'avez pas spécifié de balise de langue mais la syntaxe est dans la famille C, donc ce sera un pseudocode qui est presque C ++:
L'avantage est que vous enterrez la logique de sélection dans une structure de données plutôt que dans une structure de code: cela est similaire à la délégation à la base de données et est plus flexible. Si vous conservez cette carte comme constante statique quelque part, vous pouvez presque l' utiliser comme une base de données: elle devient une structure unique à mettre à jour qui peut être utilisée à de nombreux endroits du code sans avoir besoin d' écrire plus de code.
la source
static const
:static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};
. Eh bien, on peut laisser deconst
côté si la modification doit être autorisée.La réponse de Ratchet Freak est une bonne idée si les phrases sont toutes du même modèle, mais avec deux encarts, chacun dépendant uniquement de leur
gender1
respectifgender2
.La réponse de Phil W. est probablement la réponse la plus flexible car elle permet un contrôle explicite sur le message d'accueil, bien qu'il ait tout à fait raison, c'est un changement radical. Vous pourriez ne pas avoir les données sous cette forme.
La réponse de Kilian Foth est probablement la meilleure pour la question posée, bien qu'il dépende de l'activation d'une chaîne, ce qui pourrait ne pas être possible ou est probablement plus cher au moins.
Un raffinement de la réponse de Kilian consiste à calculer une valeur unique à partir des deux entrées et à activer cette fonction:
Bien sûr, comme vous obtenez les quatre entrées (2 noms et 2 genres) à partir d'une base de données, ajouter une autre table et vous y joindre pour obtenir la bonne salutation est probablement plus flexible et peut-être plus facile que ci-dessus.
la source
Si votre langue vous le permet, vous pouvez écrire
Ce n'est pas nécessairement mieux que votre version, car il y a toujours duplication, mais cela évite l'imbriqué
switch
.la source
Vous voudriez généralement que des chaînes d'interface utilisateur comme celle-ci soient extraites d'une table de chaînes au lieu d'être codées en dur dans le code source, pour la localisation et la facilité de mise à jour. Donc, l'approche que je prendrais serait d'utiliser les entrées pour construire une clé de recherche, donc quelque chose comme:
Les autres suggestions concernant la possibilité pour les utilisateurs de sélectionner leurs propres titres sont valables, si vous avez la possibilité d'obtenir ces informations. J'utiliserais toujours une recherche de table de chaînes dans la solution.
la source