Esta sentença, de permitir alterar os atributos de classes no mesmo pacote, definindo o modificador como protected ainda parece estranho - mesmo estando tratando de State Pattern.
Está ferindo o princípio "tell don't ask" ?
No código abaixo, copiado do exemplo dado no exercício, a quebra deste princípio parece notória, quando se está verificando um atributo da classe para alterar outro:
class Positivo implements EstadoDaConta {
public void saca(Conta conta, double valor) {
conta.saldo -= valor;
// -> Na linha abaixo, está ferindo o "Tell don't ask" !?
if(conta.saldo < 0) conta.estado = new Negativo();
}
}
Acessei o fórum do exercício anterior a este tópico, onde vi uma dúvida bem semelhante e com uma proposta de solução para manter os métodos originais de "Conta.depositar()" e "Conta.sacar()", utilizando o estado para calcular o valor de cada operação.
Estou ciente de que irei encontrar este tipo de programação nos fontes de projetos de empresas, no entanto, gostaria de saber se a afirmação deste tópico ainda é recomendável ou está desatualizada ?
Obrigado