Así que estoy haciendo un método para crear una línea de saludo basada en dos personas de una base de datos.
Hay cuatro parámetros: los dos nombres ( name1
y name2
) y los dos géneros ( gender
y gender2
).
Para cada combinación de género, tengo un tipo de salida diferente.
Por ejemplo: si el género 1 es M
(hombre) y el género 2 también M
, el resultado debería ser algo como:
Dear Sir name1 and Sir name2,
En este momento, mi interruptor se ve así:
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.
}
Tenga en cuenta que tengo varias opciones de género, como 'R'
for "Dear Relation"
y algunas más que no tengo tiempo para traducir.
¿Cómo puedo reducir esta declaración de doble interruptor?
Poner el segundo interruptor en un método no es una opción porque también hay un caso en el que ambos nombres son iguales y luego la salida debe combinarse como: "Dear Sir and Madame name1,"
gender1+gender2
.Madam
, noMadame
.Madame
es la forma francesaRespuestas:
Agregue el título a los parámetros de printf:
puede extraer el interruptor a su propia función para volver a usarlo y ser compacto.
fuente
genderToTitle
para que no tenga que repetirlo? (O use un bucle)Solución radical: deje que el usuario especifique su propio título (de una lista predefinida que proporcione).
Su solución (como se ve a través de los ojos ingleses) solo parece atender a los Lores ("Señor") y las damas; la mayoría de los hombres serían abordados como "Sr.", la mayoría de las mujeres como "Señorita", "Señora" o "Señora", dependiendo de su estado civil y sus opiniones personales. Luego hay una gran cantidad de otros honoríficos basados en posiciones profesionales: "Médicos", "Profesores", "Reverendos" e incluso, si se siente realmente optimista sobre su sitio, ¡"Santidad"!
Solución más simple: necesita una función [única] para traducir "género" en honorífico. Codifíquelo una vez y llámelo para ambas personas:
fuente
Dear Sir
como forma de domicilio es perfectamente aceptable para todos los hombres. Estoy de acuerdo en que, como título , Sir (como enSir Phill
) debería restringirse a los caballeros (no a los señores), pero ese es un asunto diferente.Los títulos realmente pertenecen a la base de datos, pero usted declaró que no tiene control sobre esto. No ha especificado una etiqueta de idioma, pero la sintaxis está en la familia C, por lo que será un seudocódigo que es casi C ++:
El beneficio de esto es que entierra la lógica de selección en una estructura de datos en lugar de una estructura de código: esto es similar a delegar en la base de datos y es más flexible. Si mantiene ese mapa como una constante estática en algún lugar, casi puede usarlo como una base de datos: se convierte en una estructura única para actualizar que se puede usar en muchos lugares del código sin necesidad de escribir más código.
fuente
static const
:static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};
. Bueno, uno puedeconst
omitir si se permite modificarlo.La respuesta de Ratchet Freak es una buena idea si las oraciones son todas del mismo patrón, pero con dos inserciones, una de las cuales solo depende de
gender1
cada unagender2
.La respuesta de Phil W. es probablemente la respuesta más flexible, ya que permite un control explícito sobre el saludo, aunque es bastante correcto, es un cambio radical. Es posible que no tenga los datos de esa forma.
La respuesta de Kilian Foth es probablemente la mejor para la pregunta formulada, aunque depende de encender una cadena, lo que podría no ser posible o al menos es más costoso.
Un refinamiento en la respuesta de Kilian es calcular un valor único de ambas entradas y activar eso:
Por supuesto, como está obteniendo las cuatro entradas (2 nombres y 2 géneros) de una base de datos, agregar otra tabla y unirse para obtener el saludo adecuado es probablemente más flexible y quizás más fácil que el anterior.
fuente
Si su idioma le permite hacerlo, puede escribir
No es necesariamente mejor que su versión, ya que todavía hay duplicación, pero evita el anidado
switch
.fuente
Por lo general, desearía que las cadenas de interfaz de usuario como esta se extraigan de una tabla de cadenas en lugar de estar codificadas en el código fuente, para su localización y facilidad de actualización. Entonces, el enfoque que tomaría sería usar las entradas para construir una clave de búsqueda, así que algo como:
Las otras sugerencias sobre permitir que los usuarios seleccionen sus propios títulos son válidas, si tiene la oportunidad de obtener esa información. Todavía usaría una búsqueda de tabla de cadenas en la solución.
fuente