Deixe-me fazer uma contra-pergunta completamente séria: qual, na sua opinião, é a diferença entre "dados" e "código"?
Quando ouço a palavra "dados", penso em "estado". Os dados são, por definição, o que o próprio aplicativo foi projetado para gerenciar e, portanto, o que o aplicativo nunca pode saber em tempo de compilação. Não é possível codificar os dados porque, assim que você os codifica, eles se tornam comportamento - não dados.
O tipo de dados varia de acordo com o aplicativo; um sistema de faturamento comercial pode armazenar informações de clientes e pedidos em um banco de dados SQL e um programa de gráficos vetoriais pode armazenar dados e metadados de geometria em um arquivo binário. Nos dois casos e em todas as etapas, há uma separação clara e inquebrável entre o código e os dados. Os dados pertencem ao usuário , não ao programador, portanto nunca podem ser codificados.
O que você parece estar falando é usar a descrição tecnicamente mais precisa disponível para o meu vocabulário atual: informações que governam o comportamento do programa que não estão escritas na linguagem de programação primária usada para desenvolver a maioria do aplicativo.
Mesmo essa definição, que é consideravelmente menos ambígua do que apenas a palavra "dados", tem alguns problemas. Por exemplo, e se partes significativas do programa forem escritas em diferentes idiomas? Eu pessoalmente trabalhei em vários projetos que são cerca de 50% C # e 50% JavaScript. O código JavaScript é "data"? A maioria das pessoas diria que não. E o HTML, são esses "dados"? A maioria das pessoas ainda diz não.
E o CSS? São dados ou código? Se pensarmos no código como algo que controla o comportamento do programa, o CSS não é realmente um código, porque apenas (bem, principalmente) afeta a aparência, não o comportamento. Mas também não são realmente dados; o usuário não é o proprietário, o aplicativo nem mesmo é o proprietário. É o equivalente ao código para um designer de interface do usuário. É como código , mas não é exatamente código.
Eu poderia chamar CSS de um tipo de configuração, mas uma definição mais prática é que é simplesmente código em uma linguagem específica de domínio . É isso que seu XML, YAML e outros "arquivos formatados" geralmente representam. E a razão pela qual usamos uma linguagem específica de domínio é que, de um modo geral, é simultaneamente mais concisa e mais expressiva em seu domínio específico do que codificando as mesmas informações em uma linguagem de programação de uso geral como C ou C # ou Java.
Você reconhece o seguinte formato?
{
name: 'Jane Doe',
age: 27,
interests: ['cats', 'shoes']
}
Tenho certeza que a maioria das pessoas faz; é JSON . E aqui está a coisa interessante sobre o JSON: no JavaScript, é claramente um código e, em qualquer outra linguagem, são dados claramente formatados. Quase toda linguagem de programação convencional possui pelo menos uma biblioteca para "analisar" o JSON.
Se usarmos exatamente a mesma sintaxe dentro de uma função em um arquivo JavaScript, não poderá ser outra coisa senão código. E, no entanto, se pegarmos esse JSON, empurrá-lo em um .json
arquivo e analisá-lo em um aplicativo Java, de repente são "dados". Isso realmente faz sentido?
Argumento que o "data-ness" ou "configuration-ness" ou "code-ness" é inerente ao que está sendo descrito, não como está sendo descrito.
Se o seu programa precisar de um dicionário de 1 milhão de palavras para, por exemplo, gerar uma senha aleatória, você deseja codificá-lo da seguinte forma:
var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");
Ou você simplesmente colocaria todas essas palavras em um arquivo de texto delimitado por linhas e instruiria seu programa a ler? Realmente não importa se a lista de palavras nunca muda, não é uma questão de saber se você está codificando ou codificando (que muitos consideram corretamente um anti-padrão quando aplicado de maneira inadequada), é simplesmente uma questão de qual formato é mais eficiente e facilita a descrição do "material", qualquer que seja o "material". É bastante irrelevante se você chama de código ou dados; são as informações que seu programa requer para executar e um formato de arquivo simples é a maneira mais conveniente de gerenciá-lo e mantê-lo.
Supondo que você siga as práticas apropriadas, todo esse material está entrando no controle de origem, então você pode chamá-lo de código, apenas codificar em um formato diferente e talvez muito minimalista. Ou você pode chamá-lo de configuração, mas a única coisa que realmente diferencia o código da configuração é se você o documenta ou não e diz aos usuários finais como alterá-lo. Talvez você possa inventar algum argumento falso sobre a configuração que está sendo interpretada no momento da inicialização ou no tempo de execução e não no tempo de compilação, mas então você começaria a descrever várias linguagens de tipo dinâmico e quase certamente qualquer coisa com um mecanismo de script incorporado nela (por exemplo, maioria dos jogos). Código e configuração são tudo o que você decide rotulá-los como, nada mais, nada menos.
Agora, não é um perigo para a externalização de informação que não é realmente seguro para modificar (veja o link "soft codificação" acima). Se você externalizar sua matriz de vogais em um arquivo de configuração e documentá-lo como um arquivo de configuração para seus usuários finais, estará oferecendo a eles uma maneira quase infalível de interromper instantaneamente seu aplicativo, por exemplo, colocando "q" como vogal. Mas esse não é um problema fundamental da "separação de código e dados", é simplesmente um mau senso de design.
O que digo aos desenvolvedores juniores é que eles devem sempre externalizar as configurações que eles esperam mudar por ambiente. Isso inclui coisas como cadeias de conexão, nomes de usuário, chaves de API, caminhos de diretório e assim por diante. Eles podem ser os mesmos na sua caixa de desenvolvimento e na produção, mas provavelmente não, e os administradores de sistemas decidirão como eles querem que seja na produção, não nos desenvolvedores. Portanto, é necessário ter um grupo de configurações aplicadas em algumas máquinas e outras aplicadas em outras máquinas - ergo, arquivos de configuração externos (ou configurações em um banco de dados etc.)
Mas enfatizo que simplesmente colocar alguns "dados" em um "arquivo" não é o mesmo que externalizá-los na configuração. Colocar um dicionário de palavras em um arquivo de texto não significa que você deseja que os usuários (ou TI) o alterem, é apenas uma maneira de tornar muito mais fácil para os desenvolvedores entenderem o que está acontecendo e, se necessário, tornar mudanças ocasionais. Da mesma forma, colocar as mesmas informações em uma tabela de banco de dados não conta necessariamente como externalização de comportamento, se a tabela é somente leitura e / ou os DBAs são instruídos a nunca se ferrar com ela. A configuração implica que os dados são mutáveis, mas, na realidade, são determinados pelo processo e pelas responsabilidades, e não pela escolha do formato.
Então, para resumir:
"Código" não é um termo rigidamente definido. Se você expandir sua definição para incluir linguagens específicas de domínio e qualquer outra coisa que afete o comportamento, grande parte desse aparente atrito simplesmente desaparecerá e tudo fará sentido. Você pode ter um "código" DSL não compilado em um arquivo simples.
"Dados" implica em informações pertencentes ao (s) usuário (s) ou pelo menos a alguém que não seja o desenvolvedor, e que geralmente não estão disponíveis em tempo de design. Não poderia ser codificado, mesmo que você quisesse. Com a possível exceção do código auto-modificável , a separação entre código e dados é uma questão de definição, não de preferência pessoal.
A "codificação suave" pode ser uma prática terrível quando aplicada em excesso, mas nem toda instância de externalização constitui necessariamente uma codificação flexível, e muitas instâncias de armazenamento de informações em "arquivos simples" não são necessariamente uma tentativa genuína de externalização.
A configuração é um tipo especial de soft-de codificação que é necessário por causa do conhecimento que o aplicativo pode precisar executar em ambientes diferentes. A implantação de um arquivo de configuração separado junto com o aplicativo é muito menos trabalhosa (e muito menos perigosa) do que a implantação de uma versão diferente do código em todos os ambientes. Portanto, alguns tipos de soft-coding são realmente úteis.