Devo usar um arquivo de configuração ou banco de dados para armazenar regras de negócios?

41

Li recentemente The Pragmatic Programmer, que afirma que:

Os detalhes atrapalham nosso código original - especialmente se eles mudam com frequência. Toda vez que precisamos alterar o código para acomodar alguma mudança na lógica de negócios, na lei ou no gosto pessoal da administração do dia, corremos o risco de quebrar o sistema - de introduzir um novo bug.

Caça, Andrew; Thomas, David (20/10/1999). O programador pragmático: do viajante ao mestre (localizações 2651-2653 do Kindle). Pearson Education (EUA). Edição Kindle.

No momento, estou programando um aplicativo Web que tem alguns modelos que possuem propriedades que só podem ser de um conjunto de valores, por exemplo (não um exemplo real, pois os dados do aplicativo Web são confidenciais):

luz-> tipo = esfera / cubo / cilindro

O tipo de luz pode ter apenas os três valores acima, mas de acordo com o TPP eu sempre devo codificar como se eles pudessem mudar e colocar seus valores em um arquivo de configuração. Como existem vários incidentes disso em todo o aplicativo, minha pergunta é:

Devo armazenar valores possivelmente como estes em:

  • um arquivo de configuração:
    'light-types' => array(sphere, cube, cylinder),
    'other-type' => value,
    'etc' => etc-value

  • uma única tabela em um banco de dados com uma linha para cada item de configuração

  • Uma base de dados com uma tabela para cada item de configuração (por exemplo, a tabela: light_types; colunas: id, name)

  • alguma outra maneira?

Muito obrigado por qualquer assistência / experiência oferecida.

foiseworth
fonte

Respostas:

45

A mesma pergunta surge na maioria dos projetos em que trabalho. Normalmente, faço isso:

  1. Se é improvável que o conjunto de valores possíveis mude tão cedo, utilizo constantes / enums de classe / interface nos campos de código e enumeráveis ​​no banco de dados. Exemplo: estado da publicação das entradas do blog: 'não publicado', 'com moderação', 'publicado' etc.
  2. Os valores provavelmente mudarão, mas as alterações não afetarão os arquivos de configuração da lógica do programa. Exemplo: lista de "como você encontrou nosso site?" opções para uma lista suspensa no formulário de compras on-line.
  3. É provável que os valores mudem com frequência e / ou sejam editados por não desenvolvedores, mas essas alterações não afetarão a lógica - um banco de dados ou pelo menos um armazenamento de valores-chave com alguma interface amigável para edição.
  4. Alterar os valores afetará a lógica - provavelmente o sistema precisa ser reprojetado (geralmente verdadeiro) ou é necessário algum mecanismo de regras de negócios. O caso mais difícil que eu vi até agora foi o construtor de testes psicológicos em que meu colega trabalhou. Cada tipo de teste pode ter seu próprio sistema de pontuação, que pode variar de simples adição a várias escalas de características com valores positivos e negativos ou até avaliação humana de respostas. Após algumas discussões sobre esse projeto, acabamos usando Lua como um mecanismo de script, que entra em conflito com a capacidade de não desenvolvedores criarem novos testes (mesmo que Lua seja uma linguagem relativamente simples, você não deve esperar que um não programador vai aprender).

Sobre a citação da TPP. Eu acho que é verdade para intocada código, mas na vida real, é melhor começar simples ( keep it simple ) e adicionar funcionalidades mais tarde, se eles estão realmente necessário ( YAGNI ).

scriptin
fonte
7

Se seus dados estiverem em um banco de dados, eu recomendaria ter uma tabela de 'light_types' no mesmo banco de dados. Isso permite que você use chaves estrangeiras para impor uma restrição de que o tipo light-> possa ser apenas um desses valores; portanto, mesmo se o código falhar, os dados no banco de dados sempre serão válidos.

Se os dados não forem armazenados em um banco de dados, a criação de apenas um monte de enumerações não fará muito bem. Eu recomendaria um arquivo de configuração, se você realmente quiser evitar codificar os valores.

(Eu recomendaria não ir longe demais para evitar a codificação codificada. Em qualquer sistema não trivial, haverá suposições sobre regras e requisitos de negócios, independentemente de os autores perceberem ou não. Mesmo se você, de alguma maneira, conseguir evitar tudo suposições e código de software absolutamente tudo, você basicamente acaba com um "mecanismo de regras", uma espécie de sistema dentro de um sistema e / ou meta-linguagem, e você tem um monte de coisas na meta-linguagem para implementar as regras.Você não salvou nenhum trabalho ou ganhou flexibilidade, apenas teve que criar e / ou aprender outro idioma.

Agora, se você deseja encontrar e usar um mecanismo de regras existente, isso pode economizar um pouco de trabalho (além de responder à pergunta de onde armazenar enumerações). Mas construir o seu próprio trabalho apenas dobra a carga de trabalho e, inevitavelmente, gera um sistema de meia-boca, construído por pessoas que realmente não sabem como criar um mecanismo de regras decente.)

cHao
fonte
0

Em geral, um banco de dados deve ser usado para dados e um arquivo de configuração deve ser usado para configuração. (como o nome sugere :) ). Manter a configuração no banco de dados é uma separação ruim de preocupações e só deve ser feita se você tiver um bom caso de uso para justificá-lo.

Há um equilíbrio a ser atingido ao decidir quanta configuração usar. Você deve tratar seus arquivos de configuração tanto como parte de um aplicativo quanto o código. Mantenha-o o mais conciso possível. É muito fácil para os aplicativos sofrerem um inchaço de configuração, onde você acaba com um enorme arquivo xml cheio de seqüências de caracteres mágicas.

No caso de você descrever, seria razoável ter um elemento de configuração para definir qual arquivo css usar. (você pode simplesmente alterá-lo se os requisitos mudarem). Seria um exagero configurar o estilo de cada elemento no arquivo de configuração

Tom Squires
fonte
1
Como você define o que é configuração e o que são dados?
nafg
3
Sua resposta não explica por que o armazenamento de uma configuração em um banco de dados viola a separação de preocupações (a preocupação de um banco de dados é armazenar dados; ele não se importa com os dados que você armazena lá) ou por que isso é ruim; A resposta agora está sendo citada em outro lugar como prova de que é uma coisa ruim.
Robert Harvey
os bancos de dados podem mudar sob demanda. podemos tê-los sendo assíncronos como o mysql. Arquivos estáticos suportam isso? DE JEITO NENHUM! Então eu downvote :)
AmirHossein
Os arquivos estáticos do @AmirHossein suportam alterações sob demanda, desde que não estejam bloqueados. Isso não é argumento.
Zimano