ti-enxame.com

Melhor maneira de salvar as configurações do aplicativo

No Windows, a maneira padrão é o registro. Isso permite diferenciar as configurações de todo o sistema e por usuário.

No Unix, você deve usar arquivos de texto na pasta/etc para configurações em todo o sistema (qual é a convenção para configurações por usuário?).

Muitos programas novos (e especialmente aqueles projetados para serem portáteis) usam arquivos XML.

  • Qual é a melhor maneira (e local) de armazenar configurações que não sejam BLOB?
  • Devemos seguir cada padrão do sistema ou ter uma solução unificada?
  • E qual é a melhor maneira portátil?
17
Wizard79

Qual é a melhor maneira (e local) de armazenar configurações que não sejam BLOB?

No Windows, parece aceitável usar o registro. Na minha opinião, o registro era um sistema mal planejado e, em vez disso, um arquivo de texto simples no diretório Users\Username\AppData Deve ser preferido. É mais fácil fazer backup, menos perigoso para os usuários modificarem e mais fáceis de limpar.

No Linux e na maioria dos Unixes, o local preferido é /home/user/.config/appname Para configurações específicas do usuário e /etc/ Para configurações globais (em todo o sistema). O local menos preferido (mas aceitável) para as configurações do usuário é ~/.appname, Mas isso geralmente está desvalorizando. Esses arquivos devem ser editáveis ​​pelo usuário, portanto, sempre é preferível um formato legível por humanos.

Eu discordo da maioria das pessoas de que XML é um formato aceitável para armazenar dados que não são de blob. É, na minha opinião, um formato exagerado e excessivamente complexo para o que geralmente acaba sendo pedaços muito pequenos de dados estruturados. Prefiro ver arquivos em YAML, JSON, ASN.1, pares name = value ou formatos semelhantes. Ter muita sintaxe facilita demais o usuário bagunçar e deixar o arquivo em um formato inválido.

Devemos seguir cada padrão do sistema ou ter uma solução unificada?

Isso depende inteiramente de você, mas lembre-se de algumas coisas:

  • Plataformas como * nix têm limitações estritas sobre quais locais são graváveis. Mais rigoroso que o Windows. Assim:
    • O único local para o qual você deve escrever é no diretório inicial do usuário.
    • A menos que seu aplicativo seja um serviço do sistema; nesse caso, todos os arquivos de dados mutáveis ​​devem ser gravados em /var/. Arquivos de dados não mutáveis ​​devem ser mantidos no diretório do aplicativo em /usr/share/ Ou /usr/local/share/ Ou /opt/
    • Os arquivos de configuração em /etc/ nunca devem ser gravados pelo aplicativo quando estiver em execução, mesmo que ele tenha acesso de gravação a eles. /etc/ Deve ser o repositório para comportamentos padrão e nada mais.
    • Planeje que seu aplicativo seja instalado em um dos três locais: /usr/local/, /opt/appname Ou /home/username/appname.
    • Os blobs devem ser armazenados ao lado de outros arquivos de configuração para que sejam alterados. É geralmente preferível usar um formato editável pelo usuário; portanto, é preferível algo como SQLite ou Berkeley DB (já que existem ferramentas de linha de comando para cada um) , mas não é necessário .
  • No Windows, seus aplicativos só devem escrever no diretório Usuário. O local padronizado para arquivos de dados é Users\User\AppData. Em nenhum outro lugar parece aceitável.
  • No Mac OS X, as configurações do seu aplicativo devem ser armazenadas em ~/Library/Preferences Junto com todos os arquivos plist dos outros aplicativos. plist parece ser o formato preferido, mas convém verificar com as diretrizes Apple.

E qual é a melhor maneira portátil?

Não há "melhor", para ser honesto. Existem apenas limitações e expectativas específicas da plataforma. Minha recomendação é seguir os meios específicos da plataforma, mesmo que isso signifique escrever mais código.

23
greyfade

No Windows, use %APPDATA%\appname. Em * NIX, use ~/.appname. Não use nomes de diretório fixos em nenhuma das plataformas, pois o diretório inicial do usuário pode ser diferente do padrão (pode estar na rede, por exemplo).

Quanto ao formato, use o que achar melhor. Essa é uma decisão que somente você pode tomar no contexto do seu aplicativo. É desnecessário e, de fato, desaconselhável, ter uma maneira "padrão" de fazê-lo, se essa maneira "padrão" não for a melhor para o seu programa em particular.

Por exemplo, XML/JSON pode ser uma boa maneira de armazenar dados/configuração do usuário se seu aplicativo já usa XML/JSON para outra coisa. Mas se é um arquivo de configuração simples, por que adicionar inchaço ao seu aplicativo introduzindo uma dependência? Nesse caso, provavelmente é melhor usar apenas um arquivo de texto simples com var: value\n linhas em vez disso.

EDIT: Não existe uma "melhor" maneira portátil, pois os sistemas operacionais usam convenções muito diferentes para isso. Não quebre os padrões do sistema operacional sem uma boa razão.

EDIT2: Se você estiver fazendo uma configuração em todo o sistema em /etc ou HKEY_LOCAL_MACHINE, pergunte-se se a configuração é realmente global. Aguarde 5 minutos e pergunte a si mesmo novamente. Se a resposta ainda for afirmativa, faça um ajuste global. Lembre-se, um usuário normal não tem acesso de gravação a /etc ou HKEY_LOCAL_MACHINE e, ao fazer isso, você garante que alguém sem direitos de administrador não possa instalar seu aplicativo.

8
Chinmay Kanchi

Eu tento e manter fora do registro, é caminho mais usado. Eu gostaria que todos o fizessem.

Eu gosto de manter arquivos de configuração xml ou um arquivo bin ou, ocasionalmente, um banco de dados local (SQLite).

3
µBio

Minha resposta é uma combinação do resposta de Chinmay Kanchi e do resposta de BioBuckyBall.

XML/Json para configurações simples, SQLite para configurações maiores e complexas estacionadas na pasta de aplicativos do SO padrão ou na pasta do usuário do SO padrão quando as configurações dependem do usuário. Ambos podem ser usados.

3
Maniero

No Windows, eu manteria a configuração do aplicativo na pasta AppData

2
Graviton

As configurações do usuário geralmente estão em

/home/<user>/.<application> 

Por exemplo, para as configurações do irssi, são /home//.irssi/config

1
Chris

Eu acho que é melhor usar o mecanismo específico da plataforma preferido. Por exemplo, no OS X, o mecanismo preferido é colocar uma lista de propriedades em ~/Library/Preferences, e a API Cocoa possui uma interface realmente simples para armazenar e recuperar configurações a partir daí.

Se o seu aplicativo for multiplataforma, você poderá abstraí-lo com uma classe ou outros enfeites.

1
mipadi

A única coisa que escrevo no registro é a localização do aplicativo, para que os instaladores e atualizadores possam encontrá-lo facilmente. Todo o resto é armazenado em arquivos em/AppData/Company/App

0
GrandmasterB