Containers no X++ é um tipo de dados muito poderosos e também um tanto estranho. Ele é como um Array, mas suporta diferentes tipos de dados na mesma instância e também pode crescer infinitamente. Além disso, os containers não tem métodos como os objetos reais, você precisa de funções especiais para tratar com eles.
Muitas estruturas de dados são serializadas no X++ dentro de containers antes deles serem enviados através da rede ou armazenados da Base de Dados, um exemplo disso é o framework SysLastValue.
Infelizmente este tipo de flexibilidade é freqüentemente abusado. É muito simples abusar dos containers e isso acontece freqüentemente. Neste artigo eu vou passar por algumas boas praticas para os container. Não vou passar sobre o básico dos containers, você pode achar a documentação básica no MSDN, procure pelos métodos começados por ‘con’.
Adicionando dados a um container:
Na maioria das vezes, você quer adicionar algo a um container e tipicamente vê códigos como este:
1 2 3 4 | for (i=1; i<=maxNum; i++) { con = conIns(con, i, theValue); } |
Não faça isto! A função conIns() é lenta porque ela faz uma cópia do container original para um novo container antes de retornar.
O código acima deveria ser reescrito assim:
1 2 3 4 | for (i=1; i<=maxNum; i++) { con += theValue; } |
É muito mais rápido e também muito mais fácil de entender.
Não estou dizendo que você não pode usar o conIns(), mas use-o apenas quando não tiver outra opção, como por exemplo, inserindo valores que você não quer que vá para o final do container.
Inicializando:
Não importa quando você está inserindo um conjunto de variáveis em um container, você sempre pode inseri-los de uma só vez. Um exemplo típico de quando escrevem algo em um arquivo é:
1 2 3 4 5 6 7 8 9 | while(someCondition) { con = conNull(); con += 1; con += someValue; con += otherValue; con += "X"; outFile.write(con); } |
Isto funciona, mas existe um caminho melhor. Você pode atribuir vários valores a um container em uma única linha. Tente isto no lugar:
1 2 3 4 5 | while(someCondition) { con = [1, someValue, otherValue, "X"]; outFile.write(con); } |
Claro que este é um método inventando e muitas vezes pode ser complexo preencher um container, mas você pode fazer isso em um método separado. Geralmente esconder detalhes como este aumenta em muito a facilidade na leitura. Não é sempre possível fazer como este exemplo, mas a idéia é sempre que você puder, faça!
Extraindo valores:
Você pode extrair valores assim:
1 2 3 | a = conPeek(con, 1); b = conPeek(con, 2); c = conPeek(con, 3); |
Ou pode fazer bem mais simples:
1 | [a, b, c] = con; |
Pontos extras se conseguir explicar isto:
1 | [a, b] = [b, a]; |
Containers são passados por valor.
Containers são tipos de dados primitivos no AX, então eles são passados por valor. Isso quer dizer que os containers serão copiados quando passados para uma função por argumento. Mantenha em mente quando você for trabalhar com containers que eles podem se tornar grandes.
Não imite outras estruturas de dados com container.
Freqüentemente eu vejo usarem containers que podem ser trocados por outro tipo de dados muito mais apropriado.
Embora seja muito fácil e tentador usar containers para tudo, novamente, não é uma boa idéia. Outros desenvolvedores talvez levem algum tempo para entender estas estruturas de dados ad hoc (designado para determinada atividade), pode ser complicado mesmo para você entender seu código se você passar um tempo sem trabalhar com ele.
Existem alternativas aos containers! Dê uma olhada nas classes foundation. Elas são de certa forma como as collections em .NET. Você também pode usar Listas, Maps, Sets, Arrays e Structs. Eles também podem ser empacotados em containers quando necessário.
Se todas as variáveis forem do mesmo tipo, considere usar Lists (ordenadas) ou Set (desordenadas). Se você precisa rastrear dados relacionados, use os Maps ou Structs.
[]s
Pichler
Fonte: http://sysdictcoder.com/blog/dealing-with-containers/
One Response
Anderson Joyle
17|Nov|2010 1Muito bom Pichler!
So gostaria de fazer uma observação. No caso das Lists e Sets, ambas as classe armazenam os dados de forma ordenados. A diferença é que na classe List, a ordem é determinada pela entrada de dados, inserindo-os no fim ou no começo da lista. Ja a classe Set ordena os dados de forma automatica, sempre de forma crescente(plus, dados distintos).
Espero ter agredado conhecimento.
Abs a toda comunidade.
Leave a reply