C#:类的糟糕设计(第一个OOP)

C#:类的糟糕设计(第一个OOP),c#,database,oop,console-application,C#,Database,Oop,Console Application,这是作业!!!请不要将此理解为我请求他人为我编写代码 我的节目: 这是我的第一个OOP。该程序在没有用户输入(UI)的情况下运行良好,但它的实现使我的设计部分无效。由于分配限制,我没有使用列表集合。我的主要目标是让一切都从成绩单课开始。以下是我遇到的一些问题: 允许用户添加新课程,而无需创建新的成绩单实例 每次 将添加的课程关联到特定季度 下面是一些伪代码来说明我试图实现的目标。我一直在尝试,但尚未成功 Please enter the quarter: (user input) Would

这是作业!!!请不要将此理解为我请求他人为我编写代码

我的节目:

这是我的第一个OOP。该程序在没有用户输入(UI)的情况下运行良好,但它的实现使我的设计部分无效。由于分配限制,我没有使用列表集合。我的主要目标是让一切都从成绩单课开始。以下是我遇到的一些问题:

  • 允许用户添加新课程,而无需创建新的成绩单实例
    每次
  • 将添加的课程关联到特定季度
下面是一些伪代码来说明我试图实现的目标。我一直在尝试,但尚未成功

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));
我的问题:我应该保留成绩单类,还是放弃它?使用当前创建新课程的功能,在使用UI时是否可以保持这种方式,或者我是否需要返回黑板并重新配置


希望这是连贯的,而不是太宽泛。如果需要澄清,请询问,我会很乐意提供更多的细节。

< P>我会考虑以下作文

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

public class Quarter
{
  public Course[] Courses{get;set;}
}
您只需要transcript类的一个实例。 这将使您能够模拟n个季度(多年),每个季度有n门课程


在您的输入循环中,您可以根据用户输入添加新的课程/季度

有很多方法来模拟这个问题,我认为您有一个成绩单类是正确的,但我不认为一个季度有一套课程,而是建议提供哪个季度的课程是课程的属性。例如:

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
}
公开课成绩单
{
私人列表课程\=新列表();
公共IEnumerable课程{获取{返回课程}
公共IEnumerable GetCourseFor(国际年、国际季度)
{
返回课程\其中(课程=>课程.年度==年度和课程.季度==季度);
}
公共课程(课程)
{
课程添加(课程);
}
}
公共课
{
公共整年{get;私有集;}
公共整数四分之一{get;私有集;}
//……其他成员
}
您可以试试这个

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());
        }
    }
公共枚举宿舍
{
第一,
第二
第三
第四
}
班级课程
{
私人宿舍本季度{get;private set;}
私有列表学校计划=新列表();
公共整年{get;私有集;}
公共字符串名称{get;private set;}
私人课程()
{
//从数据库或xml加载列表
//每个元组有一个四分之一和一个列表
//有关课程
//SchoolProgram.Add(新元组(quarts.First,new List(){新课程(2010,“数学”,quarts.First),
//新课程(2010年“英语”,季度第一),
//新课程(2010年,“物理”,第1季度);
}
公共课程(国际学年、字符串名称、季度q)
{
今年=年;
this.name=名称;
这个季度=q;
}
公共课程
{
return SchoolProgram.Find(q=>q.Item1==ThisQuarter.Item2.Single(c=>(c.year==this.year&&c.name==this.name));
}
}
公开课成绩单
{
私有列表学校计划=新列表();
公开谈话全文(
{
//也许是传统的逻辑
}
公共void AddCourse(整数年,字符串名称,季度q)
{
课程c=新课程(年份、名称、q);
SchoolProgram.Add(c.GetCourse());
}
}

你可以添加关于分数和其他东西的附加逻辑……祝你好运

在你的
成绩单
课程中有一系列
学生
是有原因的吗?我假设在这个设计中,
成绩单
是每个
学生
,所以你只需要一份。顺便说一句,你在做所有的样式设计Java风格。例如,您正在命名许多属性
setXXX
getXXX
,而在C#中,它应该是
XXX
。此外,在C#中,函数名的第一个字符是大写的。@Gjeltema我想到的设计是使用Transcript来代替列表。您是对的,我对Transcript的意图是per st学生。我试图为学生创建一个空列表。我将尝试删除学生数组,这完全有道理。@Gjeltema我的第一节编程课(上一节)was Java:)。我很感谢你的建议。有很多方法可以解决这个问题。我认为目前为止给出的两个答案都是很好的方法,而且都会很好地发挥作用。在某些方面,知道在需要时如何检索数据将有助于推动设计,但对于家庭作业来说,这通常不那么容易。我可能会保留
螺柱ent
class-around-OOP是关于具有单一职责、短函数等的小型类。但是,如果您将其两个字段引入到Transcript类中,它将不会是世界末日(特别是对于家庭作业)。我很感激。如果我还有任何问题,我会实施这个,并让你知道。如果没有,我会选择这个问题作为答案!哈哈,我从来没有这样想过。似乎更容易将季度与课程相关联,而不是以我的方式。谢谢!我本来打算对季度使用enum。也是为了帮助我计算gpa&累积平均绩点,但却忽略了这个想法。这给了它新的视角。谢谢