Внедрение зависимостей или какой-либо аналогичный механизм может помочь разделить слои вашей программы. Это, конечно, не универсальный молоток. Как уже упоминалось в Parapura, PIMPL - это еще одна практика, так же как и использование чистых виртуальных базовых классов в качестве интерфейсов (аналогично COM). Вы можете поднять его на еще более высокий уровень и разбить части вашей программы (там, где это имеет смысл) на свои собственные сервисы, доступные через REST или какой-либо специальный протокол.
Ничто из этого не заменит реальную работу, которую вам нужно сделать, а именно определить ваше истинное разделение интересов в вашей программе. Я нахожу полезным быть строгим и постоянно спрашивать себя «зачем мне это выставлять», даже если это кажется очевидным, что я должен это делать. Иногда ответы удивляют меня после долгих раздумий.
Итак, сначала проанализируйте, продумайте и разделите проблемы, затем начните использовать различные методы и инструменты, чтобы выяснить, как этого достичь.