Когда видимость метода стоит установить private, а когда — protected?
Если явно не надо делать protected (например метод переопределив который, вы позволите пользователю модифицировать поведение) — делайте private. На «всякий случай» делать protected — это по крайней мере странно, это все равно, что на всякий случай делать все public. Вообще, если вы пишете библиотеку, то так-же как вы определяете, что будет публичным интерфейсом (public) а что имплементацией (private), введите еще одну сущность — интерфейс для наследников. С таким делением (интерфейс для всех/интерфейс для наследников/детали имплементации) все должно стать более или менее понятно.
Тут уже хорошо ответили, но уточню: разница в зонах видимости/доступности, и это очень зависит от языка. Private — это локальная зона видимости (например, ограниченная юнитом, файлом, модулем, неймспейсом — для разных языков) то есть доступно из кода, составляющего одно логическое целое с этим классом. А Protected — это наоборот, видимость из всех порожденных от него классов, в каких бы файлах, модулях и юнитах они не находились.