Как наиболее эффективно обновить данные в 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
независимы друг от друга, за исключением тех списков идентификаторов; и это действительно просто цифры.
Я не скажу, что это "самый эффективный" способ сделать это. Это работает хорошо, хотя.