vtex simple sesiones para pagina hacer construyendo con compras como codigo carro carrito bootstrap abandonado design design-patterns architecture

design - simple - ¿Qué arquitectura puedo usar para manejar un carrito de compras donde cada producto requiere diferentes atributos para ser guardado?



construyendo un carro de compras con php y mysql (4)

Estoy construyendo una aplicación que es muy similar a un carrito de compras. El usuario selecciona un producto de una lista y, a continuación, basándose en ese producto, es necesario establecer y guardar algunas propiedades.

Ejemplo.

Si el usuario selecciona un tipo de pintura que permita coincidencias de color personalizadas, entonces debo permitir que ingresen un número de fórmula que recibieron a través de un proceso de coincidencia de color. Así que tengo un artículo Detail de pedido para un producto que es un tipo de Paint, y ese sku tiene el atributo de "AllowsCustomColorMatch", pero también debo almacenar el Número de fórmula en alguna parte.

No estoy seguro de cómo manejar esto elegantemente a lo largo de mi código. ¿Debo crear subclases o productos? En este momento estoy guardando los datos que ingresa el usuario en un objeto OrderDetails que tiene una referencia al Producto al que está asociado.


Evitaría hacer una clase para cada producto. Cada uno de sus productos son instancias de la misma clase de Producto.

Con esas propiedades variables, un enfoque de diccionario (básicamente un mapa de pares clave-valor, tipo específico o no) es una gran manera de mantener la flexibilidad en el diseño. No está hablando del inventario de productos del tamaño de amazon.com, así que creo es un diseño lo suficientemente bueno para la perforación que necesita.


Puede tener una clase de Producto con una colección de propiedades de productos

public class Product { private Dictionary<string, string> properties; /// <summary> /// Gets or sets the name. /// </summary> /// <value>The name.</value> public string Name { get; set; } /// <summary> /// Gets or sets the price. /// </summary> /// <value>The price.</value> public double Price { get; set; } public Dictionary<string, string> Properties { get; } public Product() { properties = new Dictionary<string, string>(); } }

En el origen de datos puede tener una tabla que defina las propiedades para cada tipo de producto. Luego, cuando renderice la página, sabrá qué propiedades debe mostrar y el nombre que debe dar en el diccionario.


Dependiendo de cómo tengas tu configuración actual de objetos; Crearía 2 clases de pintura. La primera clase de pintura toma todas las propiedades / campos comunes encontrados en la pintura. Luego crearía una segunda clase, lo llamaremos PaintSpecialize. PaintSpecialize heredará de Paint (dando a esta clase todas las propiedades y métodos de Paint). En PaintSpecialize, puede agregar la propiedad Fórmula a la clase. Después de lo cual, solo se trata de lanzar los objetos. C # ex:

public class Paint { private decimal _price; private bool _allowFormula; public Paint() { ... } public Paint(int price) { _price = price; } public ChangePrice(decimal p) { _price = p; } }

Y así.

PaintSpecialize se vería así:

public class PaintSpecialize : Paint { string _formula; [...] public PaintSpecialize(int price, string formula) : base(price) { _formula=formula; }

Después del código, es posible:

PaintSpecialize ps = new PaintSpecialize(15.00, "FormulaXXYY"); ps.ChangePrice(12.00); List<Paint> plist = new List<Paint>(); plist.Add((Paint)ps); foreach(Paint p in plist) { if(p.AllowFormula) { PaintSpecialize tmp = (PaintSpecialize)p; MessageBox.Show(tmp._formula); }

El código anterior brinda una visión simple (y no muy completa) de lo que puede hacer con la pintura. La lista ahora puede contener Paint y PaintSpecialize siempre que este último se emita correctamente. Puede manipular PaintSpecialize en la lista en cualquier momento simple al convertirlo de una simple Paint a una PaintSpecialize.

Entonces, si el cliente quiere pintura regular, cree un objeto Paint, si quiere una pintura personalizada, cree PaintSpecialize. Si el cliente quiere una pintura regular y personalizada, cree una de cada. Refiérase a ambos como Paint hasta que necesite usar algo de la clase PaintSpecialize.

Tenga en cuenta que el atributo AllowsCustomColorMatch se debe establecer en la clase base, de lo contrario, probablemente tendrá que trabajar un poco más para averiguar si la clase es del tipo PaintSpecialize.


Ya que está buscando una solución elegante, es posible que desee echar un vistazo al estilo arquitectónico del modelo de objetos adaptativo. Puedes buscar aquí , o aquí . Básicamente, su problema se puede resolver simplemente usando el patrón TypeSquare, tal vez con el patrón de intérprete para las reglas de negocio (si alguna vez se vuelve tan complejo).