Prática recomendada para criar uma classe de configuração 'global' usada por vários componentes


11

Eu tenho um projeto grande com uma parte de driver e cerca de 5 bibliotecas executando várias tarefas associadas. Muitas das bibliotecas requerem acesso a dados de configuração 'globais' que são lidos de um banco de dados na inicialização pelo código do driver. Por motorista, quero dizer apenas a parte que contém a função principal.

Minha idéia sobre como lidar com isso foi criar uma classe de configuração com um método estático para obter os itens de configuração. Essa é a melhor abordagem? De que outra forma isso poderia ser alcançado?

por exemplo:

class config {
 public:
   static get_item(key);

 private:
   static values;
};

O design singleton é apropriado aqui?

Respostas:


14

A maneira não-singleton é criar uma classe de configuração regular com propriedades / membros regulares, instanciar esse objeto com as configurações corretas do banco de dados no driver e passar a instância para todas as bibliotecas - provavelmente através de um std :: shared_ptr. Esse é um padrão de design comum chamado Injeção de Dependência .

Dessa forma, você evita todos os problemas em potencial do padrão de design singleton e seu código será mais testável, pois você pode instanciar uma instância de sua classe de configuração da maneira que desejar, com quaisquer dados, para teste.


+1, queria adicionar essa questão da testabilidade à minha própria resposta, mas você foi mais rápido.
Doc Brown

Ligeiramente OT: Isso ainda não é um Singleton, apenas implementado de maneira diferente?
Adhominem

1
@adhominem - não, é um objeto para o qual existe apenas uma instância, mas não há máquinas especiais em torno dela.
Joris Timmermans

@ OliverWeiler - correto, e eu realmente deveria ter mencionado esse nome de padrão de design na minha resposta, então estou adicionando-o agora.
Joris Timmermans

1

Acho que esse é um dos momentos em que um Singleton é realmente a coisa certa a se fazer.

Em relação à interface da própria classe, você pode obter o nome da chave ou ter acessadores para os valores de configuração individuais. O último esquema oferece alguma conveniência (conclusão do IDE para um) e permite converter os valores de configuração nos tipos de dados corretos antes de usá-los. Ele também introduz alguma separação entre os usuários da classe config e sua implementação interna (o fato de que todos os valores de configuração são armazenados como, por exemplo, strings, é um detalhe de implementação que o usuário da classe não deve se preocupar).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.