Как улучшить конструкцию if else по сбору характеристик?
Как привести к более красивому виду код? Я реализовал через if else, но выглядит достаточно убого:
const makeRecomendations = (wordsPerMinute, newAverage) => {
if (wordsPerMinute <= 119 && (newAverage >=5 && newAverage <=8) && output.length < 1) return 'Увеличьте скорость речи'
else if (wordsPerMinute <= 119 && newAverage <=5 && output.length < 1) return 'Увеличьте скорость речи\nГоворите громче'
else if (wordsPerMinute <= 119 && newAverage >=8 && output.length < 1) return 'Увеличьте скорость речи\nГоворите тише'
else if (wordsPerMinute <= 119 && (newAverage >=8) && output.length >= 1) return 'Увеличьте скорость речи\nГоворите тише\nКонтролируйте употребление слов паразитов'
else if (wordsPerMinute <= 119 && (newAverage <=5) && output.length >= 1) return 'Увеличьте скорость речи\nГоворите громче\nКонтролируйте употребление слов паразитов'
else if (wordsPerMinute <= 119 && (newAverage >=5 && newAverage <=8) && output.length >= 1) return 'Увеличьте скорость речи\nКонтролируйте употребление слов паразитов'
else if (wordsPerMinute >= 180 && (newAverage >=5 && newAverage <=8) && output.length < 1) return 'Не торопитесь во время доклада'
else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180) && newAverage <=5 && output.length < 1) return 'Говорите громче'
else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180) && newAverage >=8 && output.length < 1) return 'Говорите тише'
else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180) && (newAverage >=5 && newAverage <= 8) && output.length >= 1) return 'Контролируйте употребление слов паразитов'
else if ((wordsPerMinute >= 119 && wordsPerMinute <= 180) && newAverage <=5 && output.length >= 1) return 'Говорите громче\nКонтролируйте употребление слов паразитов'
else if (wordsPerMinute >=180 && newAverage <=5 && output.length >= 1) return 'Не торопитесь во время доклада\nГоворите громче\nКонтролируйте употребление слов паразитов'
else if (wordsPerMinute >=180 && (newAverage >=5 && newAverage <= 8) && output.length < 1) return 'Не торопитесь во время доклада'
else if (wordsPerMinute >=180 && (newAverage >=5 && newAverage <= 8) && output.length >= 1) return 'Не торопитесь во время доклада\nКонтролируйте употребление слов паразитов'
else if (wordsPerMinute <= 119 && (newAverage >=5 && newAverage <= 8) && output.length >= 1) return 'Увеличьте скорость речи'
else return "Вы потрясающий спикер!"
}
Ответы (2 шт):
Автор решения: ksa
→ Ссылка
Предложу такой вариант с разделением проверок...
const output = ['значит', 'короче']
const makeRecomendations = (wordsPerMinute, newAverage) => {
const a = []
if (wordsPerMinute <= 119) a.push('Увеличьте скорость речи')
if (wordsPerMinute >= 180) a.push('Не торопитесь во время доклада')
if (newAverage <= 5) a.push('Говорите громче')
if (newAverage >= 8) a.push('Говорите тише')
if (output.length) a.push('Контролируйте употребление слов паразитов')
if (a.length) return a.join('\n')
return 'Вы потрясающий спикер!'
}
const mess = makeRecomendations(100, 4)
console.log(mess)
Автор решения: Andrei Khotko
→ Ссылка
В качестве разнообразия предложу еще вариант: можно создать массив recomendations, который будет содержать условие для рекомендации и сообщение. И в функции пройтись по этому массиву, поочередно проверяя условия.
const recomendations = [
{
condition: (wordsPerMinute, newAverage, output) => (wordsPerMinute <= 119 && (newAverage >=5 && newAverage <=8) && output.length < 1),
message: 'Увеличьте скорость речи',
},
{
condition: (wordsPerMinute, newAverage, output) => (wordsPerMinute <= 119 && newAverage <=5 && output.length < 1),
message: 'Увеличьте скорость речи\nГоворите громче',
},
{
condition: (wordsPerMinute, newAverage, output) => (wordsPerMinute <= 119 && newAverage >=8 && output.length < 1),
message: 'Увеличьте скорость речи\nГоворите тише',
},
// и т.д.
];
const noRecomendations = 'Вы потрясающий спикер!';
function makeRecomendations_v2(wordsPerMinute, newAverage) {
for (let recomendation of recomendations) {
if (recomendation.condition(wordsPerMinute, newAverage, output)) {
return recomendation.message;
}
}
return noRecomendations;
}
const recomendation = makeRecomendations_v2(119, 4);