# Lab 2 ## Диаграмма классов: ```mermaid classDiagram class PersistenceStrategy { + load(filename : String) : Raise + save(filename : String, students : Students) : Raise } class StudentsListBase { + initialize(filename : String) + load_from_file() : Raise + save_to_file() : Raise + get_student_by_id(id : String) : Student + get_k_n_student_short_list(k : Int, n : Int, data_list = nil) : List + sort_students() : List + add_student(student : Student) : Student + update_student_by_id(id : Int, new_stodent : Student) : Bool + delete_student_by_id(id : Int) + get_student_short_count() : Int } class StudentsListDB { + initialize() + get_student_by_id(id : Int) : nil | Student + get_k_n_student_short_list(k : Int, n : Int) : List + add_student(student : Student) : Student + update_student_by_id(id : Int, new_student : Student) + delete_student_by_id(id : Int) + get_student_short_count() : Int - row_to_student(row : Student) - escape(value : any) } class JSONPersistenceStrategy { + load(filename : String) : List<> + save(filename : String, students : List) - student_to_hash(student : Student) - hash_to_student(hash : String) } class TXTPersistenceStrategy { + load(filename : String) : List<> + save(filename : String, students : List) } class YAMLPersistenceStrategy { + load(filename : String) : List<> + save(filename : String, students : List) - student_to_hash(student : Student) - hash_to_student(hash : String) } class StudentsList { + initialize(filename : String, persistence_strategy) + load() : self + save() : self + get_student_by_id(id : Int) : Student + get_k_n_student_short_list(k : Int, n : Int, data_list = nil) : DataListStudentShort + sort_students() : List add_student(student : Student) : Student + update_student_by_id(id : Int, new_student : Student) : Bool + delete_student_by_id(id : Int) : Bool + get_student_short_count() : Int } class DatabaseConnection { + initialize() + client() + query(sql : String) } class BinarySearchTree { - root : Node + add(student : Student) : void + each(&block) : void - insert(node : Node, student : Student) : Node - in_order_traversal(node : Node, &block) : void } class Node { - student : Student - left : Node - right : Node + Node(student : Student) } class Person { - id : String - git : String - phone : String? - telegram : String? - email : String? + Person(id : String, git : String, phone: String, telegram: String, email: String) + phone=(String) : Boolean + telegram=(String) : Boolean + email=(String) : Boolean + surname_initials() : NotImplementedError + valid_phone_number() : Boolean <> + valid_telegram() : Boolean <> + valid_email() : Boolean <> + git_present() : Boolean + contact_present() : Boolean + get_first_contact() : String + git=(git : String) : void + validate_id(id: String) : void <> + validate_git(git : String) : void <> - valid_git?(git : String) : Boolean - valid_id?(id : String) : Boolean } class StudentRepository { + read_from_txt(file_path : String) : List~Student~ <> + write_to_txt(file_path : String, students : List~Student~) <> } class StudentShort { - surname_initials : String + get_surname_initials() : String + StudentShort(id : String, surname_initials : String, phone: String, telegram: String, email: String) + from_student(student : Student) : StudentShort <> + from_string(id : String, info_string : String) : StudentShort <> + to_s() : String - parse_contact_string(contact_string: String) : Array <> } class Student { - surname : String - name : String - patronymic : String - birth_date : Date - const NAME_REGEX : String + Student(id : String, git : String, phone: String, telegram: String, email: String, surname : String, name : String, patronymic : String, birth_date : Date) + from_string(student_string : String) : Student <> + surname_initials() : String + to_s() : String + get_info() : String + surname=(surname : String) + name=(name : String) + patronymic=(patronymic : String) + birth_date=(birthdate : String) + valid_name?(name : String) : Boolean <> - name_initial(name : String) : String - patronymic(patronymic : String) : String } BinarySearchTree o-- Node Node o-- Student StudentsList o-- Student StudentsListBase o-- Student StudentsListDB o-- DatabaseConnection DatabaseConnection <.. Singleton JSONPersistenceStrategy o-- PersistenceStrategy TXTPersistenceStrategy o-- PersistenceStrategy YAMLPersistenceStrategy o-- PersistenceStrategy Person <|-- Student Person <|-- StudentShort Student <.. StudentRepository ```