As variáveis protegidas devem ser evitadas porque:
- Eles tendem a gerar problemas de YAGNI . A menos que você tenha uma classe descendente que realmente faça coisas com o membro protegido, torne-a privada.
- Eles tendem a gerar problemas de LSP . Variáveis protegidas geralmente têm alguma invariância intrínseca associada a elas (ou então elas seriam públicas). Os herdeiros precisam manter essas propriedades, que as pessoas podem estragar ou violar intencionalmente.
- Eles tendem a violar o OCP . Se a classe base faz muitas suposições sobre o membro protegido, ou o herdeiro é muito flexível com o comportamento da classe, isso pode levar ao comportamento da classe base sendo modificada por essa extensão.
- Eles tendem a levar à herança por extensão, em vez de composição. Isso tende a levar a um acoplamento mais rígido, mais violações de SRP , testes mais difíceis e uma série de outras coisas que se enquadram a discussão "favorecer composição sobre herança".
Mas, como você vê, todos estes são 'tendem a'. Às vezes, um membro protegido é a solução mais elegante. E as funções protegidas tendem a ter menos desses problemas. Mas há várias coisas que fazem com que sejam tratadas com cuidado. Com qualquer coisa que exija esse tipo de cuidado, as pessoas cometem erros e, no mundo da programação, isso significa bugs e problemas de design.