Как наиболее эффективно обновить данные в 2 взаимозависимых классах

Я сталкивался с этой очень простой вещью несколько раз, но я никогда не знал, как решить ее наиболее эффективным способом.

У меня есть класс "Студент" и класс "Курс". Студент должен знать все свои курсы, которые он посещает, по списку курсов, а курс должен знать всех студентов, которые посещают его, по списку студентов.

Теперь предположим, что я хочу, чтобы студент посетил новый курс, поэтому я создаю метод addCourse (курс курса), чтобы добавить новый курс в список курсов студента - нет проблем. Но я также хочу, чтобы курс знал о том, что студент сейчас его посещает. Поэтому я создаю метод addStudent(Student student) для класса курса и вызываю его в методе addCourse студента.

Проблема в том, что я хочу, чтобы эти обновления данных были возможны с обеих сторон - студентов и курсов, но если бы я добавил соответствующий другой метод в свой собственный метод, я бы, конечно, оказался в переполнении стека. Так как я могу предотвратить это наиболее эффективно?

Также, если я сохраню эти данные в объектах обоих классов, я думаю, что я заполнил бы свою память большим количеством данных, чем мне нужно. Есть ли способ предотвратить это тоже без потери доступа к данным?

1 ответ

Решение

У тебя есть Student класс, который имеет AddCourse метод, который обновляет список курсов, которые посещает студент.

У тебя есть Course класс, который имеет AddStudent метод, который обновляет список студентов, посещающих курс.

Где-то еще в вашей программе вы решаете, что студент собирается посетить курс. Например, может существовать пользовательский интерфейс, с которым взаимодействует студент, если он хочет присоединиться к курсу. Действие этого пользователя должно вызвать обращение к некоторой бизнес-логике, которая делает все необходимое для добавления учащегося в курс. Например:

function AddStudentToCourse(studentId, courseId)
{
    student = GetStudentById(studentId);
    student.AddCourse(courseId);
    course = GetCourseById(courseId);
    course.AddStudent(studentId);
}

Дело в том, что насколько Student обеспокоен, он просто поддерживает список номеров Id курса. Student класс на самом деле ничего не делает с курсами; он просто поддерживает список, так что какой-то другой фрагмент кода может ссылаться на него позже.

То же самое для Course; он просто поддерживает список студенческих номеров.

Прелесть этого дизайна в том, что Student а также Course независимы друг от друга, за исключением тех списков идентификаторов; и это действительно просто цифры.

Я не скажу, что это "самый эффективный" способ сделать это. Это работает хорошо, хотя.

Другие вопросы по тегам