Помощь с рефакторингом

Писал тестовое для Java Backend вакансии у себя в компании.Вот текст документа с заданием:

User ManagProject Title: Library Management System This project is about creating a Library Management System, a software tool to help library staff manage books, patrons (library users), and book borrowing in an easy and efficient way.
Key Features: ement: Create and manage librarian accounts. Allow librarians to log in.

Book Management:
    Add new books with details like title, author, ISBN, and genre.
    Edit and update book info.
    Remove books from the library.
    Display a list of all library books.

Patron Management:
    Add new patrons with their names, contact info, and membership status.
    Edit and update patron details.
    Remove patrons from the library.
    Show a list of all library patrons.

Borrowing System:
    Enable library patrons to borrow books.
    Track due dates for borrowed books.
    Allow librarians to mark books as returned.
    Notify patrons if they have overdue books.

Search and Filtering:
    Create a search feature for books and patrons based on criteria like title, author, and name.
    Add options to sort and filter lists of books and patrons.

Reporting:
    Generate reports that display overdue books and transaction history.
    Provide statistics about the library's book collection and patron activity.   Technical Details:

User Interface:
    Design an easy-to-use web-based interface for librarians.
    Ensure it works well on different screen sizes.

Security:
    Set up user login and access control for librarians.
    Safeguard sensitive information, like passwords and patron data.

Database:
    Use a relational database (e.g., MySQL, PostgreSQL) to store book, patron, and transaction data.
    Create a suitable database structure and relationships.

Performance:
    Optimize how the system fetches data from the database.
    Ensure the system can handle multiple users at once.

Scalability:
    Design the system to grow smoothly as the library's needs expand.   Technology Stack:

Backend: Java (with Spring Boot)
Frontend: HTML, CSS, JavaScript
Database: Relational (e.g., MySQL, PostgreSQL)
Security: Spring Security
Database Access: Hibernate
User Interface Templating: Thymeleaf or similar   Project Deliverables:

The project's source code.
Documentation (README) explaining how to set up and run the application.
Brief documentation describing the project's structure and design choices.
Source code should be provided as a git repository.   Evaluation Criteria:   The project will be assessed based on:

Functionality: Does the system meet all functional requirements?
User Interface: Is the interface user-friendly and adaptable to different devices?
Code Quality: Is the code well-organized, readable, and maintainable?
Security: Is user authentication and data protection implemented correctly?
Database Design: Does the database structure fit the project's needs?
Documentation: Is there clear documentation for setting up and using the application?
Error Handling: Does the application handle errors gracefully?
Performance: How efficiently does the application perform its tasks?

После сдачи тестового сказали что видно что "писал самуочка"(это правда) и сказали исправить и потом попробовать еще,но к сожалению что конкретно с заданием не так не подсказали.У самого не получается найти что конкретно надо исправить.Буду рад если подскажете.Вот ссылка на проект на гитхабе


Ответы (1 шт):

Автор решения: Alex Krass

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

  1. Оформление пояснительного файла к проекту в git идет через файл readme.md с разметкой markdown и пишется он не в три не особо ясные строки.

  2. Оформление базы данных идет через файлы SQL сложенных в отдельном месте и прогоняемых отдельно на базе данных. У вас помимо того, что схема привязана к приложению, так часть еще вдобавок идет вставкой кодом. В исходниках под это сделано даже два дублирующих класса DataInitializer.java и UserDataInitializer.java.

  3. Схема базы данных должна отвечать требованиям, что-то сделано непонятно зачем и для чего, чего-то не хватает.

Есть в системе Роли (role) в отдельной таблице и есть Пользователи (user) в отдельной таблице. Кстати оба слова могут быть зарезервированными базой данных, поэтому обычно пишут roles/users и придерживаются одинакового наименования во множестве числе. Вот зачем существует текстовое поле user.role в этой схеме?

Или книги и их выдача, есть таблица loan, которая описывает выдачу. Зачем тогда в таблице книг существует books.patron_id? Почему transactions, а не loan_history? Сама таблица loan уже содержит все необходимые сведения, даже отдельно историю добавлять не нужно (можно для приличия добавить планируемую дату возврата, чтобы отслеживать фактические возвраты и просрочку).

Это если по существу, а не по существу можно еще накидывать. К примеру, у книги может быть несколько авторов и несколько жанров. Комментарии в схеме отсутствуют, хотя база позволяет их вести (COMMENT option). Статусы и другое проходят через магические константы, вот что такое transactions.transaction_type, если оно просто текстовое без привязки к чему-то.

Еще patreon могут рассматриваться как те же самые пользователи. Если когда-нибудь сервис захочет дать пользователям самим искать книги на терминале, им желательно дать доступ с отдельными правами и входом. Тогда таблица patreon отпадет сама собой как излишняя. Распределение только по правам и при этом сами работники могут быть такими же пользователями.

В этих случаях схема может выглядеть следующим образом.

введите сюда описание изображения

  1. Работа с UX/UI

Представьте себя работником этой программы и подумайте, что могло бы быть удобным и что нет. К примеру, если я захожу в раздел с книгами, я хочу удобным образом с ними работать.

Первое же, что я вижу, что большая часть книг мне не доступна на просмотр и почему-то я должен отдельно нажимать на кнопку borrowed books, иначе в списке я их просто не найду. Можно же тоже самое сделать фильтром, а не заставлять человека ходит по разным формам.

Если в библиотеке будет несколько тысяч книг, то листать вниз до кнопок я буду до вечера :) Почему они не сверху и пробовали ли вы добавить больше пяти книг в базу? Больше пяти пользователей? Если мне нужен перекрестный поиск, то он не реализован. Для всего это есть и Pageable и CriteriaBuilder. Есть куда стремится.

Отсутствует статистическая информация, к примеру, сколько книг за месяц было взято, вернули, вернули с задержкой? Ну и есть пункт adaptable to different devices, внимательно проверяйте как себя ведет приложение на разных экранах.

В общем думайте об удобстве.

  1. Ну и наконец сам код.

К структуре папок и файлов особо нечего отметить неправильно. Сам код тоже оформлен с нормальной разбивкой на контроллеры/сервисы/репозитории. А дальше сложно сказать, что хотят увидеть проверяющие, поскольку практики и методы использования есть различные. Вот тут вам надо уточнять обязательно у проверявших.

Можно разве что порассуждать на тему DTO нормальных вместо Entity, которые должны быть отделены друг от друга. А так же проверки, которые можно туда же запихнуть (аннотации @Max, @Min, @NotNull, etc).

Необязательность разных адресов для Get/Post, они прекрасно будут работать на одном @GetMapping("/book/create") + @PostMapping("/book/create").

→ Ссылка