我正在创建一个基于Web的学者系统,供学生查询成绩,查看时间表等。但是,在构建此系统时遇到了问题,因为找不到适合的方法来关联数据。

有一个学生在(学校)班里。学生有一个计分板。 (学校)课程列出了每个科目的学生所拥有的“作业”列表,但仅包含名称,最高分,体重等信息。实际分数位于学生的记分板上。


许多学生在同一班上。
任何时候都只应存在一个作业实例,并且该实例应该存在于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?
}


我的设计是否朝着正确的方向发展?还是应该将其删除然后重新开始?谢谢!

最佳答案

这看起来不错,但是我想指出几点。


Person类是抽象的吗?如果是这样,那就做得好!如果不是,那可能是因为人是一个通用术语。有关何时进行类抽象的更多信息,请查看我对this问题的回答。
使用Assignment作为嵌套类做得很好!它直接与SchoolClass有关,因此应该嵌套,但是Subject类呢?这似乎也直接与SchoolClass连接,因此也使Subject成为嵌套类并不是一个坏主意。


至于引用单个作业,则取决于您希望如何完成它。如果要按索引获取它,请使用吸气剂。为此,您可以简单地将此代码放在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;
}

08-26 00:53