【问题标题】:Design of a scholar system学者系统的设计
【发布时间】:2014-03-15 21:42:15
【问题描述】:

我正在创建一个基于网络的学者系统,供学生查看他们的分数、查看他们的日程安排等。但是,我在构建这个系统时遇到了问题,因为我找不到合适的方法关联数据。

有一个学生,在(学校)班级。学生有一个记分牌。 (学校)班级有一个学生每个科目的“作业”列表,但它只有姓名、最高分、体重等信息。实际分数位于学生的记分板上。

  • 许多学生在同一个班级。
  • 任何时候都应该只存在一个作业实例,并且它应该存在于 SchoolClass 对象中,因为它随后会应用于整个班级而不是每个学生。
  • 那么,学生应该只保留自己的分数,并从外部参考其余的作业数据。

我如何参考学生的具体作业?

这有点令人困惑。这是我目前拥有的:

class Student extends Person {
    private SchoolClass schoolClass;
    private Scorecard scorecard;
}

class Subject {
    private String name; /// "Compilers II", "Data Structures", etc.
}

class SchoolClass {
    private Course course; // "Computer Science", "Administration", etc.
    private List<Assignment> assignments;

    class Assignment {
        private Subject subject;
        private int maxScore;
        private int weight;
        private String name; // "Test about material resistance II"
    }
}

class Scorecard {
    // How to reference each assignment from each subject in this student's class cleanly?
}

我的设计是否朝着好的方向发展,还是应该删除它并重新开始?谢谢!

【问题讨论】:

    标签: java class oop web-applications architecture


    【解决方案1】:

    这看起来不错,但我想指出一些事情。

    • Person 类是抽象的吗?如果是这样,那就干得好!如果不是,它可能应该是因为 person 是一个 通用 术语。有关何时将类抽象化的更多信息,请查看我对 this 问题的回答。
    • 使用Assignment 作为嵌套类做得很好!它直接与SchoolClass 相关,所以它应该是嵌套的,但是Subject 类呢?这似乎也与SchoolClass 直接相关,因此将Subject 也设为嵌套类也不错。

    至于参考单个家庭作业,这取决于您希望如何完成它。如果您想通过索引获取它,请使用 getter。为此,您只需将此代码放入SchoolClass

    public Assignment getAssignment(int index)
    {
         return assignments.get(index);
    }
    

    但是,如果您想通过名称来引用它,它会有点棘手,但仍然非常严格。您可以像这样向您的 Assignment 类添加一个吸气剂:

    public String getName()
    {
        return name;
    }
    

    那么您只需为SchoolClass 编写另一个getter,如下所示:

    public Assignment getAssignmentByName(String name)
    {
        for (Assignment assignment : assignments)
        {
            if (assignment.getName().equals(name))
                return assignment;
        }
    
        System.out.println("No assignment found by the name of " + name);
        return null;
    }
    

    希望对您有所帮助!如果您有任何问题,请不要犹豫!

    编辑:

    为了让您的分配对象描述自己,它们应该覆盖Object.toString()。下面的代码应该放在你的作业类中。

    // I noticed that you only have a maxScore variable, I think that a score variable is needed
    private int score;
    
    @Override
    public String toString()
    {
        return "The score for this assignment is: " + score;
    }
    

    【讨论】:

    • 是的,Person 是抽象的。但我问的更多,比如,每个学生的记分卡应该如何参考他班级的每项作业的分数?它不仅仅是按名称查找作业,它还必须包含一些告诉学生“这是作业的分数 ***:x”之类的内容。它应该包含其键是分配的哈希图吗?你有什么建议?
    • ReportCard 课程怎么样?这可能有一个 ArrayList 的 SchoolClass 对象(每个科目一个),而这些对象又已经有一个作业列表。我更新了答案以包括覆盖 toString() 方法,以便分配对象可以描述自己。
    • 我认为你没有完全理解我的要求,但你还是帮助了我。我实际上的意思是如何从 Student 类中引用作业。实际的Assignment 班级没有关于实际学生分数的任何信息,因为整个班级只有一个Assignment 实例。所以我最终会在 Student 类上使用 HashMap
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多