2013-06-09 13 views
6

To jest praca domowa !!! Proszę nie interpretować tego jako prośba o kogoś, kto będzie dla mnie kodował.C#: Zły projekt klasy (pierwszy OOP)

moim programie: http://pastebin.com/SZP2dS8D

To mój pierwszy OOP. Program działa dobrze bez wprowadzania danych użytkownika (UI), ale jego implementacja powoduje, że mój projekt jest częściowo nieskuteczny. Nie używam kolekcji list z powodu ograniczeń przydziału. Moim głównym celem jest, aby wszystko działało z klasy Transcript. Oto kilka kwestii używam do:

  • pozwalając użytkownikowi dodać nowy kurs bez konieczności tworzenia nowej instancji Transcript
    każdorazowo
  • Kojarzenie kursach dodane do konkretnego Dzielnicy

Oto niektóre pseudo kod, aby pokazać, co próbuję osiągnąć. Eksperymentowałem z nią, ale muszę jeszcze odnieść sukces.

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)); 

moje pytanie [S]: powinienem zachować klasę odpisu, lub odrzucić go? Z obecną funkcjonalnością tworzenia nowego kursu, czy można go zachować w ten sposób podczas korzystania z interfejsu użytkownika, czy też muszę wrócić do tablicy kredy i zmienić konfigurację?

Mam nadzieję, że jest to spójne i niezbyt szerokie. Jeśli potrzebujesz wyjaśnienia, zapytaj, a ja z przyjemnością przedstawię więcej szczegółów.

+0

Czy istnieje powód masz tablicę 'Student's w twojej klasie 'Transcript'? Zakładałem, że "Transcript" to "Student", więc potrzebujesz go tylko. – Gjeltema

+0

Na marginesie, robisz wszystkie stylizacje w stylu Java. Na przykład nazywaj wiele właściwości 'setXXX' lub' getXXX', gdy w C# powinno to być po prostu 'XXX'. Również w języku C# nazwy funkcji pierwszy znak jest pisany dużymi literami. – Gjeltema

+0

@ Gjeltema Projekt, który miałam na myśli, polegał na użyciu Transcript zamiast Listy. Masz rację, intencja, którą mam dla Transcript, przypada na studenta. Próbowałem stworzyć pustą listę dla studentów. Spróbuję pozbyć się tablicy Studentów, co ma sens. – Leif

Odpowiedz

6

bym Rozważmy następujący compositon

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

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

Trzeba tylko jedną instancję klasy transkryptu. Umożliwi to modelowanie n kwartałów (wielu lat) przy n kursach na kwartał.

W swojej pętli wejściowej można dodać nowe kursy/czwarte w odpowiedzi na dane wejściowe użytkownika

+0

Doceniam to. Zaimplementuję to i dam ci znać, jeśli będę miał dalsze pytania. Jeśli nie, wybiorę to pytanie jako odpowiedź! – Leif

+0

To bardzo pomogło, dziękuję bardzo. – Leif

3

Istnieje wiele sposobów, aby Model ten problem i myślę, że masz rację mieć klasę dialogowej, ale zamiast myśląc, że jedna czwarta ma zestaw kursów, sugerowałbym, że który kwartał kursu jest oferowany, jest właściwością kursu. Na przykład:

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, nigdy nie myślałem o tym w ten sposób. Wydaje się, że łatwiejsze jest powiązanie kwadratu z kursem, niż z tym, co mam. Dzięki! – Leif

2

można spróbować to

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()); 
     } 
    } 

można dodać dodatkową logikę o gatunkach i innych rzeczy .... najlepsze życzenia

+0

Pierwotnie zamierzałem użyć enum na kwartały. Również, aby pomóc mi obliczyć gpa i skumulowany gpa, ale podrapał pomysł. To daje mu nową perspektywę. Dzięki – Leif