Páginas

sexta-feira, 23 de setembro de 2011

Regras para siglas

Eu tinha o costume de colocar um 's no final de siglas, como CPF ou CNPJ, para indicar plural (ex.: "As ONG's têm feito um trabalho excelente na região Nordeste."). ERRADO!!!

A regra gramatical para plural de siglas, quando a concordância permitir, é simplesmente acrescentar a letra "s", sem o apóstrofo. Ou seja, a frase acima fica "As ONGs têm feito um trabalho excelente na região Nordeste.".

É importante para quem trabalha com exatas não descuidar do conhecimento de lingua portuguesa, pois já dizia Chacrinha: "Quem não se comunica, se trumbica". Comunicação é tudo, e é sempre bom fazer as coisas da maneira correta.

Este link tem mais informações sobre o uso correto de siglas na língua portuguesa: http://www.soportugues.com.br/secoes/abrev/abrev9.php.

[]'s

terça-feira, 20 de setembro de 2011

Membros ThreadStatic e ASP.NET thread switching: cuidados ao usar

Tudo começou com uma dúvida referente como a classe TransactionScope mantém referência à um objeto de transação durante todo o seu escopo de atuação, mesmo quando são feitas chamadas à outros métodos sem a passagem explícita desse objeto de transação como um parâmetro desse método, por exemplo.

Olhando o código-fonte do TransactionScope através de ferramentas de disassembler, como o Redgate .NET Reflector ou Telerik JustDecompile (como eu amo esses aplicativos!), percebi que o contexto de transação é armazenado em um membro decorado com o atributo ThreadStatic, ou seja, é praticamente uma "variável global" esclusiva de uma thread, que não pode ser acessada por outra thread.



O problema ocorre quando trabalhamos no ASP.NET. Durante o processamento de uma página em ASP.NET, pode (leia-se: "pode", não que ocorrerá sempre!) uma mudança da thread atual (thread switching). Então, uma página que começa a ser processada pela thread 1 pode terminar com a thread 2! Quem define isso é a plataforma ASP.NET, que tenta dar um uso eficaz de recursos.

Bom, o meu medo era que uma aplicação ASP.NET usando TransactionScope pudesse gerar alguma inconsistência de banco de dados no momento que uma transação estivesse ativa e a thread eventualmente mudasse (http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx). 

Mas uma pesquisa na internet me mostrou que esse evento de troca de thread é menos comum de acontecer do que eu imaginava. Geralmente ele ocorre quando há algum processamento assíncrono, por exemplo, usando as funcionalidades do async no ASP.NET 2.0 (http://msdn.microsoft.com/en-us/magazine/cc163725.aspx) ou na inicialização da página. Ou seja, praticamente esse problema pode ocorrer num mal uso de processamento assíncrono no ASP.NET com TransactionScope: quem em sã consciência abriria uma transação durante um processamento assíncrono?

Por isso, fiquei mais tranquilo ao usar transações controladas pelo TransactionScope em aplicações ASP.NET. Mas claro, se eu precisar guardar alguma informação de contexto, usaria o HttpContext.Current.Items ao invés de um membro estático marcado com ThreadStatic.

Alguns links esclarecedores:
[]'s

sexta-feira, 16 de setembro de 2011

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...

quarta-feira, 14 de setembro de 2011

"".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 que represente uma string. Poxa,se for para fazer isso, que pelo menos seja passando typeof(string).
Page.ClientScript.RegisterStartupScript("".GetType(), "", "alert('Mensagem qualquer de alerta do sistema!');", true);
Obs. Internamente, no CIL, typeof chama o método Type.GetTypeFromHandle.

[]'s

domingo, 11 de setembro de 2011

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 = lista.Count > 0;
if (existencia)
{
// faz alguma coisa...
}

Não existe a necessida de comparar o conteúdo da variável existencia com a constante true. Fazê-lo é uma redundância totalmente desnecessária.

Fica a “conclusão final” do post: sempre estejam atentos às repetições no código que não agregam nenhum valor. Procurem sempre deixar o código o mais enxuto possível, sem prejudicar a clareza. Maior quantidade de linhas de código não é critério de qualidade ou produtividade! Evitem o pleonasmo na hora de programar.

[]’s

quarta-feira, 7 de setembro de 2011

Nova graduação!

Faixa laranja do Krav-Magá

Passados mais de um ano (http://galorebr.blogspot.com/2010/04/primeira-graduacao.html), recebi nova graduação no Krav Magá: faixa laranja! O exame foi no dia 12 de Agosto, mas a cerimônia de entrega da faixa foi neste último final de semana, no Colégio Assunção em São Paulo.

Parabéns ao nosso mestre Duda e a todos que se esforçaram para subir mais este nível! Agora é treinar e evoluir o condicionamento físico para o próximo desafio daqui a aproximadamente dois anos.

Kidá!