Olá!
Estou fazendo esse post voltado principalmente para meus colegas de estudo. Haha, eu particularmente tive muita dificuldade em compreender quais são as diferenças entre o método if feito no método e a aplicação do instrutor que é diretamente no construtor...
Olhando muitos posts, houve uma clareza, mas principalmente mediante pesquisa, obtive muitas respostas. Então, irei fazer um sistema aqui onde eu indico minha pergunta e a resolução já com a conclusão que obtive da resposta, vamos lá ;)
Qual a diferença entre ter esse if no construtor ou no nosso public static Avaliacao Parse(string texto)?
R: Simples, chamando ele no public static Avaliacao, cometemos alguns "erros".
Apesar de criar um if aqui que informe ao usuário que ele não pode digitar um número negativo ou acima de 10, ou até mesmo como no meu uso do TryParse, alguma letra, acabamos por permitir que isso seja feito ainda no program.cs (de forma manual) caso o programador tentar fazer como fizemos no caso do Ira!, onde definimos 3 notas iniciais para a banda Ira!, você pode alterar uma por exemplo para -5 e ainda sim vai funcionar pois ele só faz a validação do if em casos enviados pelo ReadLine.
Sempre que você instancia uma classe, a primeira coisa que ele irá rodar é o construtor. Entendendo isso, te faz validar isso de uma vez só sem precisar validar isso todas as vezes com o Parse. Para esse caso exclusivamente, é o melhor uso nesse programa, te fazendo validar de forma única um exemplo que posso citar é se você tivesse várias chamadas (vamos imaginar que esse programa é usado ao público e tem 100 pessoas dando nota ao mesmo tempo). No método Parse, teríamos de validar constantemente agora no próprio construtor ele valida todas as entradas que forem usadas pelo construtor já de uma vez, validando onde recebe e não onde chama.
Colocando no construtor, o diferencial que eu não notei inicialmente é que ele não permite de maneira muito simples. Se a nota for exemplo -10, ele vai mudar automático para 0 e caso seja por exemplo 15, ele vai automaticamente mudar para 10. Garantindo que independente da nota fornecida ser superior a 10 ou inferior a 0, ele sempre vai ficar dentro da nossa regra estipulada de 0 a 10. Ou seja, a questão de exibir que a nota não foi computada como no meu código e pedir novamente uma nota é um caminho, mas o feito no construtor faz com que de forma automática ele sempre iguale a nota dentro da nossa regra. Mesmo que ele tente enviar 150, ele vai entender como um 10. Assim segue com o negativo, mesmo que o usuário informe uma nota -9192, ele vai automaticamente enviar a nota 0 sem a necessidade de ficar sempre repetindo ao usuário para ele escrever alguma nota (o que pode se tornar um loop).
Espero ter ajudado!
Meu codigo anteriormente feito de forma "errada"