2015-12-21 7 views
0

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

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

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

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

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

ответ

0

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

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

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

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

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

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

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

Я не буду говорить, что это «самый эффективный» способ сделать это. Тем не менее, он работает хорошо.

+0

Я полностью согласен с первой частью вашего решения, то есть хорошо иметь два метода add ... и отдельный метод tat используется для создания двунаправленных отношений. Однако я бы предложил использовать ссылки вместо идентификаторов. Они менее подвержены ошибкам, требуют меньше места (при условии, что «Integer» в Java), и их гораздо легче перемещаться. Я не буду беспокоиться о том, чтобы «наводнить» вашу память, эти двунаправленные ссылки действительно не должны быть проблемой. – TilmannZ

+0

@TilmannZ: Какой бы вы ни предпочитали. Однако обратите внимание, что «целое число» - 32 бита. Ссылка будет 32 бита в 32-битной системе, но 64 бит в 64-битной системе.Наверное, не имеет значения, если вы не говорите сотни миллиардов записей. –

+0

Я в основном согласен. Если вы скомпилируете 64-битную версию, вы получите 64-битные указатели. Если вы скомпилируете 32-битную (ограниченную до 4 ГБ или около того), вы получите 32-битные ссылки даже на 64-битных системах (я думаю). Java немного отличается, поскольку Java «сжимает» ссылки, они требуют только 32 бит, если вы выбрали меньше 32 ГБ памяти, даже на 64-битной JVM. – TilmannZ