Я зазвичай проходжу кілька кроків з цією проблемою, зупиняючись, коли не можу зрозуміти, як пройти далі.
Спочатку зробіть те, що зробили. Ідіть важко з DRY. Якщо ви не закінчите з великим волохатим безладом, ви закінчили. Якщо, як і у вашому випадку, у вас немає дублікату коду, але у кожного булевого значення перевірено його значення у 20 різних місцях, перейдіть до наступного кроку.
По-друге, розділіть код на блоки. Кожне булеве посилання посилається лише один раз (ну, може, іноді і двічі), щоб направити виконання на правий блок. З двома булевими, ви закінчуєте чотири блоки. Кожен блок майже однаковий. СУХИЙ пішов. Не робіть кожен блок окремим методом. Це було б більш елегантно, але введення всього коду одним методом полегшує або навіть можливо, щоб кожен, хто займається технічним обслуговуванням, бачив, що вони повинні робити кожну зміну в чотирьох місцях. З добре організованим кодом та високим монітором відмінності та помилки будуть майже очевидні. Тепер у вас є реконструйований код, і він запуститься швидше, ніж оригінальний заплутаний безлад.
По-третє, спробуйте захопити повторювані рядки коду з кожного з ваших блоків і перетворити їх у приємні, прості методи. Іноді ти нічого не можеш зробити. Іноді ти не можеш багато зробити. Але кожен твій дріб, який ти робиш, повертає тебе назад у бік DRY і робить код трохи легшим у дотриманні та безпечнішим у обслуговуванні. В ідеалі ваш оригінальний метод може не мати дублікату коду. У цей момент ви можете розбити його на кілька методів без булевих параметрів, а може і не зробити. Зручність коду для виклику зараз головне питання.
Я додав свою відповідь до великої кількості вже тут через другий крок. Я ненавиджу дублюючий код, але якщо це єдиний розумний спосіб вирішити проблему, зробіть це таким чином, щоб хтось з першого погляду дізнався, що ви робите. Використовуйте кілька блоків і лише один метод. Зробіть блоки максимально однаковими за іменами, проміжками, вирівнюваннями, ... усім. Потім відмінності повинні вискочити у читача. Це може зробити очевидним, як переписати його в DRY спосіб, а якщо ні, то підтримка буде досить зрозумілою.
createTrajectory...
функції викликають?