Eu estive refletindo sobre os arquivos de configuração e sua relação com o código por um tempo e, dependendo do dia e da direção do vento, minhas opiniões parecem mudar. Cada vez mais, porém, continuo voltando à percepção que tive pela primeira vez ao aprender Lisp: há pouca diferença entre dados e código. Isso parece duplamente verdadeiro para arquivos de configuração. Quando visto sob a luz certa, um script Perl é pouco mais do que um arquivo de configuração para perl. Isso tende a ter consequências bastante pesadas para tarefas como controle de qualidade e divisões de trabalho, como quem deve ser responsável pela alteração dos arquivos de configuração.
O deslocamento do arquivo de configuração para a linguagem completa é geralmente lento e parece ser conduzido pelo desejo de ter um sistema genérico. A maioria dos projetos parecem começar pequenos, com alguns itens de configuração, como onde escrever logs, onde procurar dados, nomes de usuário e senhas, etc. Mas então eles começam a crescer: os recursos começam a ser ativados ou desativados, os tempos e a ordem das operações passam a ser controlados e, inevitavelmente, alguém quer começar a adicionar lógica a ele (por exemplo, use 10 se a máquina for X e 15 se a máquina for Y). Em um determinado ponto, o arquivo de configuração se torna um idioma específico de domínio, e mal escrito.
Agora que comecei a definir o cenário, aqui estão minhas perguntas:
- Qual é o verdadeiro propósito de um arquivo de configuração?
- Deve-se tentar manter os arquivos de configuração simples?
- Quem deve ser responsável por fazer alterações neles (desenvolvedores, usuários, administradores, etc.)?
- Eles devem ser controlados pela fonte (ver pergunta 3)?
Como eu disse antes, minhas respostas a essas perguntas mudam constantemente, mas agora estou pensando:
- para permitir que um não-programador altere grandes blocos de comportamento rapidamente
- sim, qualquer coisa que não seja granulada deve estar no código
- os usuários devem ser responsáveis pelos arquivos de configuração e os programadores devem ser responsáveis por uma camada de configuração entre os arquivos de configuração e o código que fornece um controle mais refinado do aplicativo
- não, mas a camada intermediária de granulação mais fina deve ser