Os tipos existem por uma razão: se eles não adicionassem nenhum benefício, não os teríamos e não os usaríamos; teríamos apenas "o tipo" e tudo seria isso. Eles não são apenas convenientes, mas também agregam segurança e eficiência. A seguir, é apresentada uma lista de por que você deve sempre persistir tipos no formato nativo e não como seqüências de caracteres . Usei DateTime
como exemplo a maior parte do tempo, mas os mesmos princípios se aplicam a qualquer tipo primitivo, como números inteiros, decimais, binários etc.
Banco de dados
Restrições
Restrição de tipo
Quase todos os armazenamentos de dados permitem especificar restrições nos dados, isso inclui restrições de tipo. Um dos principais benefícios da especificação de uma DateTime
instância é que os dados armazenados serão restritos a esse tipo. Nunca será possível inserir nada além de uma data e hora, independentemente de como os dados foram inseridos no armazenamento. O último é importante para sistemas maiores, onde existem vários processos que interagem diretamente com a loja. Isso também inclui a tentativa de adicionar datas defeituosas como 30 de fevereiro (de qualquer ano), pois fevereiro pode ter apenas 29 dias em um ano bissexto e 28 dias em anos não bissextos.
Restrições de validação
Também há restrições de validação que podem ser implementadas no Data Store, como garantir que uma data inserida não exceda a data atual ou que uma data de início ocorra antes de uma data de término.
Operações
A maioria das lojas de dados também têm construído em operações / funções como DateAdd
ou DatePart
no MS SQL Server. Isso permite que você comece a filtrar ou selecionar dados específicos enquanto os dados ainda estão na loja (ainda não recuperados para o aplicativo).
Formato universalmente aceito
Ao usar o tipo nativo, outros desenvolvedores ou sistemas que também interagem com a loja não precisam ser informados nos mínimos detalhes de como esse tipo primitivo é armazenado. Não é esse o caso se esse tipo foi armazenado como uma sequência, então você deve garantir que todos entendam o formato dessa DateTime
representação de sequência. Esse sistema se torna frágil ao lidar com dados que abrangem localidades, regiões e culturas na origem dos dados, o local físico de um aplicativo e os atributos do usuário / sistema final que está interagindo com esses dados. Exemplo: o formato da data em um país pode ser MM / dd / aaaa (como nos EUA), mas em outro pode ser dd / MM / aaaa, detectar essa diferença se torna quase impossível.
Rapidez
Velocidade de recuperação, velocidade de validação, velocidade de operações e eficiência de armazenamento também são fatores importantes. Exemplo da velocidade de recuperação: os armazenamentos de dados permitem índices em colunas e esses índices geralmente podem ser usados com mais eficiência se o tipo for armazenado em seu formato nativo.
Aplicação
Data de acesso
A execução de consultas na loja se torna mais simples usando o sistema de tipo nativo, pois os desenvolvedores, mais uma vez, não precisam adivinhar o formato de armazenamento. Quase todos os provedores de aplicativos de armazenamento de dados ( exemplo: ado.net ) fornecem mecanismos para criar as consultas parametrizadas adequadas com base nos tipos nativos transmitidos. Veja um exemplo de adição da parte Data a uma consulta ado.net em um armazenamento do Sql Server, fazer o mesmo com strings seria muito complicado e frágil / propenso a erros.
command.Parameters.Add(new SqlParameter("@startDate", SqlDbType.Date) {Value = myDateInstance.Date});
Operações
Os tipos nativos no código também fornecem operações padrão como o tipo .net System.Date
. As operações são geralmente de natureza matemática, como adicionar datas, encontrar a diferença entre datas, etc. Novamente, isso não é possível com facilidade nos tipos de string.
Camada de apresentação
Localidade
Quando um tipo primitivo é finalmente convertido em uma sequência na camada de apresentação ( o local correto na pilha do programa), o programador agora tem várias opções para exibi-lo corretamente de acordo com o contexto em que é apresentado. Esse contexto geralmente consiste no significado real dos dados e na localidade do usuário.
Exemplo 1
Uma instância de data e hora pode ser formatada automaticamente com base no código do idioma do usuário.
DateTime.Now.ToString("D", CultureInfo.GetCultureInfo(userContext.Culture))
Exemplo 2
Uma instância decimal pode estar representando um valor (moeda) e o código do idioma do usuário também deve exibir o valor de acordo com sua preferência. Um aplicativo c # pode então exibir o valor usando
amount.ToString("C", CultureInfo.GetCultureInfo(userContext.Culture))
Isso pode ser crítico, pois culturas diferentes exibem números de maneira diferente. No período dos EUA (.) E vírgula (,) têm o significado reverso exato, como na Holanda.
Localização
Isso é muito específico para DateTime
instâncias. Uma data e hora representam uma ocorrência em um momento específico, mas isso geralmente deve ser transmitido / apresentado ao usuário, dependendo de seu próprio fuso horário. Exemplo: uma DateTime
instância 2016-09-21T23:38:21.399Z
pode ser exibida como 9/21/2016 5:21 PM
para um usuário no fuso horário oriental nos EUA. Existem várias maneiras de fazer isso, mas torna-se quase impossível se a instância de data e hora for mantida na memória como um tipo de sequência ou no armazenamento de dados como um tipo de sequência.
Regra geral
As 2 regras gerais para um aplicativo seguem quando se trata de converter qualquer tipo primitivo em uma representação de cadeia de caracteres.
- Ao aceitar a entrada, converta essa entrada no tipo primitivo correto o mais cedo possível na pilha do programa (geralmente na camada de apresentação)
- Ao recuperar dados a serem exibidos, converta esses dados na representação de string o mais tarde possível na pilha do programa (novamente, geralmente na camada de apresentação)