Andres Felipe Correa Villa
Muy interesante los Enum y los Records, estoy en un proyecto donde analizaré donde puedo iniciar a implementar lo de esta clase.
Cuando un proyecto crece, manejar variables sueltas deja de ser práctico. Agrupar datos relacionados en estructuras bien definidas es la base de cualquier sistema robusto. Aquí se explica cómo usar clases, enums y records en C# para modelar un producto dentro de un proyecto de inventario, garantizando código limpio, seguro y fácil de mantener.
¿Qué es una clase y por qué unifica los datos de un producto?
Una clase es un molde para crear objetos. Define qué datos tiene un objeto y cómo se comporta [00:14]. En lugar de declarar variables sueltas —string para nombre, decimal para precio, int para cantidad— una clase las agrupa bajo una sola estructura.
Dentro del proyecto de inventario se crea el archivo Producto.cs en la carpeta models [01:06]. La clase Producto se declara como pública, lo que significa que es accesible desde cualquier parte del código para lectura o escritura [01:19].
Los tipos de datos que contiene son:
int para la ID del producto.string para nombre y descripción.decimal para el precio.int para la cantidad.DateTime para la fecha de registro.¿Qué papel juegan get y set en las propiedades?
Cada propiedad lleva entre corchetes las palabras get y set [00:44]. Get obtiene el valor almacenado y set permite sobrescribirlo. Sin embargo, no todas las propiedades necesitan ambos. La propiedad ValorTotal no tiene get ni set porque tiene asignado directamente un cálculo mediante una expresión lambda: Precio * Cantidad [01:56]. Estas son las llamadas propiedades calculadas, que derivan su valor de otras propiedades en tiempo real.
El método ToString usa la palabra clave override para darle un formato de salida personalizado al producto [01:49].
¿Qué es DateTime y por qué investigarlo?
DateTime es el tipo de dato que representa la fecha de registro del producto [02:08]. Se trata de un tipo nativo de C# que almacena fecha y hora con gran precisión.
¿Cómo personalizar tipos de datos con enums?
Los enums son conjuntos de constantes con nombre [03:04]. En el proyecto se crean dos archivos dentro de models: CategoriaProducto.cs y EstadoProducto.cs [02:30].
Usar enums en lugar de strings tiene una ventaja decisiva: el compilador valida los valores [03:13]. Si escribes electrónica en minúscula cuando el enum espera Electronica, obtienes un error de compilación antes de ejecutar el programa [03:32]. Con strings, cualquier texto sería aceptado sin validación.
La forma de acceder a un valor del enum es mediante la notación punto: CategoriaProducto.Electronica, CategoriaProducto.Hogar [03:57]. Esto elimina conversiones de strings inválidos en tiempo de ejecución.
Una buena práctica mencionada es usar comentarios XML para documentar el proyecto a medida que crece [02:53]. Esto mejora la legibilidad y facilita el mantenimiento.
¿Cuándo usar records en lugar de clases?
Hay datos que no deberían cambiar una vez creados. Para esos casos se utilizan records [04:20]. En el proyecto se crea Proveedor.cs como un record público con los tipos de dato: ID, nombre, email y teléfono [04:43].
Las diferencias clave entre class y record son:
Producto es class porque su cantidad y precio pueden cambiar. Proveedor es record porque, una vez creado con datos fijos, no debería modificarse [05:26].
Las propiedades calculadas con lambda no requieren get ni set, los enums garantizan valores válidos en tiempo de compilación y los records protegen datos que deben permanecer constantes. Si ya estás implementando estas estructuras en tu proyecto, comparte en los comentarios cómo organizaste tus models y qué descubriste sobre DateTime.
Aquí el código de los archivos de src/models:
CategoriaProducto.cs
namespace InventarioApp.src.models { public enum CategoriaProducto { Electronica, Ropa, Alimentos, Hogar, Deportes, Libros, Otros } }
EstadoProducto.cs
/// <summary> /// Ciclo de vida de un producto en el inventario /// </summary> namespace InventarioApp.src.models { public enum EstadoProducto { /// <summary> /// Disponible para venta. /// </summary> Activo, /// <summary> /// Temporalmente fuera de disponibilidad. /// </summary> Inactivo, /// <summary> /// Retirado permanentemente del catalogo. /// </summary> Descontinuado } }
Producto.cs
namespace InventarioApp.src.models { public class Producto { private string _nombre = ""; private decimal _precio; private int _cantidad; public int Id { get; set; } public string Nombre { get => _nombre; set { if (string.IsNullOrWhiteSpace(value)) { throw new ArgumentNullException($"Nombre no puede estar vacio {value}"); } _nombre = value; } } public decimal Precio { get => _precio; set { if (value < 0) { throw new ArgumentNullException($"Precio no puede ser un valor negativo"); } _precio = value; } } public int Cantidad { get => _cantidad; set { if (value < 0) { throw new ArgumentNullException($"Cantidad no puede ser un valor negativo"); } _cantidad = value; } } public CategoriaProducto Categoria { get; set; } public EstadoProducto Estado { get; set; } = EstadoProducto.Activo; public DateTime FechaRegistro { get; set; } = DateTime.Now; public decimal ValorTotal => Precio * Cantidad; } }
Proveedor.cs
namespace InventarioApp.src.models { public record Proveedor( int Id, string Nombre, string Email, string Telefono); }
Andres Felipe Correa Villa
Muy interesante los Enum y los Records, estoy en un proyecto donde analizaré donde puedo iniciar a implementar lo de esta clase.