Вроде все работает, все более менее оптимизировано, но мне все равно кажется, что мой код ужасен. ПРОСТО УЖАСЕН.
В принципе, не существует идеального кода, просто банально потому, что насчет этого существуют как минимум два разных мнения.
Что бы проверить, насколько код ужасен - внедрите новую фичу в ваш проект - если это сделать сложно, без изменения нынешней структуры, тогда вам нужен Рефакторинг, что как бы и подразумевает, что вы будете улучшать именно архитектуру. Рефакторинг можно применять до бесконечности, наделяя архитектуру новыми плюсами и новыми минусами.
Практический опыт важнее теории. По крайней мере изучение архитектуры уже предполагает наличие опыта