Это домашнее задание к шестому семинару по ООП
Взять реализованный код в рамках семинара 4 и продемонстрировать применение принципов, усвоенных на семинаре.
Нужно в проекте прокомментировать участки кода, которые рефакторим, какой принцип применяем и почему или описать это в README
- Класс StudentGroup реализует Single responsibility principle, т.к. в нём находятся только методы для работы с группой/списком студентов, а именно: получение, добавление и итератор для прохождения по списку студентов, и сам список. Таким образом, единственная ответственность этого класса - операции с группой студентов.
- Классы User и Student являются примером Open-closed principle, т.к. код может быть расширен за счёт появляения наследников класса User без модификации базового класса. Таким образом, в классе Student мы переопределяем toString(), чтобы он возвращал не только ФИО и пол, как в User, но и id студента.
- Класс Student, также, применяет Liskov substitution principle, т.к. сохраняет поведение родительского класса User, т.е. обращаясь к Student мы может получить ФИО и пол точно также, как если бы мы обращались к User, но в дополнение, мы можем получить id студента. Таким образом, функциональность User была сохранена и расширена в классе-наследнике.
- UserController и StudentController отвечают Interface segregation principle, т.к. в UserController описан только метод create, который, в свою очередь, может быть реализован в StudentController. Т.е. он не имеет методов, которые класс, реализующий данный интерфейс(в данном случае StudentController), реализовать не может.
- Для реализации принципа Dependency inversion principle был добавлен интерфейс Gender и классы Male и Female, которые его реализуют. Таким образом, у нас есть абстракция Gender, от которой зависят классы Male и Female, но при этом в User и Student мы принимаем Gender, т.е. не впадаем в зависимость от деталей и конкретных реализаций.