andrebaltieri / Flunt

Validations and Notifications
https://github.com/andrebaltieri/flunt
MIT License
624 stars 162 forks source link

`Dúvida` Qual a utilidade dessa variável no código #108

Closed OtavioVB closed 2 years ago

OtavioVB commented 2 years ago
public Contract IsCreditCard(string val, string key = "",string message = "Invalid Credit Card number")
    {
        val = Regex.Replace(val, @"[^0-9]+", "");

        if (string.IsNullOrWhiteSpace(val))
        {
            AddNotification(key, message);
            return this;
        }

        var even = false; // instanciada aqui
        var checksum = 0;

        foreach (var digit in val.ToCharArray().Reverse())
        {
            if (!char.IsDigit(digit))
            {
                AddNotification(val, message);
                return this;
            }

            var value = (digit - '0') * (even ? 2 : 1); // é utilizada apenas aqui, mas seu valor já está definido;;;
            even = !even;

            while (value > 0)
            {
                checksum += value % 10;
                value /= 10;
            }
        }

        if (checksum % 10 != 0)
            AddNotification(key, message);

        return this;
    }

Como pode-se perceber no código comentado, o operador ternário não teve utilidade, já que a variável even sempre é instanciada como false... Além disso, seu valor após não é mais utilizado, apesar de haver uma inversão do valor booleano. Essa variável possui alguma função ao longo do projeto?

eduprog commented 2 years ago
public Contract IsCreditCard(string val, string key = "",string message = "Invalid Credit Card number")
    {
        val = Regex.Replace(val, @"[^0-9]+", "");

        if (string.IsNullOrWhiteSpace(val))
        {
            AddNotification(key, message);
            return this;
        }

        var even = false; // instanciada aqui
        var checksum = 0;

        foreach (var digit in val.ToCharArray().Reverse())
        {
            if (!char.IsDigit(digit))
            {
                AddNotification(val, message);
                return this;
            }

            var value = (digit - '0') * (even ? 2 : 1); // é utilizada apenas aqui, mas seu valor já está definido;;;
            even = !even;

            while (value > 0)
            {
                checksum += value % 10;
                value /= 10;
            }
        }

        if (checksum % 10 != 0)
            AddNotification(key, message);

        return this;
    }

Como pode-se perceber no código comentado, o operador ternário não teve utilidade, já que a variável even sempre é instanciada como false... Além disso, seu valor após não é mais utilizado, apesar de haver uma inversão do valor booleano. Essa variável possui alguma função ao longo do projeto?

Pelo que entendi na lógica a cada passagem no foreach ele irá inverter o valor de even, portanto no primeiro dígito verificado ela é false e multiplica por 1, no segundo multiplica por 2 e assim por diante até o final do cálculo.

Caso pense em deixá-la somente como false ou não colocar o ternário, não haveria a multiplicação a cada dígito calculado.

Na lógica indica isto.

OtavioVB commented 2 years ago

@eduprog Obrigado pela resposta! Vejo que não me atentei ao escopo do foreach e acabei tirando a ideia de que era inútil o uso da variável... Mas, isso deu um grande norte para mim, já que a variável foi utilizada para realizar o algoritmo de Luhn como forma de validar o cartão de crédito.

Desse modo, agradeço a ajuda! Tudo certo com o código.