Domanda

Ho un due tipi di prodotti -. Scontato (10%) e Disc NonDiscounted (0%) Ognuno di questi può essere sia LocalProduct / ExportableProduct con l'esportazione una attirando un'imposta sulle vendite del 15%

Qual è il modo migliore per modellare questo scenario. Me essendo principiante assoluto al design S / W, ho le idee molto limitati 1. Per avere 4 diversi sottotipi del prodotto 2. modello Usa la strategia e hanno 4 diverse strategie.

qualcuno può per favore suggerire come posso modellare in modo efficace utilizzando le opzioni di cui sopra o altri.

È stato utile?

Soluzione

Le classi distinguono gruppi di comportamento. Quindi, diamo uno sguardo alla vostra divisioni in questi termini:

  • Mentre un argomento potrebbe essere fatto che scontati / non scontati è una variazione nel comportamento, è banale per ridurre questo ad un unico comportamento: Tutti i prodotti hanno uno sconto, ma l'ammontare dello sconto sembra essere 0 % sui prodotti non scontati. Questo è solo un attributo dei vostri prodotti (DISCOUNT_AMOUNT), non una classe separata.

  • locale / maggio esportabile o non può avere comportamenti diversi. Se l'unica differenza è se il prodotto è permesso di essere spediti a livello internazionale o no, allora un semplice flag booleano dovrebbe gestire questa distinzione più che adeguatamente. Se, d'altra parte, i prodotti esportabili richiedono comportamenti non supportati da prodotti locali (ad esempio, la registrazione dei requisiti e delle procedure doganali), allora sarebbe opportuno dare sia ExportableProduct una sottoclasse di LocalProduct (se i comportamenti di prodotti esportabili sono un superset di locali i comportamenti del prodotto) o fare una classe di prodotto astratto con LocalProduct e ExportableProduct sottoclassi (se i prodotti locali hanno anche comportamenti che non sono supportati da prodotti esportabili).

Altri suggerimenti

Per mantiene le cose semplici, chiedetevi se sconto davvero bisogno di essere un sottotipo, o se potrebbe essere una proprietà del prodotto, dove "NonDiscounted" hanno uno sconto di zero per cento.

Vorrei fare questo:

Avere una classe denominata "Prodotto" che ha le proprietà di base di un prodotto come il nome, la descrizione, tipo, ecc.

La base di classe "prodotto" può avere una proprietà chiamata "DiscountRate". Può essere 0 per il valore non scontato e tutto ciò per scontato. Ciò contribuirà a semplificare il calcolo in quanto sarà sempre applicata la stessa formula, solo in un caso lo sconto è 0.

Quindi è possibile avere due classi "ExportableProduct" e "LocalProduct", entrambi ereditare dalla classe "Prodotto".

Vorrei suggerire che forse scontato / NonDiscounted non dovrebbe essere tipi di prodotti a tutti. Invece hanno due sottotipi, e un 'sconto' immobile / campo nel prodotto principale. Ogni prodotto può quindi avere efficacemente qualsiasi sconto. Ciò consente anche di sconto che non sono fissato al 10%.

Eviterei eredità (cioè sub battitura) solo per questo.

Invece mi piacerebbe definire le enumerazioni per scontato / NonDiscounted e locale / ExportableProduct. Ogni classe prodotto avrebbe poi semplicemente avere una proprietà per ognuno di essi indica il suo tipo.

Poi in una classe separata, ad esempio: PricingCalculator, definire un metodo Calcolare (possibilmente statico) che accetta un'istanza di un prodotto. Questo metodo esamina semplicemente le proprietà di enumerazione e applica i valori percentuali richiesti nel calcolo.

Questo separa completamente il calcolo dei prezzi dai prodotti stessi e consente di mantenere i calcoli dei prezzi a volte complessi in un unico luogo. Man mano che i sistemi di tariffazione cambiano nel corso del tempo, questo approccio è facilmente mantenibile e verificabile.

Vorrei evitare tutto e solo due proprietà: discount e local

Dato che c'è solo una cosa che cambia (prezzo), è possibile calcolare al volo (sconto => price * .9, export => price * .85 - o addirittura entrambi => export & sconti => price * .9 * .85)

L'ereditarietà è particolarmente utile quando si che cosa varia a seconda del tipo.

Per esempio, se lo sconto, e la tassa, e il metodo di spedizione tutto varia a seconda del tipo di elemento, allora è giunto il momento di prendere in considerazione l'ereditarietà e subclassing (dove si sarebbe dire "questo sottotipo di elemento ha questa tassa e questo sconto e questo la spedizione ").

D'altra parte, quando una sola cosa varia a seconda del tipo, allora è meno evidente se vale la pena avere diversi tipi (cioè un tipo di base con sottoclassi), o invece se tale varianza può essere modellato più semplicemente come un singolo tipo , le cui istanze hanno un valore di proprietà (ad esempio, chiamato "DISCOUNT_PERCENTAGE").

Quando questo è tutti il comportamento che si sta per necessità, basta avere due booleani nel vostro prodotto e il passaggio su di essi è la soluzione migliore. YAGNI.

Ma ho paura che è solo una piccola parte di un problema più grande. E poi si deve chiedere a te stesso: ciò che rende un prodotto di un prodotto (singolo responsabilità). Imponibilità e discountability sono probabilmente due preoccupazioni diverse, quindi il prodotto finisce con due strategie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top