FWIW, I tend to use this rule: if the key is necessary when matching the pattern, keep it in the pattern, otherwise move it to the body. So I end-up with code like this:
def some_fun(%{field1: :value} = struct) do
%{field2: value2, field3: value3} = struct
...
end
No. foo["bar"]
also works for lists and it would be hard to argue why it works only for maps and not lists. It is probably another reason against map.field
.