require_relative 'student' require_relative 'student_short' require_relative 'data_list_student_short' require_relative 'data_table' class StudentsListBase attr_reader :students def initialize(filename) @filename = filename @students = [] end # Абстрактный метод для загрузки данных. def load_from_file raise NotImplementedError, "Метод load_from_file должен быть реализован в подклассе" end # Абстрактный метод для сохранения данных. def save_to_file raise NotImplementedError, "Метод save_to_file должен быть реализован в подклассе" end # Получить объект Student по ID. def get_student_by_id(id) @students.find { |s| s.id.to_s == id.to_s } end # Получить список из k студентов (страница n) в виде объекта DataList. def get_k_n_student_short_list(k, n, data_list = nil) start_index = (n - 1) * k sorted_students = @students.sort_by { |s| s.surname_initials } selected_students = sorted_students[start_index, k] || [] short_objects = selected_students.map { |s| StudentShort.from_student(s) } if data_list && data_list.is_a?(DataList) if data_list.respond_to?(:items=) data_list.items = short_objects else data_list = DataListStudentShort.new(short_objects) end data_list else DataListStudentShort.new(short_objects) end end # Сортировать список студентов по ФамилияИнициалы. def sort_students! @students.sort_by! { |s| s.surname_initials } end # Добавить объект Student в список (формирование нового ID). def add_student(student) new_id = if @students.empty? 1 else max_id = @students.map { |s| s.id.to_i }.max max_id + 1 end student.id = new_id.to_s @students << student student end # Обновить студента по ID. def update_student_by_id(id, new_student) index = @students.find_index { |s| s.id.to_s == id.to_s } if index new_student.id = @students[index].id @students[index] = new_student true else false end end # Удалить студента по ID. def delete_student_by_id(id) initial_count = @students.size @students.reject! { |s| s.id.to_s == id.to_s } initial_count != @students.size end # Получить количество студентов. def get_student_short_count @students.size end end