Насчёт protected в случаях, когда сомневаешься, это ты зря) Ты же по сути продумываешь свою программу, знаешь примерно, что в ней используешь, а protected на ветер не бросаются. Что же насчёт private, так храни там только переменные, чтобы они были под защитой класса от внешних изменений, методы же хранят обычно под public-ом, так можно вызывать их извне класса
Итого в итоге - переменные в private
Protected же только для наследований
Методы же в public , тем самым ты дефаешь переменные, но и имеешь к ним доступ в класс.