Design pattern per applicare imposte diverse in base a molti fattori diversi

3

Mi è stato assegnato il compito di progettare un sistema che ha il prezzo di un prodotto con importi diversi di tasse diverse in base a diversi fattori.

Ad esempio negli Stati Uniti ne otterresti alcuni: uno basato sulla regione e un altro sullo stato e così via, mentre nell'UE si ottiene l'IVA. Sto cercando di individuare un modo non codificato di applicare imposte diverse in base a fattori diversi per il cliente e il prodotto e la posizione o il negozio.

Qualcuno ha un'idea di una soluzione che si possa facilmente applicare a questo problema?

Anch'io accetterei risposte generali su come imparare a risolvere tali domande di progettazione in generale (come un libro che ti guida attraverso la creazione di un approccio strutturato)

    
posta SpooXter 30.10.2017 - 01:46
fonte

2 risposte

2

L' Applicazione di UML e modelli di Craig Larman affronta il problema con un servizio di tassazione esterno (i servizi reali esistono se li si fa Google) e un adattatore di oggetti Gang-Of-Four che converte i risultati nel formato previsto dal sistema.

Penso che Strategia potrebbe andare bene, ma è ambizioso pensare che sarai in grado di mantenere il codice per tutti gli algoritmi fiscali esistenti. Ad ogni elezione c'è la possibilità che il tuo codice debba cambiare e magari debba anche essere convalidato con le autorità governative locali (?).

Come hai notato, le tasse sono complesse. Potresti avere più linee in una vendita (in Quebec c'è TVQ e TPS, e una volta sei stato tassato sulla tassa!). In alcuni stati degli Stati Uniti non ci sono tasse sull'abbigliamento, sul cibo, ecc. Per astrarre questi aspetti, il disegno concettuale di Larman usato (vedi Sezione 26.3) a TaxLineItem nel modello di dominio. Il servizio esterno si occupa di crearli (la logica è nel servizio esterno).

Ecco un diagramma UML approssimativo di questa idea:

Perl'adattatore,eccocomeapparein26.1:

L'usodiunadattatore:

    
risposta data 31.10.2017 - 21:29
fonte
3

Una soluzione è fare in modo che le varie tasse siano oggetti che si aggiungono a ciascun prodotto e che vengono utilizzati nel calcolo del suo prezzo. Ad esempio, potresti avere una classe base astratta o un'interfaccia simile a questa:

class ITax {
    calculateTaxForPrice(Price amount);
};

e quindi sottoclassi specifiche implementerebbero il calcolo per diversi tipi di tasse, come questa:

class VATTax : public ITax {
    calculateTaxForPrice(Price amount);
};

class StateSalesTax : public ITax {
    calculateTaxForPrice(Price amount);
};

Quindi il tuo prodotto avrebbe un elenco di tasse che devono essere aggiunte ad esso:

class Product {
    public:
        addTax(ITax someTax);
        Price getPrice();
        Price getPriceWithTaxes();

    private:
        array<ITax> taxes;
};

In getPriceWithTaxes() prendi il prezzo e aggiungi la tassa per ogni elemento della serie di tasse.

Questo scenario ti consente di esentare prodotti specifici da tasse specifiche, ad esempio. Puoi avere solo quelli di cui ogni prodotto ha bisogno.

    
risposta data 30.10.2017 - 02:00
fonte

Leggi altre domande sui tag