W przypadku każdego języka połączenie ich w jednym pakiecie jest w porządku. Ważne jest to, co jest wystawione na świat zewnętrzny i jak wygląda z zewnątrz. Nikt nie będzie wiedział ani nie dbał o to, czy implementacja znajduje się w tym samym pakiecie, czy nie.
Spójrzmy na ten konkretny przypadek.
Jeśli masz wszystkie publiczne rzeczy w jednym pakiecie, a prywatne rzeczy w innym pakiecie, które nie są publicznie ujawniane, klient biblioteki widzi jeden pakiet. Jeśli przenosisz rzeczy prywatne do paczki z rzeczami publicznie ujawnionymi, ale nie ujawniasz ich z paczki, klient widzi dokładnie to samo.
Tak więc ma to zapach reguły bez dobrego powodu: to podejmowanie decyzji na podstawie tego, co jest publicznie widoczne, a decyzja ta nie ma żadnego wpływu na to, co jest publicznie widoczne.
To powiedziawszy, jeśli w jakimkolwiek konkretnym przypadku wydaje się dobrym pomysłem podzielenie interfejsu i implementacji na oddzielne pakiety, zrób to od razu. Przychodzi mi do głowy to, że pakiet jest ogromny lub masz alternatywną implementację, którą możesz chcieć połączyć zamiast standardowej.