Как часто бывает в программировании, это сильно зависит от ситуации.
Например, какова сплоченность рассматриваемых классов? Они тесно связаны? Они полностью ортогональны? Они связаны по функциональности?
Для веб-фреймворка было бы нецелесообразно предоставлять виджеты общего назначения. Какой бы файл не содержал BaseWidget, TextWidget, CharWidget и т. Д.
Пользователь каркаса не будет ошибаться при определении файла more_widgets, который будет содержать дополнительные виджеты, которые они получают из виджетов каркаса для своего конкретного доменного пространства.
Когда классы ортогональны и не имеют ничего общего друг с другом, группирование в один файл действительно будет искусственным. Предположим приложение для управления роботизированной фабрикой, которая собирает автомобили. Файл, называемый частями, содержащий CarParts и RobotParts, был бы бессмысленным ... маловероятно, чтобы существовала большая связь между заказом запасных частей для технического обслуживания и деталями, которые производит завод. Такое присоединение не добавит никакой информации или знаний о системе, которую вы разрабатываете.
Возможно, лучшее эмпирическое правило - не ограничивать свой выбор эмпирическим правилом. Эмпирические правила создаются для анализа первого среза или для ограничения выбора тех, кто не способен сделать правильный выбор. Я думаю, что большинство программистов хотели бы верить, что они способны принимать правильные решения.