Postagens

Mostrando postagens com o rótulo Pérolas do Desenvolvimento

Pérola arquitetônica

Imagem
Aqui está um código que é uma verdadeira obra arquitetônica! A montagem eu mesmo que fiz :-) Bom, mas quais são os problemas com esse código? Este código está aí para permitir que campos possuam máscara de dados. Até aí, é um requisito normal de qualquer sistema. O problema é a forma como está sendo feito. Eu verifiquei e existem várias máscaras que não estão sendo utilizadas. Um primeiro problema aqui é desempenho, pois esse script executa em toda página que é carregada, acessando elementos HTML pelo jQuery. É um código desnecessário e sem justificativa. Agora conceitualmente, essas inúmeras máscaras, qual o significado delas dentro do sistema? Qual tipo de campo é formatado por 19 números sequenciais? Não há motivo para esse código existir. Seria necessário a associação com alguma regra do sistema para que elas fizessem sentido. Máscaras que têm sentido são, por exemplo, CPF (999.999.999-99) ou CEP (99999-999). []'s

Por que tá dando erro?

Hoje um colega de trabalho me mandou o seguinte código, trecho de um teste de unidade. var objeto = null; Assert.IsNull(objeto.atributo); O questionamento era "por que tá dando erro?". Que coisa, né? Tá dando erro... []'s

Mau uso do TryParse...

Abaixo está uma pérola onde vemos o uso incorreto do método TryParse. Temos uma string, lida de um arquivo, que contém informação de data, e é necessário colocá-la em um objeto do tipo DateTime. Veja como foi feito abaixo. public DateTime ObterDataControle() { DateTime dt = DateTime.MinValue; if (File.Exists(_caminhoArquivo)) { StreamReader sr = new StreamReader(_caminhoArquivo); try { string dateString = sr.ReadLine(); if (DateTime.TryParse(dateString, out dt)) dt = Convert.ToDateTime(dateString); } finally { sr.Close(); } } return dt; } O método TryParse retorna um bool, que indica se foi possível converter a string para o determinado tipo. Só que quando é possível efetuar a conversão, este método já coloca o valor no parâmetro que ele recebe de output. Não é necessário fazer (como foi feito no código) uma nova conversão do valor. A linha  dt = Conve...

Pérola: como dificultar o tratamento de erro de aplicações

Vamos dar uma olhada no método abaixo, que foi pego de uma situação real (mudei os nomes de variáveis para evitar que reclamem que o coloquei aqui). Nesta aplicação, há uma necessidade de sincronizar dados de usuários, buscando dados do sistema A e atualizando no sistema B. public static void AtualizarUsuarios() { try { using (BatchFacade batchFacade = new BatchFacade()) { List<Usuario> usuariosSistemaA = batchFacade.ListarUsuariosSistemaA().GetRegistros<List<Usuario>>(); List<Usuario> usuariosSistemaB = batchFacade.ListarUsuariosSistemaB().GetRegistros<List<Usuario>>(); foreach (Usuario usuarioA in usuariosSistemaB) { Usuario usuarioB = usuariosSistemaA.Find(delegate(Usuario u) { return u.SIAP.Equals(usuarioA.Codigo.ToString()); }); if (usuarioB != null && UsuarioModificado(usuarioA, ref...

Pérola: como remover caracteres de uma string

Encontrei este código no qual o desenvolvedor queria remover os pontos, traços e barras de um CNPJ formatado (de "12.345.678/0001-00" para "12345678000100"): string estab = string.Empty; char[] delimitadores = new char[] { '.', '/', '-' }; string[] partes = lblCNPJEstabelecimento.Text.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < partes.Length; i++) estab = estab + partes[i]; }  Bizarro... Para remover uma única ocorrência, o método Replace é indicado: http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx Outra alternativa é utilizar regular expressions: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace%28v=VS.100%29.aspx O link abaixo possui um extension method para remover vários caracteres: http://www.csharptricks.com/blog/2006/10/remove-characters-from-string-cnet.html Mantenham o código simples e limpo... []'s

Conversões e desconversões

Mais uma pérola que pode ser relacionada com meu outro post Vícios de linguagem de programação : return (Int32.Parse(diff.Days.ToString()) < Int32.Parse(configuracao.Parametro.ToString())); Primeiro detalhe: a variável diff é do tipo TimeSpan, e a sua propriedade Days já é um inteiro. Por que motivo ela é transformada numa string para depois fazer um novo parse para inteiro? Segundo detalhe: a propriedade Parametro da variável configuracao já é uma string. Não há necessidade de chamar o método ToString(). Tem coisa que dá medo...

"".GetType() vs. typeof(string)

No ASP.NET Webforms é possível incluir um javascript para ser renderizado na tela através do método RegisterStartupScript a partir da propriedade ClientScript do objeto Page . Este método então irá, na hora de "cuspir" o HTML, incluir o script de forma com que ele seja executado assim que a página seja carregada no browser. Os dois primeiros parâmetros são um Type e uma string, representando um tipo qualquer e uma chave que são usados para identificar exclusivamente um script, de forma a identificar a duplicidade. Para o primeiro parâmetro, podemos passar o próprio tipo da página onde este script será usado. Mais detalhes em http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx . Bom, no exemplo abaixo, acabou-se usando o tipo como a própria string. Até aí "tudo bem", não vou discutir qual seria o valor correto para passar para este método, mas o que eu fiquei "besta" foi da ocorrência de "".GetType() , de forma a obter uma instância de Type...

Vícios de linguagem de programação

Você conhece as expressões “acabamento final”, “elo de ligação”, “subir para cima”, “metades iguais”, “protagonista principal”, entre outras? É o chamado pleonasmo , uma redundância em uma expressão que pode ser uma figura de linguagem (ou seja, o autor quer enfatizar alguma coisa ou ser irônico) ou um vício de linguagem. Mas se temos um pleonasmo em um código-fonte, dificilmente isso foi feito propositalmente. Vamos ver um exemplo “clássico” disso. Vejam o código abaixo. var lista = new List<string>(); // preenche a lista...ou não bool existencia = lista.Count > 0; if (existencia == true) { // faz alguma coisa... } Veja o conteúdo do condicional: existencia == true . Mas o tipo da variável existencia já não é um bool? E no final das contas, um resultado do tipo bool não é o que define a expressão que fica no condicional if ? Sendo assim, o código poderia ser reescrito simplesmente como: var lista = new List<string>(); // preenche a lista...ou não bool existencia = lis...

Procedures no Santander

Imagem
Galera do noSQL, uma certeza eu tenho, o banco Santander usa stored procedures no seu bankline... Alguém precisa falar para eles da boa prática de segurança que é não mostrar detalhes de erros para os usuários. Principalmente em sistemas expostos na Internet e que cuidam do dinheiro dos outros...

O pior é impossível?–parte 4

Imagem
Esse é o maior encadeamento de IF’s que eu já vi em vida…, parece um ASCII art. Detalhe que até agora eu não consegui ententer o que o cara quis fazer…, mas acho que também não vale muito a pena. Este post foi um oferecimento da AntiIfCampaign:

O pior é impossível? – parte 3

Imagem
Desta vez vamos deixar a seção de “Pérolas do Desenvolvimento” mais voltada para a especificação. Na UML, um diagrama de sequência é a representação gráfica da troca de mensagens entre objetos, mostrando essa interação durante o tempo de execução da funcionalidade. O que agrega neste diagrama é saber a sequência de acontecimentos, para podermos programar corretamente o comportamento esperado do sistema. Só que pra isso precisamos de mais detalhes…vejam o diagrama abaixo. O que ele agrega para nós? Nada, é a mesma coisa que falar “usuário usa o sistema”. Não dá detalhes de quais objetos estão envolvidos na funcionalidade (generalizou-se o objeto “Aplicação” como todos os objetos internos do sistema). Documentação boa é documentação que tráz valor ao desenvolvimento. Se não trouxer, só serve pra engordar o orçamento do projeto. Obs. Não coloquei aqui, mas tem também o fluxo alternativo dessa funcionalidade…, que é igual ao fluxo básico… []’s

O pior é impossível? – parte 2

Imagem
Continuando a série de “pérolas do desenvolvimento”, temos esta chamada a um web service. Veja que forma inovadora de efetuar a chamada: através de um post http! Não há mais necessidade de se criar proxies! E o pior de tudo, isso funciona! Obs. Este método retorna um XML. Veja que é feito um tratamento no retorno obtido, para modificar HTML para que esteja num formato correto. Vários replaces…