quarta-feira, 15 de janeiro de 2020

Piores Coisas para Encontrar em Código Fonte


Todo desenvolvedor irá se deparar com sustentação de sistemas em vários momentos de sua carreira, logo será inevitável ter que efetuar manutenção em código alheio e existem coisas que são feitas no código fonte que até tiram do sério até o mais puro desenvolvedor samaritano, vamos a elas:

Comentarista de Código

Todos sabemos a importância de comentar código fonte para que esse conteúdo possa auxiliar num futuro próximo a manutentabilidade. Entretanto para muitos desenvolvedores, simplesmente recebem o espírito de comentarista esportivo ou comediante e os comentários acabam por narrar tudo que está sendo feito ou declarar situação engraçadas, vejo o modelo abaixo:

public IHttpActionResult Get()
        {
            // Criar lista de retorno
            List<LogModel> lLogs = new List<LogModel>();
            try
            {
                // Efetuando conexão com o banco de dados
                using (SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["DbLog"].ConnectionString))
                {
                    // Definindo o nome da Stored Procedure
                    using (var com = new SqlCommand("ListLog", con))
                    {
                        // Abrindo conexão
                        con.Open();

                        // Recuperando os dados
                        var dReader = com.ExecuteReader();

                        //Percorrendo os dados
                        // Não MEXER, funciona como se DEVE
                        while (dReader.Read())
                        {
                            // Instância um novo objeto na lista
                            lLogs.Add(new LogModel
                            {
                                // Preenchedo as propriedades do objeto
                                Event = Convert.ToDateTime(dReader["DtEvent"]),
                                Actor = dReader["DsActor"].ToString(),
                                Category = dReader["DsCategory"].ToString(),
                                Content = dReader["DsContent"].ToString()
                            });
                        }

                        //Fechando a conexão
                        con.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                // Retornando erro (caso aconteceça)
                return Content(HttpStatusCode.BadRequest, ex.Message);
            }

            // Retorna com sucesso a lista recuperada
            return Ok(lLogs);
        }


DICA: Faça comentários que agreguem a explicação das regras e não simplesmente explicar os comandos que a linguagem executa, imagine que outros desenvolvedores também sabem como utilizar os comandos.

Manipular as exceções

Quando uma linguagem é criada, os arquitetos têm que a preocupação de criar mecanismos para retornar os erros quando acontecem e formas de capturar essas exceções para que possam ser analisadas e tratadas. Porém existem os “arquitetos” das aplicações que acreditam que podem criar exceções melhores, simplesmente manipulando ou substituindo os conteúdos, gerando resultado muitas vezes com pouca ou nenhuma informação pertinente.

static void Main()
            {
                double a = 98, b = 0;
                double result = 0;

                try
                {
                    result = a / b;
                    Console.WriteLine("{0} dividido por {1} = {2}", a, b, result);
                }
                catch (Exception e)
                {
                    Throw New Exception("Erro na divisão.");
                }
            }

DICA: Procure manter o estado original das exceções, efetuando no máximo acréscimo, porque dessa forma em outras camadas do sistema, será possível acessar informações mais precisas e completas. 

Artista de Codificação

Manter um código bem indentado e organizado ajuda muito para o processo de leitura e entendimento, entretanto alguns desenvolvedores vão além desse conceito e se tornam verdadeiros artistas e criando belíssima obras de artes, que muitas vezes impossibilitam a alteração por medo de estragar a obra de arte (entenda-se mexer em algo que não dá para entender e estragar o conjunto da obra)

public Indentation()
    {   while (n > 0) { System.out.println(); n++; }
        if (Cond1 == val1) { System.out.println("Cond1 is val1"); } else if (Cond1 == val2) { System.out.println("Cond2 is val2"); } else { System.out.println("No condition is satisfied"); }
        switch (Val1) {
            case 1: System.out.println("This is Java"); break; // Here is Java
            case 2: System.out.println("This is C#"); break; // Here is .NET
            case 3: System.out.println("This is Oracle"); break; // Here is Oracle
            default: System.out.println("This can be anything"); break; } 
    }


DICA: Quando mais claro e estruturado o código fonte, mais fácil ficará a visualização e o entendimento da cadência do código, evite a sobrecarga de comando em uma linha.

Uso de Números Mágicos

Muitos desenvolvedores acabam criando conhecimento ocultos que acabam sendo transpassados para seus códigos fontes, uma dessas técnicas é a utilização de números cabalísticos que alteram a lógica da programação pela sua simples existência.

        public decimal ApplyDiscount(decimal price, AccountStatus accountStatus, int timeOfHavingAccountInYears)
        {
            decimal priceAfterDiscount = 0;
            decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5 / 100 : (decimal)timeOfHavingAccountInYears / 100;
            if (accountStatus == 1)
            {
                priceAfterDiscount = price;
            }
            else if (accountStatus == 2)
            {
                priceAfterDiscount = (price - (0.1m * price)) - (discountForLoyaltyInPercentage * (price - (0.1m * price)));
            }
            else if (accountStatus == 3)
            {
                priceAfterDiscount = (0.7m * price) - (discountForLoyaltyInPercentage * (0.7m * price));
            }
            return priceAfterDiscount;
        }

DICA: Nunca utilize valores “fixos” no código sem suas devidas referências, por exemplo, procure criar constantes ou ainda enumeradores para utilizá-los, além de centralizar seus valores referenciais, você ainda poderá declarar melhor seu proposito através de seus nomes.