@startuml
'https://plantuml.com/class-diagram
abstract class StudentBase {
    -id: Integer
    -telephone: String
    -telegram: String
    -mail: String
    -git: String
    __
    +{static}valid_name?(String): Boolean
    +{static}valid_profile_name?(String): Boolean
    +{static}valid_telephone?(String): Boolean
    +{static}valid_email?(String): Boolean
    -initialize(Hash)
    +has_git?(): Boolean
    +has_contacts?(): Boolean
    +valid?(): Boolean
    +get_contact(): String
    __
    +id
    +git
    #telephone
    #telegram
    #mail
    __
    #id
    #git=(String)
    #telephone=(String)
    #telegram=(String)
    #mail=(String)

}
class StudentShort extends StudentBase {
    -short_fio: String
    --
    +{static}from_student(Student): StudentShort
    +initialize(id,info_short): StudentShort
    +to_s(): String
    --
    +short_fio:String
    --
    -short_fio
}
class Student extends StudentBase{
    -last_name: String
    -first_name: String
    -dadname: String
    --
    +{static}from_json(String): Student
    +initialize(String, String, String, Hash)
    +set_contacts(Hash)
    +short_fio():String
    +info_short():String
    +to_s(): String
    +to_json(): String
    --
    +telephone: String
    +telegram: String
    +mail: String
    +last_name: String
    +first_name: String
    +dadname: String
    __
    +id
    +git=(String)
    +telephone=(String)
    +telegram=(String)
    +mail=(String)
    +last_name=(String)
    +first_name=(String)
    +dadname=(String)
}

class DataTable{
    -table : Array
    -rows_count: Integer
    -cols_count: Integer
    __
    +initialize(Array)
    +get_item(Integer,Integer): Object
    __
    +rows_count: Integer
    +cols_count: Integer
    -table: Array
    __
    -rows_count
    -cols_count
    -table
}
abstract class DataList{
    -objects_list : Array
    -selected_objects: Array
    -listeners: Array
    __
    -initialize(Array)
    +select_by_number(Integer)
    +get_selected(): Array<Integer>
    +clear_selected()
    +get_data(): DataTable
    #get_names()
    #get_fields_datatable(objects)

    +replace_objects(Array)
    +add_listener(Object)
    +remove_listener(Object)
    +notify()

    __
    -objects_list: Array
    -selected_objects: Array
    __
    +objects_list: Array
    -selected_objects: Array
}

class DataListStudentShort extends DataList{
    --
    +initialize(Array)
    +get_names(): DataTable
    #get_fields_datatable(): Array<String>
}

abstract class StudentsListBase{
    -students: Array
    -serializer: <Serializer>
    -gen_id: Integer
    --
    +initialize(<Serializer>)
    +get_by_id(Integer)
    +sort_students()
    +get_student_short_count()
    +get_k_n_student_short_list(Integer,Integer,List<StudentShort>): DataListStudentShort
    +add_student(<Student>)
    +replace_student(Integer,<Student>)
    +remove_student(Integer)
    +read_from_file(String)
    +write_to_file(String,Array<Student>)
    -update_gen_id
    --
    -students(): Array
    -serializer(): <Serializer>
    -gen_id(): Integer
    --
    -students(): Array
    +serializer(): <Serializer>
    -gen_id(): Integer
}

class StudentsListSerializer{
    -initialize()
    #serialize(String,Array<Students>):
    #deserialize(String):
}

class StudentsListJsonSerializer extends StudentsListSerializer{
    +initialize()
    +serialize(String,Array<Student>):
    +deserialize(String):Array<Student>
}

class StudentsListYamlSerializer extends StudentsListSerializer{
    +initialize()
    +serialize(String,Array<Student>):
    +deserialize(String):Array<Student>
}

class StudentsListXmlSerializer extends StudentsListSerializer{
    +initialize()
    +serialize(String,Array<Student>):
    +deserialize(String): Array<Student>
}

class DBUniversity {
    -instance_mutex: Mutex
    -instance: DBUniversity
    -client: SQLite3::
    --
    {static}instance(): DBUniversity
    -initialize()
    +prepare_exec(String, *Object): SQLite3::ResultSet
    +query(String): SQLite3::ResultSet
}
class DBSourceAdapter {
    -db: DBUniversity
    --
    +initialize()
    +student_by_id(Integer): Student
    +paginated_short_students(Integer, Integer): DataListStudentShort
    +add_student(Student): Integer
    +replace_student(Integer, Student)
    +remove_student(Integer)
    +student_count(): Integer
    --
    -db(): DBUniversity
    --
    -db=(DBUniversity)
}

class StudentRepository {
    -data_source_adapter
    --
    +initialize(data_source_adapter)
    +student_by_id(Integer): Student
    +get_k_n_student_short_list(Integer, Integer, DataList=nil): DataList
    +add_student(Student): Integer
    +replace_student(Integer, Student)
    +remove_student(Integer)
    +student_count(): Integer
}

class FileSourceAdapter {
    -file_path: String
    -file_source: FileDataSource
    --
    +initialize(DataTransformerBase, String)
    +get_by_id(Integer): Student
    +get_k_n_student_short_list(Integer, Integer, DataList=nil): DataList
    +add_student(Student): Integer
    +replace_student(Integer, Student)
    +remove_student(Integer)
    +get_student_short_count(): Integer
}


DataList ..> DataTable
StudentsListBase *-- StudentsListSerializer
DataListStudentShort ..> StudentShort

DBSourceAdapter o-- DBUniversity
StudentRepository *-- DBSourceAdapter
StudentRepository *-- FileSourceAdapter

FileSourceAdapter o-- StudentsListBase
StudentsListBase ..> DataListStudentShort
@enduml