首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扎实的课程管理

扎实的课程管理
EN

Code Review用户
提问于 2018-05-18 06:29:14
回答 1查看 156关注 0票数 7

试图创建一个简单的课程管理应用程序使用坚实的原则和最佳实践的面向对象编程。寻找关于我在下面的github项目的src/main/lib中创建的库的反馈。示例用法显示在src/main/app中,如果您有兴趣的话,但是我不太关心这个部分的反馈。

应用程序的一些要求:

  • 开设新课程
  • 创造新学生
  • 创建新房间
  • 在课程中增加学生
  • 为课程分配空间
  • 查看学生的所有课程
  • 查看一门课程中的所有学生
  • 查看房间内的所有课程

除了一般的代码审查之外,我还有一些具体的问题:

  1. 学生和课程之间的关系应该是怎样的?我现在有学生包含一套课程,课程包含一组学生。这主要是由于上述的“视图”要求,但我不确定这是否是一个不好的做法,让双方的关系。
  2. 为了将一个学生添加到一个课程中,我有一个注册界面与注册方法,这应该做一些简单的验证(学生同时有课程,是课程满,等等)。注册官中的注册方法称为student.enroll(课程)和course.enroll(学生),但其副作用是,我需要在学生和课程中创建一种叫做注册的公共方法。这里的问题是,我希望所有的注册都通过Registrar.enroll(.),但是我想知道其他注册方法是否是公开的,而实际上除了注册官以外的任何人都不应该调用它们。

一些示例代码(完整的代码可以在github中找到):

代码语言:javascript
复制
public class Course {
    private String name;
    private Calendar time;
    private HashSet<Student> students;
    private Room room;

    public Course(String name, Calendar time) {
        this.name = name;
        this.time = time;
        this.students = new HashSet<>();
    }

    public HashSet<Student> students() {
        return students;
    }

    public void enroll(Student student) {
        students.add(student);
    }

    @Override public String toString() {
        return String.format("Course name: %s%nCourse Time: %s", this.name, this.time.getTime().toString());
    }

    public Calendar getTime() {
        return time;
    }

    public void setRoom(Room room) {
        this.room = room;
    }

    public Room getRoom() {
        return room;
    }
}

学生:

代码语言:javascript
复制
public class Student {
    private String name;
    private HashSet<Course> courses;

    public Student(String name) {
        this.name = name;
        this.courses = new HashSet<>();
    }

    @Override public String toString() {
        return name;
    }

    public HashSet<Course> courses() {
        return this.courses;
    }

    public void enroll(Course course) {
        courses.add(course);
    }
}

书记官长的执行情况:

代码语言:javascript
复制
    public class RegistrarImpl implements Registrar {
    private HashSet<Course> courses = new HashSet<>();
    private HashSet<Student> students = new HashSet<>();

    @Override
    public void registerCourse(Course course) {
        courses.add(course);
    }

    @Override
    public void registerStudent(Student student) {
        students.add(student);
    }

    @Override
    public HashSet<Course> allCourses() {
        return courses;
    }

    @Override
    public HashSet<Student> allStudents() {
        return students;
    }

    @Override
    public void enroll(Course course, Student student) throws EnrollmentException {
        if(!courses.contains(course)) {
            throw new EnrollmentException("Course has not been registered.");
        } else if(!students.contains(student)) {
            throw new EnrollmentException("Student has not been registered.");
        }
        for(Course c : student.courses()) {
            if(c.getTime().getTime().getTime() == course.getTime().getTime().getTime()) {
                throw new EnrollmentException("Student already has class at this time.");
            }
        }
        course.enroll(student);
        student.enroll(course);
    }
}
EN

回答 1

Code Review用户

发布于 2018-05-18 09:21:11

学生和课程之间的关系应该是怎样的?

就像在现实世界中一样:)一门课程并不是学生的一部分,所以我不会在学生中拥有Set<Course>

相反,它应该类似于Enrollment,它将一个Student耦合到一个Course (也可能在给定的时间点)。并将其存储在Registrar中。(例如,作为Set<Enrollment>或某些Maps (如果性能很重要))

Registrar可以检查Student是否已经注册或占用了特定的时间。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/194677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档