Oi Marcelo, tudo bom?
A ideia de acoplamento está mais relacionada ao impacto que uma mudança naquele ponto geraria no resto do sistema. Se o método calcular() fosse alterado, o impacto na manutenção do sistema seria, muito provavelmente, nenhum.
Ao mudarmos a regra de calculo apenas estamos mudando o conteudo desse método. Todos os lugares em que chamamos ele continuam chamando normalmente. Estamos mudando o comportamento do sistema sem impactar na manutenção. Isso significa que aqui não temos um alto acoplamento.
Algo que já é diferente para herança, por exemplo. Quando fazemos com que uma classe herde de outra estamos dizendo que uma depende da outra para existir. Que a definição delas são complementares. Isso significa que uma mudança em uma classe mãe pode afetar bastante o funcionamento das classes filhas e isso é um caso de alto acomplamento.
Quanto a coesão, estamos olhando para o nome da classe e o que ela faz. Uma classe coesa é aquela que possui funcionalidades relacionadas a oq ela descreve.
No nosso caso, a classe descreve uma CalculadoraDeSalario. Me parece bem justo uma calculadora de salario ter um método para calcular chamado calcula(). Outros que calculam porcentagens em cima desse valor também.
Me parece bem comum uma calculadora de salarios saber como fazer porcentagens. Nesse caso, é uma classe coesa.
Um exemplo de classe não coesa seria, dentro da CalculadoraDeSalario a gente ter um método chamado calculaDesconto($porcentagem)
. Embora um calculo de desconto não seja tão diferente de um calculo percentual de salario, não estamos falando de uma calculadora de salarios mais e sim de uma calculadora de descontos. Nesse caso não há coesão e o correto seria criar uma classe CalculadoraDeDescontos pra isso =)
Espero ter ajudado.
Abraço!