Поэтому я делаю метод для создания линии приветствия на основе двух человек из базы данных.
Существует четыре параметра: два имени ( name1
и name2
) и два пола ( gender
и gender2
).
Для каждой гендерной комбинации у меня есть разные результаты.
Например: если пол 1 M
(мужчина) и пол 2 также M
, результат должен быть примерно таким:
Dear Sir name1 and Sir name2,
На данный момент мой переключатель выглядит так:
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.
}
Обратите внимание, что у меня есть несколько вариантов пола, например, 'R'
for "Dear Relation"
и некоторые другие, которые у меня нет времени для перевода.
Как я могу уменьшить этот оператор двойного переключения?
Ввод второго переключателя в метод не является вариантом, потому что есть также случай, когда оба имени совпадают, и затем выходные данные должны быть объединены следующим образом: "Dear Sir and Madame name1,"
gender1+gender2
.Madam
нетMadame
.Madame
это французская форма.Ответы:
Добавьте заголовок к параметрам printf:
Вы можете извлечь переключатель для его собственной функции для повторного использования и компактности.
источник
genderToTitle
чтобы вам не пришлось повторять это? (Или используйте петлю)Радикальное решение: позвольте пользователю указать свой собственный заголовок (из предопределенного списка, который вы предоставляете).
Ваше решение (если смотреть глазами англичан) кажется только для лордов («сэр») и дам; большинство мужчин будут называться «мистер», большинство женщин - «мисс», «миссис» или «мисс», в зависимости от их семейного положения и личных мнений. Тогда есть целый ряд других почетных званий, основанных на профессиональных позициях - «Доктора», «Профессора», «Преподобные» и даже, если вы действительно оптимистично настроены по поводу вашего сайта, «Святость»!
Более простое решение: вам нужна [одна] функция, чтобы перевести «пол» в почетный. Запишите это один раз и назовите это для обоих людей:
источник
Dear Sir
как форма обращения вполне приемлема для всех мужчин. Я согласен, что в качестве титула сэр (как вSir Phill
) должен быть ограничен рыцарями (не лордами), но это другой вопрос.Названия действительно принадлежат базе данных, но вы заявили, что не можете это контролировать. Вы не указали языковой тег, но синтаксис в семействе C, так что это будет псевдокод, почти C ++:
Преимущество этого заключается в том, что вы скрываете логику выбора в структуре данных, а не в структуре кода: это похоже на делегирование в базу данных и является более гибким. Если вы храните эту карту как статическую константу где-то, вы можете почти использовать ее как базу данных: она становится единой структурой для обновления, которая может использоваться во многих местах кода без необходимости писать больше кода.
источник
static const
:static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};
. Ну, можно оставитьconst
вне, если изменение должно быть разрешено.ответ ratchet freak - хорошая идея, если все предложения имеют одинаковую структуру, но с двумя вставками, каждое из которых зависит только от
gender1
соответствующегоgender2
.Ответ Фила У., пожалуй, самый гибкий, поскольку он позволяет явно контролировать приветствие, хотя он совершенно прав, это радикальное изменение. Вы можете не иметь данных в этой форме.
Ответ Килиана Фота, вероятно, является наилучшим для заданного вопроса, хотя он зависит от включения строки, что может быть невозможным или, по крайней мере, более дорогим.
Уточнение ответа Килиана заключается в вычислении одного значения из обоих входов и включении этого:
Конечно, поскольку вы получаете все четыре входных данных (2 имени и 2 пола) из базы данных, добавление еще одной таблицы и присоединение к ней для получения правильного приветствия, вероятно, будет более гибким и, возможно, более простым, чем описанное выше.
источник
Если ваш язык позволяет вам это сделать, вы можете написать
Это не обязательно лучше, чем ваша версия, так как дублирование сохраняется, но оно позволяет избежать вложенности
switch
.источник
Обычно вы хотели бы, чтобы подобные строки пользовательского интерфейса извлекались из таблицы строк, а не жестко кодировались в исходном коде для локализации и простоты обновления. Поэтому подход, который я бы выбрал, состоял бы в том, чтобы использовать входные данные для создания ключа поиска, что-то вроде:
Другие предложения о разрешении пользователям выбирать свои собственные названия действительны, если у вас есть возможность получить эту информацию. Я бы все еще использовал поиск таблицы строк в решении.
источник