Funções de extensão
– coerceAtLeast e coerceAtMost
Se essas funções fossem descritas em português poderiam ser algo como, “coagirPeloMinimo” e “coagirPeloMaximo”
Eu acho essas duas funções bastante úteis em uma implementaçõe onde eu tenha que garantir que um valor não seja menor que o mínimo ou maior que o máximo especificado, e o legal é que ela aceita todos os tipos básicos. Isso significa que eu posso trabalhar com Dates, Doubles, Long…. etc
Vamos começar testando dois exemplos bem simples.
Primeiro vamos usar um inteiro e em seguida vamos ver um exemplo com datas:
println(100.coerceAtLeast(10))
println(10.coerceAtLeast(100))
100
100
No exemplo acima, temos duas implementações usando o coerceAtLeast e ambas trazem o mesmo resultado 100.
Mas por quê isso acontece?
No primeiro “print” eu tenho o inteiro 100 e ao usar a função de extensão coerceAtLeast(10) estou dizendo que quero garantir que o menor inteiro possível nessa implementação seja 10, então se estou trazendo um valor maior, ele será o valor impresso, pois está dentro do critério pré-definido quando chamamos a função de extensão coerceAtLeast(10).
Já no segundo “print” eu tenho o inteiro 10 e estou usando a mesma função coerceAtLeast, só que dessa vez, estou dizendo que o valor mínimo é 100, quando utilizo ele como parâmetro da função <coerceAtLeast(100)> . Dessa forma, qualquer valor dentro do comparable, que seja menor que 100 será impresso o valor 100, pois estou querendo garantir que ele seja o menor inteiro possível nessa implementação.
A mesma lógica ocorre com o coerceAtMost só que de maneira inversa, pois ele vai garantir que o valor comparado, nunca seja maior que o máximo.
println(100.coerceAtMost(10))
println(10.coerceAtMost(100))
10
10
Agora temos o 10 como resultado para os dois prints, apenas por que invertemos a lógica.
No primeiro “print”, eu trago o inteiro 100, mas ele só aceita no máximo o inteiro 10, retornando dessa forma o valor 10
No segundo “print”, eu trago o inteiro 10 e ele aceita até no máximo o 100, retornando também, o valor 10