Devemos tomar cuidado na criação de atoms dinamicamente em nossas aplicações. Quando atoms são criados eles se mantem na memória até que a aplicação reinicie.
Isso quer dizer que, se tivermos uma forma de criar atoms dinamicamente exposta para o usuário, corremos o risco de usuários mal intencionados criarem N atoms, até que nossa aplicação não responda corretamente.
Temos algumas formas de evitar esse tipo de problema. Uma forma é a utilização do String.to_existing_atom/1 onde, um atom so será gerado, caso já tenha sido criado antes. Com isso podemos limitar o que pode e o que não pode ser criado.
lib/atom_test.exs
defmoduleAtomTestdouseExUnit.Case test "to_existing_atom/1"do value ="atom_that_does_not_exist" new_atom =String.to_existing_atom(value) assert new_atom == :atom_that_does_not_existendend
mixtest1) test to_existing_atom/1 (AtomTest)test/atom_test.exs:25** (ArgumentError) errors were found at the given arguments:*1stargument:notanalreadyexistingatomcode:new_atom=String.to_existing_atom("atom_that_does_not_exist")stacktrace::erlang.binary_to_existing_atom("atom_that_does_not_exist",:utf8)test/atom_test.exs:27: (test)
E caso ele já tenha sido criado, não teremos problemas
lib/atom_test.exs
defmoduleAtomTestdouseExUnit.Case# ... test "atom that does exist"do_atom= :atom_that_does_exist value ="atom_that_does_exist" new_atom =String.to_existing_atom(value) assert new_atom == :atom_that_does_existendend
Atoms são muito utilizados no mundo elixir, são práticos e fáceis de usar. Vimos que precisamos tomar cuidado com a geração dinâmica e que podemos controlar o que pode ser criado. Mais a frente utilizaremos cada vez mais atoms para simplificar nosso código e estrutura-lo.