Come rappresentare il seguente scenario in un diagramma di classe?

2

Considera un negozio con più filiali e un sistema genera report per ogni filiale con cadenza mensile e annuale e un rapporto complessivo, mensilmente e annualmente. Quindi in totale ci sono 4 tipi di rapporti

  1. Rapporto mensile sulle filiali
  2. Rapporto globale mensile
  3. Rapporto annuale sulle filiali
  4. Rapporto globale annuale

Come sono raffigurati in un diagramma di classe? L'ho provato come segue, che è corretto?

    
posta S.Dan 07.04.2016 - 07:21
fonte

3 risposte

5

Mi dispiace, ma devo informarti che non c'è "corretto" o "sbagliato" nei progetti di classe. Puoi fare UML "errato" disegnando strani unicorni nel diagramma, ma se il tuo progetto è abbastanza buono dipende da una grande quantità di fattori diversi. Non è così facile come semplicemente dirci un requisito e aspettarci di essere in grado di ricavarne un progetto.

I due progetti che hai sono possibili candidati. Un altro ovvio è simile al tuo secondo, in quanto crei classi base per annuale e mensile (invece che generale e derivato).

Tuttavia, poiché i rapporti sembrano avere due dimensioni univoche (generali / di ramo e mensili / annuali), una progettazione ad albero potrebbe non essere adatta. Ad esempio, le tue Monthly_branch e le tue Monthly_general classi sono in qualche modo correlate, ma il design non è in grado di esprimerle meglio di dire che sono Report s. Tuttavia, potrebbe trattarsi o meno di un problema nel tuo caso d'uso specifico.

In generale, fare buoni progetti (mentre "buono" è definito dalle implicazioni del progetto lungo la strada dello sviluppo del progetto) richiede molta esperienza. Come punto di partenza, prova a presentare almeno una mezza dozzina di varianti di design per il tuo problema. Esistono innumerevoli modi per progettare un modello di classe e trovare quello migliore per il lavoro richiederà sempre che tu sia in grado di avere un vasto gruppo di candidati tra cui scegliere.

    
risposta data 07.04.2016 - 07:40
fonte
2

Sono entrambi corretti , devi solo fare una scelta e sperare di aver scelto quello migliore. L'unica cosa che può aumentare le tue possibilità di scegliere quella migliore è quella di provare quel tipo di problema che stai cercando di risolvere. Per esempio ci sono alcune scelte che sono migliori nel breve periodo ma quando si tratta di mantenere e aggiornare non sono così buone, viceversa alcune scelte sono più dolorose a breve termine ma in futuro si rivelano molto intelligenti . Ancora una volta non c'è modo di dire se è meglio fare una scelta "a breve termine" o "a lungo termine" poiché dipende dal tuo progetto, dai tuoi requisiti, dalla tua relazione con il cliente, dal tuo budget e così via ... Questi sono problemi legati alla decisione progettuale , c'è molta letteratura a riguardo e ti suggerisco di iniziare con wikipedia . L'unica cosa che devi tenere a mente è che sei responsabile di quella decisione in ogni possibile scenario che potrebbe essere un successo o un disastro.

    
risposta data 07.04.2016 - 09:52
fonte
2

Come sottolineato dalle altre domande, non c'è "corretto" o "errato" quando si sceglie tra quelle (e altre opzioni valide).

Sembra che tu abbia identificato che ci sono 2 coppie di differenze tra i rapporti, la posizione (succursale / totale) e il tempo (mensile / annuale). Puoi chiedere a te stesso "Mi verrà chiesto probabilmente rapporti trimestrali / settimanali? Mi verrebbero probabilmente richiesti rapporti raggruppati per regioni (Città / Stato / ecc.)?". Nel rispondere a queste domande potresti vedere che una strategia sarebbe più facile da estendere / mantenere rispetto all'altra.

Come menzionato da @Frank, sembra che entrambe siano probabili estensioni, quindi un design come il seguente potrebbe essere preferibile:

class Report {
    timeGroup TimeGrouping,
    placeGroup LocationGrouping
    ...
}

class MonthlyGrouping : TimeGrouping {...} // dates in the same month together
class AnnualGrouping : TimeGrouping {...} // dates in the same year together

class BranchGrouping : LocationGrouping {...} // groups of size 1
class OverallGrouping : LocationGrouping {...} // one group of everything
    
risposta data 07.04.2016 - 12:15
fonte

Leggi altre domande sui tag