2013-06-09 15 views
6

Questo è compito a casa !!! Per favore, non interpretare questo come se stessi chiedendo a qualcuno di codificarmi.C#: Bad design of class (first OOP)

mio programma: http://pastebin.com/SZP2dS8D

Questo è il mio primo OOP. Il programma funziona perfettamente senza l'input dell'utente (UI), ma l'implementazione di esso rende parzialmente inefficace il mio disegno. Non sto utilizzando una raccolta di elenchi a causa di restrizioni di assegnazione. Il mio obiettivo principale è avere tutto in esecuzione dalla classe Transcript. Qui ci sono alcune questioni che sono in esecuzione in:

  • permettendo all'utente di aggiungere nuovo corso senza dover creare una nuova istanza di trascrizione
    ogni volta
  • Associare i corsi aggiunti a una specifica Quarter

Ecco alcuni pseudo-codice per mostrare quello che sto cercando di realizzare. Ho sperimentato, ma devo ancora riuscire.

Please enter the quarter: (user input) 
Would you like to add a course? 

while (true) 

Enter Course/Credits/Grade 

//new Course information populated with user input 
transcript.AddCourse.to specific Quarter((Fall 2013) new Course("Math 238", 5, 3.9)); 
transcript.AddCourse.to specific Quarter((Fall 2013) new Course("Phys 223", 5, 3.8)); 
transcript.AddCourse.to specific Quarter((Fall 2013) new Course("Chem 162", 5, 3.8)); 

MIA DOMANDA [S]: Devo mantenere la classe di trascrizione, o rifiutarlo? Con l'attuale funzionalità di creare un nuovo corso, è possibile mantenerlo in questo modo mentre usi l'interfaccia utente o devo tornare alla lavagna e riconfigurare?

Speriamo che questo sia coerente e non troppo ampio. Se è necessario un chiarimento, chiedi e sarò lieto di fornire ulteriori dettagli.

+0

C'è una ragione si dispone di una serie di 'Student's nella tua classe' Transcript'? Ho presunto con questo progetto che un 'Transcript' era per' Student', quindi ne avresti solo bisogno. – Gjeltema

+0

In una nota a margine, stai facendo tutto il tuo stile in stile Java. Ad esempio, stai nominando molte proprietà 'setXXX' o' getXXX', quando in C# dovrebbe essere solo 'XXX'. Inoltre, in C#, il primo carattere dei nomi funzione è maiuscolo. – Gjeltema

+0

@Gjeltema Il design che avevo in mente era di usare Transcript al posto di una lista. Hai ragione, l'intenzione che ho per Transcript è per studente. Stavo tentando di creare una lista vuota per gli studenti. Proverò a sbarazzarmi della matrice Student, che ha perfettamente senso. – Leif

risposta

6

vorrei prendere in considerazione quanto segue compositon

public class Transcript 
{ 
    public Quarter[] Quarters{get;set;} 
} 

public class Quarter 
{ 
    public Course[] Courses{get;set;} 
} 

Hai solo bisogno di un'istanza della classe trascrizione. Ciò consentirà di modellare n trimestri (più anni) con n corsi per trimestre.

Nel suo ciclo di ingresso è possibile aggiungere nuovi corsi/quarti in risposta agli input dell'utente

+0

Lo apprezzo. Lo implementerò e ti faccio sapere se ho altre domande. In caso contrario, selezionerò questa domanda come risposta! – Leif

+0

Questo ha aiutato molto, grazie mille. – Leif

3

Ci sono un sacco di modi per modellare questo problema e credo che tu abbia ragione ad avere una classe trascrizione, ma invece di pensando che un quarto abbia una serie di corsi, suggerirei in quale trimestre un corso è offerto come proprietà del corso. Per esempio:

public class Transcript 
{ 
    private List<Course> courses_ = new List<Course>(); 

    public IEnumerable<Course> Courses {get { return courses_; } 

    public IEnumerable<Course> GetCoursesFor(int year, int quarter) 
    { 
     return courses_.Where(course => course.Year == year && course.Quarter == quarter); 
    } 

    public void AddCourse(Course course) 
    { 
     courses_.Add(course); 
    } 
} 


public class Course 
{ 
    public int Year {get; private set;} 
    public int Quarter {get; private set;} 
    // ... other members 
} 
+0

Lol, non ci ho mai pensato in questo modo. Sembra molto più facile associare il trimestre al corso invece del modo in cui lo ho. Grazie! – Leif

2

si può provare questo

public enum Quarters 
    { 
     First, 
     Second, 
     Third, 
     Fourth 
    } 
    class Courses 
    { 
     private Quarters ThisQuarter { get; private set; } 
     private List<Tuple<Quarters, List<Courses>>> SchoolProgram = new List<Tuple<Quarters, List<Courses>>>(); 

     public int year { get; private set; } 
     public string name { get; private set; } 

     private Courses() 
     { 
      //load list from database or xml 
      //each tuple has one quarters and a list 
      // of associated courses 
      //SchoolProgram.Add(new Tuple<Quarters, List<Courses>>(Quarters.First, new List<Courses>(){new Courses(2010,"Math",Quarters.First), 
      //                      new Courses(2010,"English",Quarters.First), 
      //                      new Courses(2010,"Physics",Quarters.First)})); 
     } 

     public Courses(int year,string name,Quarters q) 
     { 
      this.year = year; 
      this.name = name; 
      ThisQuarter = q; 

     } 

     public Courses GetCourse() 
     { 
      return SchoolProgram.Find(q => q.Item1 == ThisQuarter).Item2.Single(c => (c.year == this.year && c.name == this.name)); 
     } 
    } 

    public class Transcript 
    { 
     private List<Courses> SchoolProgram = new List<Courses>(); 

     public Transcript() 
     { 
      //maybe aditional logic here 
     } 

     public void AddCourse(int year,string name,Quarters q) 
     { 
      Courses c = new Courses(year, name, q); 
      SchoolProgram.Add(c.GetCourse()); 
     } 
    } 

è possibile aggiungere logica addizionale sui gradi e altre cose .... auguri

+0

Originariamente usavo l'enum per i quarti. Anche per aiutarmi a calcolare gpa e cumulativo gpa, ma graffiato l'idea. Questo dà una nuova prospettiva ad esso. Grazie – Leif