2013-06-09 42 views
6

Đây là bài tập về nhà !!! Vui lòng không diễn giải điều này khi tôi yêu cầu ai đó viết mã cho tôi.C#: Thiết kế kém của lớp (OOP đầu tiên)

Chương trình của tôi: http://pastebin.com/SZP2dS8D

Đây là OOP đầu tiên của tôi. Chương trình hoạt động tốt mà không cần đầu vào người dùng (UI), nhưng việc thực hiện nó làm cho thiết kế của tôi một phần không hiệu quả. Tôi không sử dụng bộ sưu tập Danh sách vì các hạn chế chuyển nhượng. Mục tiêu chính của tôi là có mọi thứ chạy từ lớp Transcript. Dưới đây là một số vấn đề tôi đang chạy vào:

  • Cho phép người dùng thêm khóa học mới mà không cần phải tạo ra một thể hiện mới của Transcript
    mỗi lần
  • Liên kết các khóa học bổ sung vào một khu phố cụ thể

Dưới đây là một số mã giả để hiển thị những gì tôi đang cố gắng hoàn thành. Tôi đã thử nghiệm nó, nhưng vẫn chưa thành công.

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

TÔI HỎI [S]: Tôi có nên giữ lớp Transcript, hoặc loại bỏ nó? Với chức năng hiện tại của việc tạo ra một khóa học mới, có thể giữ nó theo cách này trong khi sử dụng giao diện người dùng hay tôi cần quay lại bảng phấn và cấu hình lại?

Hy vọng điều này là mạch lạc và không quá rộng. Nếu cần làm rõ, vui lòng hỏi và tôi sẽ vui lòng cung cấp thêm chi tiết.

+0

Có một lý do bạn có một loạt các 'Học sinh' trong lớp 'Bản sao' của bạn? Tôi cho rằng thiết kế này là một 'Bản sao' là cho mỗi' Học sinh ', vì vậy bạn chỉ cần một. – Gjeltema

+0

Trên một lưu ý phụ, bạn đang làm tất cả các kiểu dáng của bạn theo phong cách Java. Ví dụ, bạn đặt tên rất nhiều thuộc tính 'setXXX' hoặc' getXXX', khi trong C# nó chỉ là 'XXX'. Ngoài ra, trong C#, tên hàm đầu tiên là ký tự chữ hoa. – Gjeltema

+0

@Gjeltema Thiết kế mà tôi có trong đầu là sử dụng Bảng điểm thay cho Danh sách. Bạn là chính xác, ý định tôi có cho Bảng điểm là cho mỗi học sinh. Tôi đã cố gắng tạo một danh sách trống cho học sinh. Tôi sẽ cố gắng loại bỏ mảng Sinh viên, điều đó có ý nghĩa hoàn toàn. – Leif

Trả lời

6

tôi sẽ xem xét các compositon sau

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

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

Bạn chỉ cần một thể hiện của lớp học bạ. Điều này sẽ cho phép bạn lập mô hình n quý (nhiều năm) với các khóa học n mỗi quý.

Trong vòng đầu vào của bạn, bạn có thể thêm các khóa học mới/quý để đáp ứng với người dùng nhập vào

+0

Tôi đánh giá cao nó. Tôi sẽ thực hiện điều này và cho bạn biết nếu tôi có thêm bất kỳ câu hỏi nào. Nếu không, tôi sẽ chọn câu hỏi này là đã trả lời! – Leif

+0

Điều này đã giúp ích rất nhiều, cảm ơn bạn rất nhiều. – Leif

3

Có rất nhiều cách khác nhau để mô hình hóa vấn đề này và tôi nghĩ bạn nói đúng để có một lớp bảng điểm, nhưng thay vì nghĩ rằng một phần tư có một bộ các khóa học tôi sẽ đề nghị rằng quý một khóa học được cung cấp là một tài sản của khóa học. Ví dụ:

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, tôi không bao giờ nghĩ về nó theo cách đó. Có vẻ dễ dàng hơn khi liên kết quý với khóa học thay vì cách tôi có. Cảm ơn! – Leif

2

bạn có thể thử này

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

bạn có thể thêm logic bổ sung về các lớp và các công cụ khác .... tốt nhất mong muốn

+0

Tôi ban đầu sẽ sử dụng enum cho quý. Ngoài ra để giúp tôi tính toán gpa & gpa tích lũy, nhưng trầy xước ý tưởng. Điều này đưa ra viễn cảnh mới cho nó. Cảm ơn – Leif

Các vấn đề liên quan