Friday, June 29, 2007 10:45 AM

Convenções acordadas entre os membros do time de desenvolvimento tornam o código-fonte mais consistente e, por conseqüência, mais legível e manutenível. Estas regras e padrões podem ser informais ou documentadas, contanto que seja resultado de experiências reais e acumulativas.

Parêntesis: Não acredito que um documento de trocentas páginas de padrão de codificação, escrito antes mesmo de o projeto começar, por alguém que não mete a mão em código-fonte há anos, tenha utilidade. Comece com um documento mínimo e deixe-o evoluir naturalmente, com a necessidade do projeto. Um wiki pode ser uma boa solução.

Nosso time estava fazendo algumas revisões no código-fonte e surgiu uma discussão sobre como organizar statements if-else e if-elseif. Vou apresentar um exemplo semelhante, mas simplificado do caso discutido. Tenho a seguinte regra para calcular o IPVA de um carro: Qualquer carro fabricado antes de 1970, paga 10%, carros fabricados após este ano (inclusive) pagam 15%, com exceção dos utilitários, que pagam 20%.

É possível resolver o problema desta forma (Solução 1):

        public decimal calculaIpva(Carro carro)
        {
            decimal ipva = 0;

            if (carro.AnoDeFabricacao < 1970)
            {
                ipva = 10.0M;
            }
            else if (carro.TipoVeiculo == TipoVeiculo.Utilitario)
            {
                ipva = 20.0M;
            }
            else
            {
                ipva = 15.0M;
            }

            return ipva;
        }

Ou desta forma (Solução 2):

        public decimal calculaIpva(Carro carro)
        {
            decimal ipva = 0;

            if (carro.AnoDeFabricacao < 1970)
            {
                ipva = 10.0M;
            }
            else
            {
                if (carro.TipoVeiculo == TipoVeiculo.Utilitario)
                {
                    ipva = 20.0M;
                }
                else
                {
                    ipva = 15.0M;
                }
            }

            return ipva;
        }

A discussão era qual formato é mais legível? Qual deles consegue passar mais facilmente para o leitor o qual é a regra de negócio aplicada?

A primeira solução tem menos endentações, o que facilita a leitura, é possível ver claramente, no mesmo nível de endentação, qual o valor final do Ipva. Por outro lado a outra solução exprime melhor a lógica da regra de negócio: “se o carro foi fabricado antes de 1970, faça isto, senão...”. O Senão é outra discussão, porque é relacionado com outra propriedade do carro que não sua data de fabricação.

Nossa decisão final foi a seguinte: Só utilizaríamos um statement if-else if caso as condições do dois estivessem no mesmo domínio, caso contrário usaríamos dois statements if-else, um aninhado no outro (solução 2 no exemplo).

E você? Qual seria sua solução? Ou você acha esta discussão idiota e desnecessária?

Comments

At 6/29/2007 1:54 PM, Paulo Quicoli said:

# re: Pequenas convenções ajudam a consistência do código-fonte

Esse tipo de discussão não é idiota.... é altamente necessária, visto que vários programadores devem cuidar da manutenção do código em comum. A facilidade de leitura nesses casos ajuda, portando é necessário sim que se defina o padrão da equipe.

Preocupar-se com assuntos como esse mostra o comprometimento da equipe com o futuro do software desenvolvido, mostrando profissionalismo. Eu iria ainda um pouco mais longe, discutir se os textos dos menus serão "Eu Sou o Item 1" ou "Eu sou o item 1" também é válido, porque imagina do ponto de vista do usuário, em uma tela está "Cadastro de Clientes" em outra "Cadastro de clientes", isso não dá uma impressão de homegeniedade.

Pra mim o usuário ao usar um sistema tem que ver como se a "empresa" o tivesse feito, e não como se o programador José fez a tela de cadastro e o João fez a de consulta, por isso estão diferentes...

Abraço
At 6/29/2007 2:01 PM, Israel Aece said:

# re: Pequenas convenções ajudam a consistência do código-fonte

Boas,

Ao meu ver, você já dá a melhor solução: "caso as condições do dois estivessem no mesmo domínio".
Post Comment
Title *
Name *
Email (never displayed)
Website
Comment * (Allowed tags: blockquote, a, strong, em, p, u, strike, super, sub, code)  
Please add 6 and 3 and type the answer here: