Blog – FAQ 7

Blog - FAQ 7Saudações, pessoal!
Já faz um tempo que não publico um FAQ por aqui, não é? Pois bem, hoje é dia de apresentar mais algumas perguntas que recebo via e-mail, comentários ou pela página do Facebook. Espero que, mais uma vez, as respostas contidas neste artigo sejam úteis para os leitores e visitantes do blog! Let’s do it!

 

Criar a camada DAO (Data Access Object) é uma prática correta no contexto do MVC?
A camada DAO é uma “extensão” da camada Model. Muitos programadores decidem criá-la para separar a regra de negócio da persistência no banco de dados. Logo, não é uma prática incorreta.
Assim como a camada Model, outras camadas também podem ser estendidas. Por exemplo, ao trabalhar com servidores REST ou DataSnap, pode-se estender a camada Controller, ou, no caso de WebServices, é possível estender a camada View – uma extensão dessa camada ficaria responsável pela aplicação desktop e outra pela aplicação Web. Vale ressaltar que são extensões das camadas já existentes, pois, se criarmos novas camadas, estaremos fugindo das diretrizes do MVC.

 

Para atribuir o conteúdo dos campos de um formulário em um DataSet, é melhor utilizar o “FieldByName” ou conectar os componentes pela propriedade “DataField”?
A questão da utilização de componentes DBWare (ligados pela propriedade DataField) ou componentes padrão (sem ligação com o DataSet), muitas vezes, é uma preferência de cada desenvolvedor. Alguns desenvolvedores preferem utilizar componentes DBWare por estes já trazerem as regras de preenchimento da tabela do banco de dados, como o tipo de dado, tamanho e restrições (constraints). Outros desenvolvedores optam pelos componentes padrão e utilizam o FieldByName para preenchimento dos dados, resultando em um número ligeiramente maior de linhas de código, porém, fornecendo mais “flexibilidade” para o desenvolvedor. Ao utilizar componentes padrão, é possível abrir uma transação, atribuir todos os valores (com o FieldByName) e comitar a transação, tudo em um mesmo método. Este procedimento pode ser mais adequado ao trabalhar com padrões de arquitetura ou quando o desenvolvedor pretende separar a persistência dos dados em uma classe exclusiva.
De qualquer forma, volto a dizer: cada desenvolvedor tem suas particularidades. O importante é a produtividade!

 

Tentei inserir uma máscara de moeda corrente (R$) em um campo Aggregates, mas ela não é obedecida ao executar a aplicação.
As versões do Delphi anteriores à 2010 contém um bug na formatação de campos Aggregates. Mesmo inserindo máscaras ou alterando a propriedade “currency” para True, o valor não é formatado. Neste caso, uma alternativa é formatar o valor no próprio código-fonte em tempo de execução:

var
  Valor: variant;
begin
  Valor := ClientDataSet1.FieldByName('CAMPO_AGGREGATE').Value;
  Edit1.Text := FormatFloat('R$ ###,###,##0.00', Valor);
end;

Segundo alguns sites, também há uma opção de corrigir esse bug do Delphi. Na unit “DB.pas”, encontre o método “TAggregateField.GetText” e substitua a linha:

if FResultType in [ftFloat, ftCurrency] then

por:

if FResultType in [ftFloat, ftCurrency, ftFMTBcd] then

Lembrando que, se essa alteração for realizada, a unit “DB.pas” deverá ser recompilada para que a correção entre em vigor.

 

Nas tabelas temporárias (TClientDataSet), é possível trabalhar com colunas definidas como PK (Primary Key)?
Ótima pergunta! Com o TClientDataSet, é possível definir um comportamento parcial de uma Primary Key. Para configurar um campo (Field) como obrigatório, basta alterar a propriedade Required para True. Entretanto, não é possível definir um campo como Unique (que não pode se repetir). Neste caso, é necessário controlar este comportamento manualmente, checando se o valor desse campo já existe na tabela antes de gravar o registro.

 

Gostaria de saber se existe alguma unit do Delphi que implemente a função IIF, na qual foi originalmente disponibilizada pela Microsoft desde o tempo do FoxPro.
Infelizmente a função IIF não está disponível no Delphi, mas existe uma função semelhante, chamada IfThen. Confira a documentação dessa função nos links abaixo:
http://docwiki.embarcadero.com/Libraries/XE6/en/System.StrUtils.IfThen
http://delphi.about.com/library/rtl/blrtlIfThen.htm

 

Estou utilizando o componente TADOQuery. Ao executar o comando “ExecSQL”, caso a instrução SQL contenha um erro (no meu caso, o erro de “Truncate String”), nenhuma exceção é gerada. Envolvi o comando em um bloco “try..except”, mas sem sucesso. A questão é que eu preciso identificar se houve uma falha na execução do script. Como tratar isso?
Em alguns componentes, os erros gerados no comando ExecSQL realmente não são capturados no fluxo do except. No entanto, a função ExecSQL provê um retorno que informa a quantidade de linhas afetadas pela instrução SQL. Sendo assim, podemos assumir que, caso a quantidade seja igual a 0 (zero), significa que houve um erro na execução do comando:

if ADOQuery.ExecSQL = 0 then
begin
  ShowMessage('Erro na instrução SQL.');
end;

 

Tenho um aplicativo desenvolvido com banco de dados Paradox e gostaria de migrá-lo para o Firebird. Existe alguma ferramenta de conversão dos dados do Paradox para o Firebird ou é mais viável transferir os dados tabela por tabela?
Infelizmente não tenho conhecimento de alguma ferramenta que automatize a conversão de banco de dados Paradox para Firebird. De qualquer forma, mesmo se conhecesse, eu optaria por desenvolver um aplicativo exclusivo para realizar a migração de dados (também conhecido como “De-Para”). Através dele, seria possível transformar alguns dados da origem para serem gravados no destino como, por exemplo, conversões para maiúsculas, concatenações e/ou adaptações, semelhante a um processo de ETL. Além disso, o desenvolvedor poderia exportar o resultado da migração em um arquivo de log, como também controlar possíveis exceções.

 

(referente ao artigo “Envio de e-mail com componentes Indy“)
Ao utilizar a minha rotina para envio de e-mails, o servidor informa que “atingiu o limite de e-mails por hora”. O curioso é que fiz poucos testes. Você tem alguma sugestão para este caso?
Embora eu ainda não tenha me deparado especificamente com essa mensagem, trata-se de uma regra de transferência de mensagens do próprio servidor de e-mail. O Hotmail, por exemplo, contém uma regra que não permite múltiplas requisições POP em um curto período de tempo. Certa vez, ao realizar testes consecutivos com este servidor, recebi uma mensagem semelhante à que você informou e tive que aguardar alguns minutos para retomar os testes. Na verdade, é até compreensível que existam essas regras para não causar congestionamentos de requisições nos servidores.
A minha sugestão é executar testes em menor escala e mais acurados, ou encontrar um servidor de e-mail que forneça uma maior flexibilidade no intervalo de tempo para envio de mensagens.

 

(referente ao artigo “Vender ou alugar o meu software?“)
Gostaria de saber a sua opinião sobre este exemplo: o software é desenvolvido por encomenda e vendido (não alugado). Depois de distribuído, o software poderá ser comercializado a terceiros? Em caso positivo, a quem pertenceria os direitos autorais?
A questão dos direitos autorais depende de como o contrato foi firmado com o cliente. Geralmente os contratos apresentam uma cláusula que diz respeito ao direito do cliente em posse do software. Por exemplo, há o direito somente de uso, como também existe o direito de alteração e distribuição.
Além disso, a modalidade de venda também influencia neste acordo. O software pode ser vendido como um pacote (apenas com os arquivos necessários para a utilização) ou com o código-fonte incluso, o que provê a possibilidade de alteração pelo cliente que o adquiriu. É muito importante estabelecer estes pontos na documentação do contrato.

 

(referente ao artigo “Programador Júnior, Pleno ou Sênior – Quem eu sou?“)
Só faltou abordar sobre certificações. Suponha que eu seja trainee e tirei uma certificação, então qual seria o meu nível? A certificação me tornaria nível sênior igual a quem já está há 10 anos na função?
Realmente seria interessante ter abordado a questão das certificações, já que se tornaram muito importantes, principalmente para profissionais de TI.
Eu diria que, embora uma certificação prove que o profissional tenha conhecimento amplo do tema estudado, ela não é o suficiente para transformar um profissional do nível Júnior em um Sênior. Digo isso porque há muita prática envolvida nessa escala. Um desenvolvedor Sênior, por exemplo, possui uma experiência empírica que é adquirida somente com o trabalho desempenhado no dia a dia. Em outras palavras, podemos afirmar que a certificação oferece um embasamento teórico, enquanto o trabalho proporciona um conhecimento prático. Combinar essas duas vertentes é o grande ideal. O encontro do conhecimento teórico com o prático resulta no profissionalismo de alta competência.
Mesmo assim, ressalto que, caso você seja um nível Júnior e se certifique na área em que trabalha, as chances de evoluir para o nível Pleno são grandes, já que, essencialmente, a certificação irá aprimorar a sua perspectiva no trabalho.

 

(referente ao artigo “Concluímos o Sprint Backlog antes do prazo! E agora?“)
Podemos “puxar” um item do Product Backlog para a sprint atual? Neste caso, se não conseguirmos finalizá-lo até a entrega (devido ao tamanho da user story), basta migrá-lo para a próxima Sprint, certo?
Mesmo que a Sprint Backlog tenha sido concluída antes do prazo, o ideal é não trazer user stories grandes do Product Backlog para a Sprint atual, já que existe uma grande possibilidade de não finalizá-la até o final efetivo do prazo. Caso a equipe decida buscar um novo item do Product Backlog para aproveitar o tempo restante, eu sugiro que seja uma user story pequena, que não implique na alteração de vários locais do software e que não exija testes extensos. Para isso, geralmente o tamanho da user story é calculado em pontos de função ou através de estimativas da equipe.

 

É possível empregar uma metodologia (como o Scrum) em uma equipe pequena de 4 a 6 desenvolvedores?
O fato de existir apenas 4 ou 6 pessoas na equipe não interfere na implantação de uma metodologia. Na verdade, até mesmo um desenvolvedor autônomo pode apresentar tendências para perder controle dos prazos, correções ou evoluções do software.
A própria literatura do Scrum sugere que a equipe não tenha mais do que 8 pessoas, ou seja, os times devem ser pequenos. Como é uma metodologia direcionada para o gerenciamento da equipe, estes seriam alguns benefícios de sua aplicação:

  • Definição de prazos de entrega: uma nova versão do software (chamada de incremento) é liberada em prazos curtos, principalmente para que as correções ou ajustes de novas funcionalidades sejam pontuais. Isso é chamado de “Sprint” – um período de tempo (normalmente 1 mês) em que um conjunto selecionado de funcionalidades e correções são implementadas no software. Além disso, versões menores permitem um feedback mais imediato do cliente.
  • Reuniões diárias: todos os dias há uma pequena reunião de alinhamento de no máximo 15 minutos, o suficiente para que cada membro reporte o que está fazendo, o que já foi feito e os possíveis obstáculos nas atividades. Isso ajuda a manter as atividades nos trilhos e definir novas responsabilidades.
  • Task Board: consiste em um quadro no qual a equipe gerencia as atividades e ganhou popularidade justamente por expor o status de desenvolvimento de um projeto. Através deste quadro, é possível identificar as prioridades de cada tarefa e o andamento contínuo das implementações. A propósito, existe uma ferramenta grátis online chamada Trello que “simula” esse quadro no navegador. É bem interessante!

 

Feliz Natal e um próspero ano anovo para todos vocês, leitores!
Retorno no dia 05 de janeiro! Grande abraço!


Confira também os outros FAQs:

FAQ 01 | FAQ 02 | FAQ 03 | FAQ 04 | FAQ 05 | FAQ 06 | FAQ 07 | FAQ 08 | FAQ 09


 

Compartilhe!
Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

2 comentários

  1. Ola.
    Existe o Datapump, nativo do Delphi que cria as tabelas em uma base firebird existente e também transfere os dados, já usei, mas acho melhor desenvolver um aplicativo para isso, assim temos pleno domínio quanto ao tratamento dos dados.

    1. Olá, Gerson!
      Também acho que um aplicativo customizado para essa finalidade é mais viável devido ao controle de manipulação de dados, além de possibilitar a geração de logs. Abraço!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Preencha o campo abaixo * Time limit is exhausted. Please reload CAPTCHA.