C sharp - ayuda con patrones de diseño

   
Vista:

ayuda con patrones de diseño

Publicado por Bryan (1 intervención) el 16/03/2018 14:45:01
A ver si alguien me puede dar una mano con este ejemplo:
Se realiza una venta de productos, los productos pueden ser A,B, o C, y se le puede vender a clientes X, Y, y a cada producto se le hace un descuento dependiendo del producto que sea y el cliente que lo compre, por lo que tengo 6 reglas distintas.
Yo pense en armar un strategy descuento, y las 6 combinaciones tendrian cada una una concreteStrategy, lo que quiero es tener en la clase venta un metodo que me calcule el descuento total, tomando una lista de productos y que use esas strategys, el problema es como hago para que decida ante un producto y cliente la strategy a usar.
Aclaro: no quiero usar condicionales, necesito que sea escalable.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ayuda con patrones de diseño

Publicado por Agustin (46 intervenciones) el 20/03/2018 03:38:03
Una forma dentro de todo feliz de hacer esto en C# es crear un diccionario donde la key sea una tupla entre tipo de producto y tipo de cliente y el valor sea una función que devuelva el precio final o bien el monto a descontar (como te sea más cómodo).

Después es cuestión de buscar en el diccionario y aplicar la función (si existe) o devolver un valor por default si no existe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using static ConsoleApp5.TipoCliente;
using static ConsoleApp5.TipoProducto;
 
static class CalculadorDescuento
{
    private static decimal DescontarMontoFijo(this Venta venta, decimal monto) => venta.Producto.PrecioBase - monto;
    private static decimal DescontarPorcentual(this Venta venta, decimal porcentaje) => venta.DescontarMontoFijo(venta.Producto.PrecioBase * porcentaje);
 
    public static decimal AplicarDescuento(Venta venta)
    {
        var funcionesDescuento =
        new Dictionary<(TipoProducto, TipoCliente), Func<Venta, decimal>>
        {
            [(A, X)] = v => v.DescontarPorcentual(0.1m),
            [(A, Y)] = v => v.DescontarPorcentual(0.08m),
            [(A, Z)] = v => v.DescontarPorcentual(0.08m),
            [(B, X)] = v => v.DescontarMontoFijo(50m),
            //.... y asi....
        };
 
        var key = (venta.Producto.Tipo, venta.Cliente.TipoCliente);
 
        return
            funcionesDescuento.ContainsKey(key)
            ? funcionesDescuento[key](venta)
            : venta.Producto.PrecioBase;
    }
}

Fijate que no tuve que crear ninguna clase, ni usar "patrones de diseño", ni ninguna de esas idioteces que se usaban en 1999.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad