2013-06-09 5 views
6

यह होमवर्क है !!! किसी के लिए कोड करने के लिए मुझसे पूछने के रूप में कृपया इसकी व्याख्या न करें।सी #: कक्षा का खराब डिजाइन (पहला ओओपी)

मेरे कार्यक्रम: http://pastebin.com/SZP2dS8D

यह मेरा पहला OOP है। कार्यक्रम उपयोगकर्ता इनपुट (यूआई) के बिना बस ठीक काम करता है, लेकिन इसका कार्यान्वयन मेरे डिजाइन को आंशिक रूप से अप्रभावी प्रदान करता है। मैं असाइनमेंट प्रतिबंधों के कारण सूची संग्रह का उपयोग नहीं कर रहा हूं। मेरा मुख्य लक्ष्य ट्रांसक्रिप्ट क्लास से चल रहा सब कुछ है।

  • हर बार
  • पाठ्यक्रम एक विशिष्ट क्वार्टर
को जोड़ा गया संबद्ध कर रहा है ट्रांसक्रिप्ट
का एक नया उदाहरण बनाए बिना नए पाठ्यक्रम को जोड़ने के लिए उपयोगकर्ता की अनुमति दे: यहाँ कुछ मुद्दों पर मैं में चल रहा हैं

यहां कुछ छद्म कोड है जो दिखाने के लिए कि मैं क्या करने की कोशिश कर रहा हूं। मैं इसके साथ प्रयोग कर रहा हूं, लेकिन अभी तक सफल नहीं हुआ है।

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

मेरे सवाल [एस]: मैं ट्रांसक्रिप्ट वर्ग रखना चाहिए, या उसे छोड़? एक नया कोर्स बनाने की वर्तमान कार्यक्षमता के साथ, क्या यूआई का उपयोग करते समय इसे इस तरह से रखना संभव है, या क्या मुझे चाक बोर्ड पर वापस जाने और पुन: कॉन्फ़िगर करने की आवश्यकता है?

उम्मीद है कि यह सुसंगत है और बहुत व्यापक नहीं है। यदि स्पष्टीकरण की आवश्यकता है तो कृपया पूछें और मैं अधिक जानकारी प्रदान करने के लिए खुश हूं।

+0

चाहती है वहाँ एक कारण है कि आप की एक सरणी है है 'छात्र आपकी' ट्रांसक्रिप्ट 'कक्षा में है? मैंने इस डिजाइन के साथ माना कि 'प्रतिलेख' प्रति छात्र 'था, इसलिए आपको केवल एक की आवश्यकता होगी। – Gjeltema

+0

एक तरफ ध्यान दें, आप जावा शैली में अपनी सभी स्टाइल कर रहे हैं। उदाहरण के लिए, आप कई गुण 'setXXX' या 'getXXX' नाम दे रहे हैं, जब सी # में यह केवल' XXX' होना चाहिए। इसके अलावा, सी # में, फ़ंक्शन नाम पहले वर्ण ऊपरी मामले हैं। – Gjeltema

+0

@Gjeltema मेरे मन में जो डिज़ाइन था, वह सूची के स्थान पर ट्रांसक्रिप्ट का उपयोग करना था। आप सही हैं, ट्रांसक्रिप्ट के लिए मेरे पास इरादा प्रति छात्र है। मैं छात्रों के लिए एक खाली सूची बनाने का प्रयास कर रहा था। मैं छात्र सरणी से छुटकारा पाने की कोशिश करूंगा, जो पूरी तरह से समझ में आता है। – Leif

उत्तर

6

मैं निम्नलिखित compositon पर विचार करेंगे

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

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

आप केवल प्रतिलिपि वर्ग का एक उदाहरण की जरूरत है। इससे आपको प्रति तिमाही एन पाठ्यक्रमों के साथ एन क्वार्टर (एकाधिक वर्ष) मॉडल करने में मदद मिलेगी।

अपने इनपुट पाश में आप उपयोगकर्ता इनपुट के जवाब में नए कोर्स/तिमाहियों में जोड़ सकते हैं

+0

मैं इसकी सराहना करता हूं। मैं इसे लागू करूंगा और आपको बताऊंगा कि मेरे पास कोई और प्रश्न है या नहीं। यदि नहीं, तो मैं उत्तर के रूप में इस प्रश्न का चयन करूंगा! – Leif

+0

इससे बहुत मदद मिली, बहुत बहुत धन्यवाद। – Leif

3

तरीके से इस समस्या को मॉडल करने के लिए की एक बहुत कुछ कर रहे हैं और मुझे लगता है कि आप एक प्रतिलिपि वर्ग के लिए सही हो, लेकिन इसके बजाय का यह सोचकर कि एक चौथाई में पाठ्यक्रमों का एक सेट है, मैं सुझाव दूंगा कि पाठ्यक्रम की एक तिमाही पाठ्यक्रम की एक संपत्ति है। उदाहरण के लिए:

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

लॉल, मैंने कभी इस तरह से सोचा नहीं। जिस तरह से मेरे पास है, उसके बजाय तिमाही को पाठ्यक्रम से जोड़ना बहुत आसान लगता है। धन्यवाद! – Leif

2

आप इस

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

आप ग्रेड और अन्य सामग्री के बारे में अतिरिक्त तर्क जोड़ सकते हैं की कोशिश कर सकते हैं .... सबसे अच्छा

+0

मैं मूल रूप से क्वार्टर के लिए enum का उपयोग करने जा रहा था। मुझे जीपीए और संचयी जीपीए की गणना करने में मदद करने के लिए, लेकिन विचार को खरोंच कर दिया। यह इसके लिए नया परिप्रेक्ष्य देता है। धन्यवाद – Leif

संबंधित मुद्दे