Arquivos da categoria : Jazz


Delphi Sets, código legivel e bom desempenho

Hoje enquanto modelava e implementava Notificação e Estado dos objetos no Jazz, tive a preocupação com a memória utilizada e com o desempenho.  Na versão anterior eu utilizava Sets, mas a notificação e o status necessitavam melhorias.

Então me ocorreu a idéia de utilizar bit para identificar o Estado, desta forma, um byte seria suficiente para identificar todos os possíveis Estados de um objeto, foi então que postei no stackoverflow uma pergunta sobre como manipular bit “How use bit/bit-operator to control object state?”.  

A pergunta foi respondida pelo Scott W que ainda deu a dica da pagina sobre Delphi Operators. Outros colegas também responderam sugerindo a utilização de Sets, e entre eles o Engenheiro do Compilador do Delphi Barry Kelly, que ainda explicou como o compilador do Delphi gera assembly para Sets. 

Informações sobre Sets segundo Barry Kelly:

Utilizar Sets é a melhor técnica que utilizar operadores de bit. Eles não são mais leves, visto que Sets são compilados com o mesmo código de CPU que operações binárias. 

A vantagem é que eles são mais seguros por que são verificados pelo compilador, enquanto operadores de bit são todos inteiros.

Neste caso como terei no máximo 8 itens, eles serão de tamanho máximo de 1 byte

A versão final utilizando Sets ficou assim,

Declaração dos possíveis estados:

  TStateType = (
    stLoaded    = 0,   // loaded from persistance
    stNative    = 1,   // value loaded and converted to native type
    stSaved     = 2,   // saved
    stChanged   = 3,   // object or member changed
    stDelete    = 4,   // marked to delete
    stNull      = 5    // value is null
  );

  TState = Set of TStateType;

Você sabia que é possível definir o valor numérico de um item em Sets?

Armazenamento das informações:

  PDataPackage = ^TDataPackage;
  TDataPackage = record
    Data: TBytes;
    TypeInfo: TMetaInfo;
    State: Byte;
    Instance: TBuffer;
  end;

Estas são as informações enviadas entre cliente e servidor de aplicações para persistência e recuperação dos dados,

  • Data contém os dados em Bytes;
  • TypeInfo será convertido a apenas o nome da classe de implementação dos Metadados;
  • State é apenas 1 Byte, contendo os possíveis valores de TState;
  • Instance será ignorada, pois apenas representa a instância única no cliente ou no servidor, e será utilizada para notificação.

E para acessar as informações:


  TValueType = class(TJazzObject, IValueType, IDataPackage)
  private
    FDataPackage: PDataPackage;
  ...
  end;

function TValueType.IsNull: Boolean;
begin
  Result:= stNull in TState(FDataPackage^.State);
end;

Como persistir TState

var
  State: TState;
begin
  State:= [stChanged];
  FDataPackage^.State:= Byte(State);
end;

Como TState tem menos de 8 ítens, pode ser persistido utilizando apenas 1 byte.


Jazz SDK Refactory 9

Estou iniciando 3 novos projetos com o Jazz SDK, mas antes vou fazer um grande refactory no framework, e provavelmente todos os pacotes serão afetados.

Em alguns casos haverá mudança de nome de classes para normalização, nada muito radical, apenas para padronizar alguns casos para nomes mais populares em outros projetos, ajudando no aprendizado.

Já estou fazendo mudanças no JazzVTF, e como exemplo, a unit JazzClasses.pas sofreu as seguintes mudanças:
JazzClasses.pas
    ICustomObject/TCustomObject -> ICommonObject/TCommonObject
    INamedInterfaceList/TNamedInterfaceList -> ICommonList/TCommonList

Maioria das classes, são de uso interno do framework, então dificilmente alguém será afetado por estas mudanças, mas algumas que estão por vir podem afetar o código existente.

Ainda no ValueType, vou implementar as classes de forma parecida com o .NET, para aproveitarmos a grande documentação existente.

Muita coisa não pode ser feita da mesma forma, por que são plataformas diferentes, mas tentarei fazer de forma semelhante, assim podemos utilizar documentos como estes para aprender melhor o framework:

A parte de notificação deve ser alterada, com o objetivo de ganhar performance, e eliminar códigos desnecessários.

A estrutura do OPF será beneficiada por algumas mudanças que aumentarão a performance, utilizando melhor o framework de acesso a banco de dados, principalmente no caso do DBX4, que tem muitos recursos, dos quais já estou utilizando.

Toda a parte de relacionamento e ORM serão revisadas, o objetivo é facilitar a utilização destes recursos.

A parte de persistência será ajustada para facilitar outras formas de stream, como por exemplo JSON.

O MVP deve ser finalizado, e deve ganhar componentes, que facilitarão a integração dos objetos com os componentes, estou estudando o modelo de data binding do .NET

Já tenho nos planos alguns componentes visuais, para a melhor utilização dos recursos da IDE.

Wizards e integração com IDE estão no plano, não prometo muito, mas pelo menos um wizard para criação de classes e mapeamento deve ser criado.

Estou planejando criar o mapeamento, de forma que ele seja um arquivo XML, embutido na aplicação como recurso, podendo ser substituído em run time.
Também deve ser criado Metadados para os objetos, para serem utilizados na UI, isto também deve ficar em XML.

O conteúdo do blog do Jazz deve ser transferido para este blog, e a URL será redirecionada.

Isto é o que me lembro por enquanto, outras novidades que aparecerem, serão postadas.


Jazz SDK – Revision 184

O repositório do Jazz SDK foi atualizado para a ???Revision 184???, nesta versão a principal alteração é o suporte ao Delphi 2009.

Agora os pacotes de projetos estão separados para cada versão do Delphi, bem como o Output Path para as DCU, e na raiz tem um grupo de projetos para cada versão do Delphi, facilitando a instalação em diferentes versões do Delphi na mesma máquina, sem criar conflito nos arquivos de projetos e na compilação, ficando assim

Folder Layout

O componente DBAdapter ainda não foi convertido para Delphi 2009, a principal razão é que eu não o uso em meus projetos, e como ele é uma especialização de TDataSet necessita de mais alterações que o restante dos fontes. O suporte a Unicode no 2009 trouxe muitas mudanças ao TDataSet, então as implementações de TDataSet necessitam de mais alterações.

Há projetos para Delphi 7, 2007 e 2009, nos próximos dias adicionarei para Delphi 6 e BDS 2006, se alguém precisar antes avise pela lista de discussão.

Já estou trabalhando em uma nova versão ser publicada nos próximos dias, em outro artigo comentarei sobre as mudanças que estão por vir.

Referências


DUG Campinas 1

No sábado fiz uma apresentação do Jazz no DUG Campinas, a programação era de 1 hora, mas o Erick e Leonel, abriram o evento propondo uma reunião aberta a conversas e debates, então em uma apresentação mais amigável que durou 2 horas e meia, apresentei o projeto, detalhes do desenvolvimento, futuro e criei um exemplo simples na hora, a apresentação com o programinha criado estão disponíveis para download no site do Jazz:

http://jazz.liws.com.br/download/dugcampinas.zip

?? apenas uma apresetação simples em Power Point utilizada como referência durante a apresentação e os fontes do programinha simples que criei na hora, eu queria gravar a apresentação, mas infelizmente não foi possível.

A receptividade foi boa, o público interagiu apresentando dúvidas, realmente gostei do evento, no final teve sorteio de um curso oficial do Delphi oferecido pela Tool, brindes da Borland e eu fui sorteado com uma licença do SmartInspect.

E é claro, na foto eu recebendo a licença do SmartInspect do Leonel da CodeGear.

Agradeço a todos que estiveram presentes, espero que a apresentação tenha sido útil.


Jazz alpha 10 2

Está disponível para download esta versão, ultimamente não estou colocando releases para download com freqüencia pois passamos a utilizar o subversion e aparentemente está indo muito bem.

Esta versão corrige vários bugs e adicionas algumas das funcionalidades que faltam para concluir a versão 1.0, não vou apresentar mais logs detalhados aqui pois agora eles podem ser lidos através do subversion, já que adotei a política de comentar todos os “Commits”.

Download: http://jazz.liws.com.br/download/jazz_a10.zip
Repositório subversion: http://code.google.com/p/jazz-sdk/source


Jazz week – Invalid pointer operation – atualizações – testes unitários 1

  1. TObjectType – novo método: procedure InitInstance; virtual;
    Chamado no construtor, após a criação de todos os objetos internos, então será chamado antes do AfterConstruction, acho que assim temos uma alternativa razoável e pode ser um padrão.
    Já atualizei as classes do exemplo FirstPersister para refletir esta mudança.
  2. Fiz algumas alterações na classe TObjectQuery, abstraindo ainda mais o acesso a “Fields”, “FieldCount” e a carga do Field recuperado para o Member, desta forma  o código específico do mecanismo ficou mais simples, com estas alterações todas as melhoras do DatabaseMechanism foi propagado ao ADOMechanism que tinha muito código especifico. Aproveitei e já fiz testes completos, o ADOMechanism volta ao estado de estável.
  3. Alguns dos problemas desta semana não seriam resolvidos com testes unitários, mas muitos sim.
    Eu não implementei os testes unitários ainda, por que acho que preciso estudar mais a fundo para fazer a implementação de forma definitiva,
    se alguém tiver sugestões e mais informações sobre esta área, além é claro do material que já vem com DUnit, por favor me envie.
  4. Durante a semana fizemos foram reportados vários problemas, creio que todos foram resolvidos, se ficou algo pendente por favor me cobrem.
    Entre os problemas e dúvidas reportados, e que considero todos resolvidos:
    • Relacionamento 1 x 1
    • Relacionamento 1 x N
    • Mapeamento de relacionamentos
    • LazyLoad
    • Operações em cascata
    • Retorno de funções: TObjectListType.AsString e TObjectListType.FindObject
    • ADOMechanism
  5. TODO  + o que ficou para pesquisar
    • TDataGenerator para Generators de Firebird/Interbase – vou priorizar isto
    • Problemas com contexto no AfterConstruction
    • Reimplementar FindObject para aceitar ICriteria como parâmetro – provavelmente para uma próxima versão
    • Implementar Testes Unitários
    • MVP – Concluir Views
    • MVP – propagar estado dos commands para a UI
    • Sincronismo do banco de dados
    • Mapeamento de um atributo para StoredProcedure ou SubSelect
    • Documentação
    • Manual
    • Mais exemplos
  6. Obrigado a todas colaborações, sujetões e criticas

Jazz Alpha 9 2

Cada vez mais próximo da versão 1.0, nesta atualização houve um grande esforço na revisão de todas units, que deixou o código mais limpo, reutilizável e com ganho de performace.

Além da revisão há boas novidades:

No VTF os objetos derivados de TValueType ganharam uma nova propriedade “ValueTypeKind: TValueTypeKind“, desta forma podemos identificar um ValueType sem a necessidade do QueryInterface. Os tipos numéricos ganharam uma interface antecessora comum “INumericType” que possibilita a conversão direta de Float e Integer através das propriedades ‘AsFloat’ e ‘AsInteger’. Pra concluir as novidades deste framework há um “Factory” para facilitar a criação de objetos atributos (membros) na programação, com o “TypeFactory podemos criar objetos assim:

var
  LItem: IStringType;
begin
  LItem:= TypeFactory.NewString('Texto');
  ...
end;

As novidades do OPF estão em 2 ítens, a criação de metadados específicos para OID, através da classe “TOIDMeta“, deixando claro que o Jazz assume que os OID são utilizados apenas para a persistência no relacionamento entre tabelas, nos objetos eles são apenas mais um atributo, pois o relacionamento dos objetos é feito via referência de objetos, como ponteiros. Com esta reestruturação, o novo modelo proporcionou a criação do “DataFactory” para a geração automática de dados, o que sigfinica que qualquer campo pode ser automático, não somente os mapeados para OID, os  “data generators” (TDataGenerator) implementam como estes valores devem ser gerados, de acordo com seu escopo, pela aplicação, por classe ou por atributo de classe, para começar temos TGuidGenerator, TAscendingGenerator e TDescendingGenerator, mas a partir destes é simples criar novos para por exemplo pegar valores a partir de generators do Firebird. Para definir que um atributo utilize este recurso, basta adicionar a classe do generator no mapeamento do membro:

 

with Mapping do
begin
  with AddObject('TAddress', 'ADDRESS') do
  begin
    with Add('ID', 'ID') do
    begin
      Size:= 38;
      IsOID:= True;
      GeneratorClass:= TGuidGenerator; //***
    end;
  ....

O MVP está quase pronto, sua evolução está na implementação de classes que estavam apenas declaradas e refinamento da modelagem, como já mencionei num post anterior estou implementando as Views com componentes DevExpress o que me obrigou a testar muito devido aos recursos disponíveis nestes componentes e a minha vontade de utilizar estes recursos, a única parte que terei de implementar e testar depois são os Interactos pois os componentes do DevExpress já implementam internamente a maior parte deste recurso. Minha previsão é que na próxima versão teremos algum exemplo simples de MVP com componentes VCL.

 

Changelog detalhado: http://www.liws.com.br/wiki/index.php/Alpha_9

Download: http://jazz.liws.com.br/download/jazz_a9.zip


Jazz Alpha 8 1

Nesta versão foi feita uma grande alteração nas notificações e controle de estado dos objetos, agora o parâmetro é do tipo IObjectEvent no lugar do TNotifyType, o tempo de vida deste “objeto evento” é gerenciado pelo INotifyManager.

Para criar um novo evento, basta chamar a função NewEvent que se encarrega de criar e adicionar ao gerenciador:

Notify(NewEvent(TModifiedEvent, Self));

ou ainda adicionar parâmetros:

Notify(NewEvent(TModifiedEvent, Self, [OldValue, NewValue]));

Esta mudança trouxe uma grande flexibilidade, podemos passar junto com a notificação qualquer número de parâmetros de qualquer tipo, apenas o destino deve saber o que fazer com estes parâmetros.

Todo o restante do framework foi afetado por estas mudanças e as atualizações foram propagadas, inclusive nos programas exemplos.

Até que enfim a primeira versão das units do MVP estão disponíveis, mas infelizmente não são úteis para produção por que não há ‘Views’ para VCL, todas as Views que estou fazendo até agora são para os componentes DevExpress que farão parte do pacote adicional do Jazz que será comercializado pela Liws.

Um vídeo, mostrando um exemplo simples de parte de código e uma tela mestre-detalhe com MVP pode ser visto em http://jazz.liws.com.br/download/mvp/mvp1.htm.

Passou um mês sem atualizações, mas muita coisa foi feita, a provisão agora é que as atualizações voltarão a ser semanais, trazendo cada vez mais novidades do MVP, também pretendo disponibilizar algumas vídeo-aulas.

ChangeLog: http://www.liws.com.br/wiki/index.php/Alpha_8
Wiki: http://www.liws.com.br/wiki
Download: http://jazz.liws.com.br/download/jazz_a8.zip


ADO e Sessions no Jazz

A versão alpha 7 está no ar e traz estes 2 ítens como principal destaque

  • O ADOMechanism foi escrito fazendo chamadas direto a unit ADODB_TLB.pas ao invés de instanciar os componentes ADO do Delphi, com isto, este mecanismo ficou bem leve, pretendo fazer algo deste jeito para o Firebird Mechanism.
  • Session, é novo no Jazz, várias mudanças internas foram feitas, e para o desenvolvimento ao invés de fazer as chamadas ao Persister, faz-se as chamadas a cada session.
      • Com Session tem a possibilidade de ativar cache dos objetos, desta forma não haverá objetos duplicados na memória (recuperados do DB), o armazenamento desta lista é feita com Hash e ficou bem rápido, mas se desejar o cache pode ser desativado.
      • As opções para cache são: cmShared, cmExclusive e cmNone, os nomes já dizem tudo
      • Para quem pretende na mesma aplicação ter conexão com mais de um banco de dados, deverá adicionar uma session para cada mecanismo, mas com a opção de escolher o cache exclusivo, compartilhado ou desativar o cache.
      • Outro detalhe é que o Mapping poderá ser compartilhado ou exclusivo estre as Sessions.

Change log: http://www.liws.com.br/wiki/index.php/Alpha_7

Download: http://jazz.liws.com.br/download/jazz_a7.zip

Minha prioridade agora é o MVP, mas ainda tenho alguns ítens que quero melhorar no OPF:

  • trigger events to OnSave OnDelete OnLoad
  • object lock – autoinc field (lock otimista)
  • compress data – (blob members)
  • add TObjectListType sort
  • add TObjectListType filter (make sense?)
  • work with mapping in xml files
  • xml mechanism (can someone help here?)
    • define database schema
    • dtd
    • one file or multifiles?