Os arquivos de configuração externa são considerados um antipadrão?

8

Muitas vezes, estive em uma situação em que um aplicativo aparentemente estava quebrado, apenas para descobrir que um arquivo de configuração externo estava com defeito. Normalmente, isso ocorre porque o arquivo errado está lá ou contém dados incorretos.

Existe uma maneira melhor de permitir que um usuário / processo externo modifique as características de tempo de execução de um aplicativo ou essa é a solução mais conhecida para o problema?

Eu gostaria de ver uma discussão sobre o caso geral, em vez de focar, digamos, em Unix /etc ou Java JNDI e assim por diante.

Gary Rowe
fonte
2
de que outra forma você pode configurar ambientes de teste / dev / live / diferentes live? Meu ponto é a única opção - sempre haverá uma dependência externa.
NimChimpsky
5
Tudo o que você tiver será externo. O problema que você está enfrentando não é que a configuração seja externa, mas que seja mal gerenciada e entendida.
Oded
2
Mas é isso: os arquivos de configuração tendem a ser mal gerenciados ou compreendidos.
Telastyn
4
Quanto ao "arquivo errado" - existe uma boa técnica Unixish: use um wrapper de script para iniciar seu binário, definindo todas as variáveis ​​de ambiente de configuração localmente. Dessa forma, é sempre claro qual configuração você escolheu.
SK-logic
1
A "alternativa" é que 99% dos parâmetros de configuração sejam opcionais. Deve haver valores padrão sensíveis. Quando a configuração precisa de seu próprio arquivo dedicado e se torna maior que o código executável, isso indica que a configurabilidade vai além da utilidade. Imagine se você precisasse de 35 parâmetros a serem especificados antes de poder executar curl.
Sridhar Sarnobat 11/02/19

Respostas:

13

A maioria dos aplicativos requer alguma configuração externa; você pode ocultar isso tornando-o dependente de variáveis ​​mágicas ou salvando-o em algum local interno, mas isso não removerá a necessidade. O objetivo é reconhecer o que deve ser externo e o que pode ser interno. Somente as partes internas podem ser testadas.

Um aplicativo não deve confiar em um arquivo de configuração externo para estar correto. Ele deve verificar a correção e relatar erros. Se não for possível para o aplicativo verificar o arquivo de configuração, provavelmente você está fazendo muito com ele. Se o arquivo de configuração alterar o comportamento do aplicativo, ele não deve ser externo na minha opinião.

Por exemplo, um nome de usuário / senha do banco de dados pode ser facilmente verificado pelo aplicativo tentando se conectar ao banco de dados. Se isso falhar, pode ser relatado e, obviamente, não é um bug no código do aplicativo. Da mesma forma, para um caminho de arquivo, a existência e os direitos de acesso podem ser verificados.

Agora, se você colocar consultas SQL no arquivo de configuração, o aplicativo não poderá verificar facilmente a exatidão dessas consultas. O mesmo vale para um arquivo completo de especificação de injeção de dependência (a Java-Spring XML). Esses não devem estar em arquivos de configuração externos.

Mas se a configuração especificada descrever algo externo e você puder verificar rapidamente sua correção, não acho que haja algo errado com os arquivos de configuração externos.

Editar: verifique também se seus relatórios de erro mostram qual arquivo de configuração é usado. Nada é mais frustrante do que descobrir que você estava olhando para o arquivo errado depois de horas tentando descobrir o que havia de errado com ele.

Jaap
fonte
4
+1 para a recomendação de validação interna - definitivamente uma obrigação para completar o padrão
Gary Rowe
6

Eu os classificaria mais como uma "área problemática conhecida" do que como antipadrão. A menos que você implante uma configuração fixa, precisará armazenar informações de configuração em algum lugar . Normalmente, gosto de armazenar a maioria das informações de configuração no banco de dados, mas você ainda precisa armazenar as informações de conexão com o banco de dados em algum lugar. Prefiro a abordagem Java / Spring de armazenar as informações de configuração na própria estrutura do aplicativo, em vez de (digamos) no diretório inicial do usuário ou no registro do Windows, mas isso é apenas uma preferência pessoal.

TMN
fonte
5

Arquivos de configuração externos NÃO são um antipadrão. Como tudo o mais, eles podem ser usados ​​bem ou mal, dependendo do sistema em questão.

Você parece ter encontrado alguns aplicativos em que a configuração externa pode interromper o aplicativo sem informar ao usuário o que está acontecendo. Isso é ruim, mas não é culpa dos arquivos de configuração, é quem decide quais partes estão nos arquivos de configuração e quais estão no aplicativo e como lidar com os erros entre eles.

Michael Kohne
fonte
4

Na minha opinião: NÃO , os arquivos de configuração externos não são um antipadrão.

É apenas uma técnica, um padrão arquitetural para gerenciar a complexidade do software.

Na era dos princípios de design do SOLID, você mudou a complexidade do software de Monolithic_application para módulos mais independentes que precisam ser conectados.

a alternativa para "arquivos de configuração externos" seria configurar os módulos diretamente por código.

k3b
fonte
Os padrões não se limitam ao código - um arquivo de configuração externo é um padrão de arquitetura, e não apenas uma técnica.
Gary Rowe
4

É preferível mover a configuração da lógica para os dados. Ele permite que você flexibilize o aplicativo sem a necessidade de refazer seu código. A falta de arquivos de dados é mais um caso de pouca documentação ou trabalho desleixado na instalação do que uma prática inadequada em termos de codificação do IMHO.

Onno
fonte
Concordo que as declarações declarativas são uma maneira mais direta e fácil de entender de especificar propriedades e (até certo ponto) comportamento. +1.
William Payne
3

Faça com que sua ferramenta SCM favorita faça duas tarefas como uma ferramenta CM: Coloque seus arquivos de configuração no repositório. Para alterar a configuração, confirme as alterações e permita que suas ferramentas de implantação automatizada as levem à produção (depois de executar vários testes automatizados, é claro!)

Et Voila! você tem um registro de todas as alterações na configuração, além da rede de segurança adicional de um sistema automatizado de CI / teste!

Como já foi mencionado, os padrões de arquitetura e design não se limitam ao sistema do produto, mas também à equipe / processo / sistemas que ajudam a produzi-lo.

William Payne
fonte
1
+1 para uma estratégia de implementação útil - praticamente como o Heroku faz isso com projetos do GitHub.
Gary Rowe
Você precisa garantir que suas configurações não estejam no mesmo repositório que o seu código, devido aos efeitos na ramificação e marcação de liberações.
Dietbuddha 23/05
1
Discordo. As configurações realmente devem estar no mesmo repositório que o código. Acredito que uma alteração de produção em um arquivo de configuração seja uma razão válida para confirmar (por exemplo) uma ramificação de etiqueta Svn. O principal benefício é que você pode procurar em um só lugar (o repositório) para ver tudo (o máximo possível) que possa estar afetando a produção. Muito mais fácil perseguir gremlins e bugs se você souber onde encontrar tudo. (Principalmente se você estiver usando algo como o Grafite para mapear confirmações contra métricas e alertas de desempenho)
William Payne