Как выбирать направление архитектуры ООП приложения?
и как отдельный класс-синглтон
Зачем? Зачем сингелтон? Ответте на вопрос когда это нужно?Есть ли практики, которым следует придерживаться, чтобы сделать правильную и простую архитектуру?
 - Разделение ответственности - важный принцип инженерного дела в принципе.
 - Принципы SOLID - хорошо дают понять как работать с зависимостями и делать декомпозицию системы. Сильно пересекается с инкапсуляцией, полиморфизмом и разделением ответственности.
 - Паттерны GRASP - эдакая смесь принципов и паттернов, описывают нюансы цикла жизни объектов и их взаимодействия друг с другом. 
 - Закон Деметры - про инкапсуляцию.
 - CQRS - подход по разделению операций записи и операций чтения. Естественно подход такой не работает если вам надо реализовать атомарную запись и чтение, но это минимальный набор задач.
 - Рефакторинг. Он нужен всегда. Его нужно делать по чуть-чуть когда видно что "уже мешает" или "можно было сделать лучше". Ну то есть это не переписывание всего и вся большими кусками, а маленькие изменения которые с течением времени эволюционно меняют архитектуру проекта. Возможно только если код покрыт тестами, это отдельная жирная тема.
Не нужно знать "архитектуры", они являются лишь результатом соблюдение принципов. И уж тем более "паттерны" это лишь элементы архитектуры. Не нужно на них зацикливаться, это лишь словарь.
https://en.wikipedia.org/wiki/Category:Programming...
Простите, вы только что написали нечто вроде -
Как лечат людей, как выбирают какие лекарства давать, какие назначать анализы.
Этому люди учатся в медицинских ВУЗах годами, затем интернатура, ординатура...
Практики наверно есть.
Но я их не знаю.
После 20 лет опыта это все происходит так:
Ну ты просто представляешь что там происходит внутри программы и понимаешь как нужно разделить на части и на какие именно части и к чему приведет выбор того или иного варианта.
Просто логически размышляешь - и решаешь.