Postagens

6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr...

Delphi Prism, porque não vale a pena

Update O Prism nunca foi da Embarcadero, ele pertence a Rem Objects, que tinha um contrato com a Embarcadero até esse ano, mas esse contrato já expirou e as duas empresas vão seguir seus caminhos. O último Delphi Prism foi a versão XE3, se não me engano, mas o Rad Studio XE4 não virá com o Prism, como diz o Andreano Lanusse e o próprio pessoal da Rem Objects. O Prism foi descontinuado na Embarcadero, mas continuará a evoluir na Rem Objects sob o nome de Oxygene (seu verdadeiro nome). http://www.andreanolanusse.com/pt/delphi-xe4-conheca-as-novidades-para-ios-e-mais/ http://blogs.remobjects.com/blogs/mh/2013/04/17/p5822 http://www.itwriting.com/blog/7338-no-more-delphi-for-net-prism-removed-from-rad-studio-xe4.html A partir desse momento a Embarcadero e a RemObjects não são mais parceiras, mas sim concorrentes, mas acredito que o Prism agora irá evoluir, implantando melhorias que não poderia antes devido às políticas da Embarcadero. Sobre o velho assunto da "Morte do Delphi...

Interfaces no Delphi e destruição prematura de objetos / access violation

Recentemente me perguntaram no site da DevMedia se é correto ou não misturar interfaces e objetos em uma conversão temporária, como esta abaixo: var C: TCarro; begin C := TCarro.Create; //tenho um objeto, mas C não conta referencias C.Placa := 'ABC1234'; (C as ICarro).Rodar; //converte e roda na mesma linha, mas zera o contador de referencias na proxima linha C.Parar; //isso dá erro Segue links da Thread: http://www.devmedia.com.br/poo-dominando-o-uso-de-interfaces-revista-clube-delphi-134/22569 http://www.vitorrubio.com.br/downloads/TesteInterfaces.zip http://www.vitorrubio.com.br/downloads/CD134_Interfaces_V2_Reformulado.zip Isso por causa do problema de se zerar o contador de referências em interfaces tendo mais uma referência ao objeto em uma variável do tipo objeto e destruir esse objeto prematuramente. Basicamente nesses casos o comportamento esperado seria um erro. Pode acontecer de o objeto continuar acessível na memória, ou pelo menos alguns méto...

Diferença entre Log Shipping, Mirroring e Replication

Li alguns artigos sobre a diferença entre Log Shipping, Mirroring e Replication e gostaria de compartilhar. http://www.replicationanswers.com/ReplicationLogShippingMirroring.asp Difference between Log Shipping, Mirroring and Replication http://simplesql.blogspot.com.br/2011/01/replication-vs-mirroring-and-what-to.html Basicamente, o Log Shipping é uma estratégia só de Disaster Recovery, mas não muito eficiente para relatórios ou replicação/distribuição dos dados. Ele nada mais faz do que restaurar em uma outra base os logs de transação periodicamente. Esta base fica com lock exclusivo, então consultas nela só podem ser feitas usando-se nolock (dirty reads) ou isolation level snapshot. Log Shipping restaura o banco inteiro, inclusive tabelas de sistema, views, procedures etc. Mirroring também é uma solução para Disaster Recovery e funciona para o banco todo, inclusive dados de sistema. Sua vantagem é que pode ser configurado com failover automático, ou seja, para entrar no ar as...

Lentidão ao executar Delete

Estava executando uma procedure pra atualizar os relacionamentos entre projetos e funcionários do meu sistema e a procedure estava demorando mais de um minuto para executar. Abri o fonte da procedure e executei os comandos dela internamente, e todos eles demoravam menos de um segundo para executar, exceto um delete que demorava mais de um minuto.                 O comando delete from Projeto_Usuario estava demorando mais de um minuto para executar, mas apenas 7000 linhas não deveria demorar tudo isso. (isso causa timeout na maioria das aplicações porque o timeout default de um comando é 30 segundos, e o de uma conexão é de 15 segundos). O mais correto a se fazer não é aumentar esse timeout, e sim otimizar a query.                                 A t...

Fibonacci em SQL

Como prometi que minha próxima postagem seria sobre SQL, resolvi fazer a sequência de Fibonacci no SQL Server. O SQL Server e o Transact SQL permitem a criação de funcions, procedures ou mesmo queries com o uso de várias construções comuns em linguagens de programação, como while, if etc. A sequência de Fibonacci é um exercício muito comum de ser feito em cursos técnicos ou faculdades de áreas relacionadas à informática, e é um exercício clássico de programação. Para quem não sabe, a Sequência de Fibonacci  é uma sequência onde o próximo número sempre é a soma dos dois anteriores, partindo do 1, por exemplo: 1,1,2,3,5,8,13,21 O número de ouro, ou razão áurea, se dá pela divisão de dois termos vizinhos da sequência de Fibonacci, como por exemplo 13/5. Esse número, representado pela letra grega Φ (phi) é de grande importância na matemática e na biologia, já que indica a proporção em que se dá o crescimento biológico. Várias partes de nosso corpo (e de outras espécies) seguem ...

Method Error 500 - Maximum Length Exceeded with AJAX web service call

Eu estava codificando um  clássico formulário de cadastro, e resolvi usar Cascading Dropdown do Ajax Control Toolkit para a seleção de Estados e Cidades. O conceito é simples: ao selecionar um Estado no ddlEstados o ddlCidades será populado apenas com as cidades desse estado. O problema se manifestou da seguinte forma: para os estados que continham mais cidades, como MG, o ddlCidades era populado apenas com a mensagem "Method Error 500", porém essa não era uma exception disparada, e não era possível debugar o projeto e encontrar o disparo da exception. (Talvez se eu usasse o source do Ajax Control Toolkit em vez da biblioteca compílada seria possível debugar). Tudo indicava que a exception estava sendo tratada, e no tratamento ela escrevia esse erro 500 nos itens. Esse problema é causado porque existe um limite máximo de itens JSON que uma página pode mandar ou receber. Para alterar esse valor deve-se acrescentar as seguintes linhas no web.config: ...

Empregos DEV - Lá e de volta outra vez!

Pois é pessoAll, Saudades de vocês .... mais ou menos Passei uns bons 3 ou 4 meses sem postar nada (e com minha vida digital totalmente jogada às traças). Para me desculpar com meus (poucos) leitroes: é que eu fui demitido. Sim, é frustrante, e pode acontecer com qualquer um. Só que eu fui demitido em uma época em que além de uma fatura medonha de cartão de crédito eu tinha (e ainda tenho) um TCC da pós graduação para fazer. Fiquei os 45 primeiros dias fazendo de 2 a 3 entrevistas por dia durante o dia, e a noite me candidatanto a TODAS as vagas possíveis. Depois entrei em uma empresa chamada Lider Telecom, que presta serviço para a Telefônica (sim, eu me tornei aquilo que mais odeio na minha vida , e todo dia me auto flagelo com uma agulha de tricô incandescente direto no fígado.) Nessa empresa tenho que entrar as 8:00, sair as 18:00 todo dia, sem horário flexível, sem atrasos, sem carnaval, com hora extra na conta do abreu e .... já entendeu né? Sem contar que a empresa f...