Этот код не уродлив, он простой, практичный, читаемый и легкий для понимания. Он будет изолирован в своем собственном методе, поэтому никому не придется иметь дело с ним в повседневной жизни. И на всякий случай, если кто-то должен это проверить - может быть, потому, что он отлаживает ваше приложение на предмет проблемы в другом месте - это настолько просто, что ему потребуется две секунды, чтобы понять код и то, что он делает.
Если бы я делал такую отладку, я был бы счастлив, если бы мне не пришлось тратить пять минут на попытки понять, что делает ваша функция. В этом отношении все другие функции полностью выходят из строя, поскольку они изменяют простую, забытую и избавляющую от ошибок процедуру, в сложном беспорядке, который люди при отладке будут вынуждены глубоко проанализировать и протестировать. Я, как руководитель проекта, сильно расстроился бы, если бы разработчик взял простую задачу и вместо того, чтобы реализовать ее простым и безвредным способом, тратит время на реализацию ее слишком сложным способом. Подумайте, сколько времени вы потратили на размышления об этом, а затем пришли к SO с просьбой, и все просто ради ухудшения обслуживания и читабельности.
Тем не менее, в вашем коде есть распространенная ошибка, которая делает его менее читабельным, и пару улучшений, которые вы можете легко сделать:
int angle = this->_car.getAbsoluteAngle();
if (angle <= 30 || angle >= 330)
return Car::EDirection::RIGHT;
else if (angle <= 60)
return Car::EDirection::UP_RIGHT;
else if (angle <= 120)
return Car::EDirection::UP;
else if (angle <= 150)
return Car::EDirection::UP_LEFT;
else if (angle <= 210)
return Car::EDirection::LEFT;
else if (angle <= 240)
return Car::EDirection::DOWN_LEFT;
else if (angle <= 300)
return Car::EDirection::DOWN;
else if (angle <= 330)
return Car::EDirection::DOWN_RIGHT;
Поместите это в метод, назначьте возвращаемое значение объекту, сверните метод и забудьте о нем на всю оставшуюся вечность.
PS есть еще одна ошибка, превышающая порог 330, но я не знаю, как вы хотите ее лечить, поэтому я ее вообще не исправил.
Позднее обновление
Согласно комментарию, вы даже можете избавиться от else, если вообще:
int angle = this->_car.getAbsoluteAngle();
if (angle <= 30 || angle >= 330)
return Car::EDirection::RIGHT;
if (angle <= 60)
return Car::EDirection::UP_RIGHT;
if (angle <= 120)
return Car::EDirection::UP;
if (angle <= 150)
return Car::EDirection::UP_LEFT;
if (angle <= 210)
return Car::EDirection::LEFT;
if (angle <= 240)
return Car::EDirection::DOWN_LEFT;
if (angle <= 300)
return Car::EDirection::DOWN;
if (angle <= 330)
return Car::EDirection::DOWN_RIGHT;
Я не делал этого, потому что чувствую, что в какой-то момент это становится просто вопросом личных предпочтений, и объем моего ответа заключался (и есть) в том, чтобы дать другую точку зрения на вашу озабоченность «уродством кода». Во всяком случае, как я уже сказал, кто-то указал на это в комментариях, и я думаю, что есть смысл показать это.
this->_car.getAbsoluteAngle()
один раз перед всем каскадом.