Los tipos existen por una razón, si no agregaran ningún beneficio, entonces no los tendríamos y no los usaríamos y simplemente tendríamos "el tipo" y todo sería eso. No solo son convenientes, sino que también agregan seguridad y eficiencia. La siguiente es una lista de por qué siempre debe persistir los tipos en su formato nativo y no como cadenas . Usé DateTime
como ejemplo la mayor parte del tiempo, pero los mismos principios se aplican a cualquier tipo primitivo como enteros, decimales, binarios, etc.
Almacén de datos
Restricciones
Restricción de tipo
Casi todos los almacenes de datos permiten especificar restricciones en los datos, esto incluye restricciones de tipo. Uno de los principales beneficios de especificar una DateTime
instancia es que los datos almacenados estarán restringidos a ese tipo. Nunca será posible ingresar nada que no sea una fecha y hora, independientemente de cómo se insertaron los datos en la tienda. Esto último es importante para sistemas más grandes donde existen múltiples procesos que interactúan directamente con la tienda. Esto también incluye tratar de agregar fechas defectuosas como el 30 de febrero (de cualquier año) ya que febrero solo puede tener 29 días en un año bisiesto y 28 días para los años no bisiestos.
Restricciones de validación
También hay restricciones de validación que se pueden implementar en el Almacén de datos, como garantizar que una fecha insertada no supere la fecha actual o que se produzca una fecha de inicio anterior a una fecha de finalización.
Operaciones
La mayoría de los almacenes de datos también tienen operaciones / funciones integradas como DateAdd
o DatePart
en MS Sql Server. Esto le permite comenzar a filtrar o seleccionar datos específicos mientras los datos todavía están en la tienda (aún no se han recuperado en la aplicación).
Formato universalmente aceptado
Al usar el tipo nativo, otros desarrolladores o sistemas que también interactúan con la tienda no tienen que estar informados sobre los detalles minuciosos de cómo se almacena ese tipo primitivo. Este no es el caso si ese tipo se almacenó como una cadena, entonces debe asegurarse de que todos entiendan el formato de esa DateTime
representación de cadena. Este sistema se vuelve frágil cuando se trata de datos que abarcan entornos locales, regiones y culturas en el origen de datos, la ubicación física de una aplicación y los atributos del usuario / sistema final que está interactuando con esos datos. Ejemplo: el formato de fecha en un país podría ser MM / dd / aaaa (como en los EE. UU.) Pero en otro podría ser dd / MM / aaaa, detectar esa diferencia se vuelve casi imposible.
Velocidad
La velocidad de recuperación, la velocidad de validación, la velocidad de las operaciones y la eficiencia del almacenamiento también son factores importantes. Ejemplo de la velocidad de recuperación: los almacenes de datos permiten índices en columnas y estos índices generalmente se pueden usar de manera más eficiente si el tipo se almacena en su formato nativo.
Solicitud
Acceso a los datos
Ejecutar consultas en la tienda se vuelve más simple usando el sistema de tipo nativo ya que los desarrolladores, una vez más, no tienen que adivinar el formato de almacenamiento. Casi todos los proveedores de aplicaciones de almacenamiento de datos ( ejemplo: ado.net ) proporcionan mecanismos para crear las consultas parametrizadas adecuadas en función de los tipos nativos pasados. Aquí hay un ejemplo de cómo agregar la parte Fecha a una consulta ado.net en un almacén de SQL Server, hacer lo mismo con las cadenas sería muy engorroso y frágil / propenso a errores.
command.Parameters.Add(new SqlParameter("@startDate", SqlDbType.Date) {Value = myDateInstance.Date});
Operaciones
Los tipos nativos en el código también proporcionan operaciones estándar como el tipo .net System.Date
. Las operaciones suelen ser de naturaleza matemática, como agregar fechas, encontrar la diferencia entre fechas, etc. Nuevamente, esto no es posible hacerlo fácilmente en los tipos de cadena.
Capa de presentación
Lugar
Cuando un tipo primitivo finalmente se convierte en una cadena en la capa de presentación ( la ubicación correcta en la pila de programas para hacerlo ) el programador ahora tiene varias opciones para mostrarlo correctamente de acuerdo con el contexto en el que se presenta. Este contexto generalmente consiste en el significado real de los datos y la configuración regional del usuario.
Ejemplo 1
Una instancia de fecha y hora se puede formatear automáticamente en función de la configuración regional del usuario.
DateTime.Now.ToString("D", CultureInfo.GetCultureInfo(userContext.Culture))
Ejemplo 2
Una instancia decimal podría representar una cantidad (moneda) y la configuración regional del usuario también debería mostrar la cantidad de acuerdo con sus preferencias. Una aplicación de C # podría mostrar el valor usando
amount.ToString("C", CultureInfo.GetCultureInfo(userContext.Culture))
Esto podría ser crítico ya que las diferentes culturas muestran los números de manera diferente. En el período de EE. UU. (.) Y la coma (,) tienen el significado inverso exacto que en los Países Bajos.
Ubicación
Esto es muy específico para las DateTime
instancias. Una fecha y hora representan una ocurrencia en un momento específico en el tiempo, pero esto generalmente tiene que ser transmitido / presentado al usuario dependiendo de su propia zona horaria. Ejemplo: una DateTime
instancia 2016-09-21T23:38:21.399Z
podría mostrarse como 9/21/2016 5:21 PM
para un usuario en la zona horaria del este de los EE. UU. Hay muchas maneras de lograr esto, pero se vuelve casi imposible si la instancia de fecha y hora se mantiene en la memoria como un tipo de cadena o en el almacén de datos como un tipo de cadena.
Regla general
Las 2 reglas generales para una aplicación que se siguen cuando se trata de convertir cualquier tipo primitivo en una representación de cadena son las siguientes
- Al aceptar la entrada, convierta esa entrada al tipo primitivo correcto lo antes posible en la pila de programas (generalmente en la capa de presentación)
- Al recuperar los datos que se mostrarán, conviértalos a la representación de cadena lo más tarde posible en la pila del programa (nuevamente, generalmente en la capa de presentación)