Come modellare luoghi, termini accademici e diverse coorti in OO

8

Sto lavorando su un'app per le università. Il caso è questo:

Ogni università ha diversi programmi accademici. Ogni programma ha molte materie (moduli). Ogni soggetto può essere offerto in luoghi diversi. L'anno accademico è diviso in termini e ogni termine dura per un numero di settimane. Non tutti i moduli sono offerti nelle stesse località ogni termine e i programmi possono essere offerti a diversi gruppi di studenti con date di inizio diverse all'interno dello stesso anno accademico.

Ad esempio, l'Università A ha un programma MBA offerto a New York e Londra. L'MBA ha 2 moduli per termine (10 settimane) offerti in entrambe le sedi (Say MBA-NY e MBA-L). È possibile e in base alla domanda, avere una terza esecuzione del programma (e quindi dei moduli in questo termine) che inizia una settimana dopo l'assunzione normale. Quindi, c'è un altro gruppo MBA-NY ma con una tempistica diversa. Ma, questo gruppo è anche parte dello stesso termine nel curriculum MBA (cioè, i due gruppi stanno facendo Term 2 di MBA).

La mia domanda è come modellare le posizioni, i termini accademici e le esecuzioni nella progettazione OO. La posizione, i termini accademici (e forse "corre") proprietà dell'oggetto universitario o dell'oggetto del programma? o dell'oggetto modulo?

Aggiornamento: In base alle tue risposte, la mia difficoltà è quella di modellare i termini accademici, le coorti e le diverse linee temporali. Non è proprio il luogo in cui sembra diretto a me. L'ho appena incluso nella descrizione per mostrarti le connessioni.

    
posta John Kouraklis 20.12.2016 - 10:06
fonte

3 risposte

5

Non dovresti iniziare a pensare negli oggetti. Supponendo che tu voglia costruire una vera applicazione funzionante (e questo non è un esercizio di modellazione BS), inizieresti a chiarire i requisiti, cioè quali compiti dovrebbe essere l'applicazione in grado di eseguire, e progettando il modello di dati necessario per supportarlo. Il design dell'oggetto è più di basso livello e segue la linea dopo questo design di alto livello.

La domanda su posizioni, curriculum, tempistiche, ecc. fa parte della domanda di progettazione del modello di dati per l'applicazione. Quindi non dovresti davvero pensare in termini di oggetti o proprietà ancora. Probabilmente dovresti progettarlo sotto forma di un diagramma di entità-relazione o di un disegno concettuale concettualizzato simile.

Quindi quando si dispone del modello dati e si conoscono le attività e le operazioni che l'applicazione deve eseguire, è possibile iniziare a determinare quali oggetti sono necessari. Ma tu non ci sei ancora.

    
risposta data 20.12.2016 - 17:48
fonte
2

Sembra che tu stia provando a progettare oggetti orientati agli oggetti ma con relazioni simili a un database relazionale. Questa non è generalmente una buona idea - è un'idea comune , è ricca di libri di programmazione ed è probabilmente una cattiva idea. Vedi uno dei tanti esempi documentati di ORIM, Object-Relational Impedance Mismatch, su Internet.

Gli oggetti sono classi di comportamenti. Quali comportamenti ha la tua applicazione?

Ad esempio: si tratta di un sito Web in cui si naviga da un elenco di programmi a un programma e un elenco di percorsi e moduli? Senza considerare eventuali problemi di analisi e di dipendenza da dipendenza, ciò porterebbe a qualcosa di simile:

public class Programme
{
  public static List<Programme> All() { ... }
  public static Programme GetById(int id) { ... }
  public List<Location> GetLocations() 
  { 
     return Location.GetByProgrammeId(Id);
  }
  public int Id { get; set; }
}

public class Location
{
   public static List<Location> All() { ... }
   public static List<Location> GetByProgrammeId(int id) { ... }
}

e così via. I contenuti delle classi sono modellati su come la roba appare nell'interfaccia, non come è memorizzata nel DB. Potrebbe coincidere, ma non è garantito.

Si noti che i metodi sono costruiti assumendo un'applicazione web, dove ogni nuova richiesta si desidera eseguire il meno possibile SQL, quindi ad esempio è più probabile che sia necessario un "get location by program id "metodo che a" trova percorsi per Programma "poiché non vuoi essere costretto a creare un'intera istanza di un Programma per ottenere un elenco di Località.

Allo stesso modo, dovresti avere altri metodi necessari per manipolare questi oggetti.

Naturalmente, se stai creando un'applicazione desktop, le cose sono diverse. Ad esempio, potresti essere in grado di mantenere attiva un'istanza del programma attraverso le interazioni dell'utente, e ciò ovviamente comporta una diversa struttura delle chiamate al metodo.

    
risposta data 20.12.2016 - 16:57
fonte
0

Location è un oggetto business diretto (anche se non necessario, banale. Puoi descriverlo con la posizione geografica (purché si tratti di una posizione sulla terra) e un nome, l'altezza relativa al livello del mare (quale? ), ecc.

Term ha una relazione con Programme in un modo in cui descrive la sua durata e posizione e ha diversi vincoli (quanto a quanto puoi avere). Quindi è anche un oggetto aziendale.

Non sei sicuro di cosa "run" significhi in questo contesto.

    
risposta data 20.12.2016 - 13:42
fonte

Leggi altre domande sui tag