Há algum tempo atrás, tive um caso de uso em que recebi um campo que podia conter um array ou um valor nulo. Se um array estivesse presente, poderia ter strings (incluindo strings vazias) ou valores nulos.
Se algum dos valores dentro do array estivessem vazios, eu tinha de ignorar completamente este campo. Isto significa que tive de criar uma função para verificar se o campo ou qualquer um dos valores dentro do array estavam vazios, e ignorar o campo se fosse esse o caso.
Este post vai explicar as quatro soluções diferentes que encontrei para resolver este problema.
Deixem-me começar por mostrar alguns dos exemplos que eu receberia na carga útil:
De todos estes exemplos, apenas o número oito está correto. Os outros exemplos devem ser ignorados porque contêm (ou são) valores vazios, como é ilustrado com [" "] e "nulo".
Agora que compreendemos o problema, vamos cobrir as quatro soluções.
Solução #1: Funções principais
Podemos criar uma função que utiliza apenas as funções centrais do DataWeave. Tal como esta:
Primeiro, verificamos se o parâmetro dado "arr" está vazio e retorna "true" se for esse o caso. Isto apanhará o array vazio e os casos nulos (campos um e dois). Depois, precisamos decompor o que está na declaração "else" (para onde vão os campos restantes).
Primeiro filtramos o array por valores vazios (arr filter isEmpty($)) - que devolverá os valores que estão vazios (nulls e strings vazios).
Agora que temos arrays com os valores vazios, podemos verificar se os arrays filtrados estão vazios. Se estiverem, significa que não há valores vazios em "arr".
Como esperado, apenas o campo oito retorna "true", o que significa que não contém quaisquer valores vazios. O nosso último passo é reverter o resultado porque queremos ter um valor verdadeiro quando o array contém valores vazios. É por isso que adicionamos o operador "NOT".
Solução #2: Módulo de arrays
Semelhante à primeira solução, também temos uma declaração “if/else”, mas alteramos a lógica da declaração "else" para a função "some" a partir do módulo de Arrays.
Esta lógica é mais fácil de entender, certo?
Os campos um e dois funcionam da mesma forma que antes, mas a lógica para os campos três a oito muda. Desta vez, estamos verificando diretamente se pelo menos um dos valores da matriz está vazio e o resultado é devolvido.
Solução #3: Combinação de padrões (correspondência/caixa)
Com esta solução, estamos verificando que tipo de valor foi recebido no parâmetro "arr" e depois estamos manipulando a lógica de acordo.
A primeira declaração de caso verifica se "arr" é um array vazio e retorna um valor true. Se este não for o caso, ele vai para a segunda declaração de caso, que verifica se "arr" é do tipo Array e executa a lógica que tínhamos anteriormente (um exemplo isEmpty($)).
Por último, se nenhuma dessas condições foi cumprida, vai para a declaração "else", que retorna verdadeiro se "arr" estiver vazio ou falso de outra forma.
Solução #4: Sobrecarga de funções
Com este script, o campo "um" é imediatamente encaminhado para a primeira função sobrecarregada porque contém um valor nulo.
Os campos de dois a oito são avaliados de acordo com a segunda função sobrecarregada. Neste caso, criamos uma declaração “if/else” para retornar verdadeiro se o parâmetro "arr" for um array vazio. Se não estiver vazio, continuamos com a mesma lógica que tínhamos antes (usando o módulo de Arrays).
Observe que você também pode usar a correspondência de padrões na segunda função em vez de usar as condições “if/else”. Este código seria algo parecido com isto:
Se você não estiver familiarizado com sobrecarga de funções, você pode ler tudo sobre isso nos Documentos Mulesoft.
Conclusão
Meu conselho para qualquer pessoa que enfrente problemas semelhantes é continuar tentando abordagens diferentes para o mesmo problema e avaliar qual é a melhor solução para o seu caso.
Quando eu estava trabalhando neste código pela primeira vez, criei duas soluções adicionais que não me deram o resultado que eu esperava e tornaram o código muito difícil de ler!
Tive que fazer pesquisas e experimentações para chegar a estas quatro soluções. Você pode ler sobre todas as minhas outras tentativas aqui.
Você consegue pensar nos prós e contras de usar qualquer uma destas quatro abordagens? Nos conte no grupo comunitário MuleSoft Developer LinkedIn!
*Alexandra Martinez é uma embaixatriz da MuleSoft e pode ser contatada aqui se você tiver alguma pergunta.
*Este conteúdo foi traduzido e adaptado, e você pode conferir o post original aqui.
Este artigo foi escrito por Alexandra Martinez e publicado originalmente em Prensa.li.