Então, eu estou criando um método para criar uma linha de saudação com base em duas pessoas de um banco de dados.
Existem quatro parâmetros: os dois nomes ( name1
e name2
) e os dois sexos ( gender
e gender2
).
Para cada combinação de gênero, tenho um tipo de saída diferente.
Por exemplo: se o gênero 1 for M
(homem) e o gênero 2 também M
, a saída deve ser algo como:
Dear Sir name1 and Sir name2,
No momento, meu switch fica assim:
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.
}
Observe que tenho várias opções de gênero, como 'R'
por "Dear Relation"
e mais algumas que não tenho tempo para traduzir.
Como posso reduzir essa declaração de chave dupla?
Colocar a segunda opção em um método não é uma opção, porque também existe um caso em que os dois nomes são iguais e, em seguida, a saída deve ser combinada como: "Dear Sir and Madame name1,"
gender1+gender2
.Madam
, nãoMadame
.Madame
é a forma francesa.Respostas:
Adicione o título aos parâmetros do printf:
você pode extrair a opção para sua própria função para reutilização e compactação.
fonte
genderToTitle
para que você não precise repeti-la? (Ou use um loop)Solução radical: deixe o usuário especificar seu próprio título (em uma lista predefinida que você fornece).
Sua solução (como vista através dos olhos ingleses) parece servir apenas para Lordes ("Senhor") e senhoras; a maioria dos homens seria chamada de "senhor", a maioria das mulheres como "senhorita", "sra" ou "sra", dependendo do estado civil e das opiniões pessoais. Depois, há uma série de outros honoríficos baseados em classificações profissionais - "Médicos", "Professores", "Reverendos" e até mesmo, se você estiver realmente otimista com seu site, "Santidade"!
Solução mais simples: você precisa de uma função [única] para traduzir "gênero" em um honorífico. Codifique-o uma vez e chame-o para as duas pessoas:
fonte
Dear Sir
como forma de endereço é perfeitamente aceitável para todos os homens. Concordo que, como título , Sir (como emSir Phill
) deve ser restrito a cavaleiros (não senhores), mas isso é uma questão diferente.Os títulos realmente pertencem ao banco de dados, mas você declarou que não tem controle sobre isso. Você não especificou uma marca de idioma, mas a sintaxe está na família C, portanto, será um pseudocódigo que é quase C ++:
O benefício disso é que você enterra a lógica de seleção em uma estrutura de dados em vez de em uma estrutura de código: é semelhante à delegação ao banco de dados e é mais flexível. Se você mantiver esse mapa como uma constante estática em algum lugar, quase poderá usá-lo como um banco de dados: ele se torna uma estrutura única para atualizar, que pode ser usada em muitos lugares do código sem precisar escrever mais código.
fonte
static const
:static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};
. Bem, pode-se deixar deconst
fora se a modificação for permitida.A resposta da catraca é uma boa idéia se as frases tiverem o mesmo padrão, mas com duas inserções, uma dependente apenas da
gender1
respectivagender2
.A resposta de Phil W. é provavelmente a resposta mais flexível, pois permite controle explícito sobre a saudação, embora ele esteja certo, é uma mudança radical. Você pode não ter os dados nesse formulário.
A resposta de Kilian Foth é provavelmente a melhor para a pergunta, embora ele dependa de ativar uma string, o que pode não ser possível ou provavelmente é mais caro, pelo menos.
Um refinamento na resposta de Kilian é calcular um valor único de ambas as entradas e ativar isso:
Obviamente, como você está obtendo todas as quatro entradas (2 nomes e 2 gêneros) de um banco de dados, adicionar outra tabela e se juntar a ela para obter a saudação adequada é provavelmente mais flexível e talvez mais fácil do que o descrito acima.
fonte
Se o seu idioma permitir, você pode escrever
Não é necessariamente melhor que a sua versão, pois ainda existe duplicação, mas evita o aninhado
switch
.fonte
Você normalmente deseja que cadeias de UI como essa sejam extraídas de uma tabela de cadeias, em vez de serem codificadas no código-fonte, para localização e facilidade de atualização. Portanto, a abordagem que eu adotaria seria usar as entradas para criar uma chave de pesquisa, algo como:
As outras sugestões sobre permitir que os usuários selecionem seus próprios títulos são válidas, se você tiver a oportunidade de obter essas informações. Eu ainda usaria uma pesquisa de tabela de string na solução.
fonte