Найдите баланс между
Coupling и
Coheasion.
Забудьте о классах и будет проще. Тогда все - модули. Приложение - модуль. Оно состоит из других модулей. Те используют другие модули и так далее организуем иерархию модулей. Классы это просто способ создания новых типов данных, для организации кода оно используется только в языках, где нет модулей (не ООП, а просто структурная единица кода, как в C++ например).
Они конечно позволяют организовать пространство имён
Пространства имен нужны тогда, когда все лежит в глобальной области видимости. Когда все существует в контексте модулей оно не нужно. У вас и так есть изоляция необходимая.
Вся задача сводится к тому, чтобы максимально порезать систему таким образом, чтобы полностью контролировать кому что доступно и кто чем пользуется. Декомпозиция в чистом виде, ну и инкапсуляция.