Помощь с рефакторингом
Писал тестовое для 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 шт):
Сразу дисклеймер: накидать замечаний можно много, но не факт, что точки зрения отвечающих и проверяющих совпадут. Поэтому желательно было бы узнать от первоисточника, что им не понравилось и что следует исправить. От себя я могу просто показать, где конкретно я вижу проблемы и что можно улучшить.
Оформление пояснительного файла к проекту в git идет через файл readme.md с разметкой markdown и пишется он не в три не особо ясные строки.
Оформление базы данных идет через файлы SQL сложенных в отдельном месте и прогоняемых отдельно на базе данных. У вас помимо того, что схема привязана к приложению, так часть еще вдобавок идет вставкой кодом. В исходниках под это сделано даже два дублирующих класса DataInitializer.java и UserDataInitializer.java.
Схема базы данных должна отвечать требованиям, что-то сделано непонятно зачем и для чего, чего-то не хватает.
Есть в системе Роли (role) в отдельной таблице и есть Пользователи (user) в отдельной таблице. Кстати оба слова могут быть зарезервированными базой данных, поэтому обычно пишут roles/users и придерживаются одинакового наименования во множестве числе. Вот зачем существует текстовое поле user.role в этой схеме?
Или книги и их выдача, есть таблица loan, которая описывает выдачу. Зачем тогда в таблице книг существует books.patron_id? Почему transactions, а не loan_history? Сама таблица loan уже содержит все необходимые сведения, даже отдельно историю добавлять не нужно (можно для приличия добавить планируемую дату возврата, чтобы отслеживать фактические возвраты и просрочку).
Это если по существу, а не по существу можно еще накидывать. К примеру, у книги может быть несколько авторов и несколько жанров. Комментарии в схеме отсутствуют, хотя база позволяет их вести (COMMENT option). Статусы и другое проходят через магические константы, вот что такое transactions.transaction_type, если оно просто текстовое без привязки к чему-то.
Еще patreon могут рассматриваться как те же самые пользователи. Если когда-нибудь сервис захочет дать пользователям самим искать книги на терминале, им желательно дать доступ с отдельными правами и входом. Тогда таблица patreon отпадет сама собой как излишняя. Распределение только по правам и при этом сами работники могут быть такими же пользователями.
В этих случаях схема может выглядеть следующим образом.
- Работа с UX/UI
Представьте себя работником этой программы и подумайте, что могло бы быть удобным и что нет. К примеру, если я захожу в раздел с книгами, я хочу удобным образом с ними работать.
Первое же, что я вижу, что большая часть книг мне не доступна на просмотр и почему-то я должен отдельно нажимать на кнопку borrowed books, иначе в списке я их просто не найду. Можно же тоже самое сделать фильтром, а не заставлять человека ходит по разным формам.
Если в библиотеке будет несколько тысяч книг, то листать вниз до кнопок я буду до вечера :) Почему они не сверху и пробовали ли вы добавить больше пяти книг в базу? Больше пяти пользователей? Если мне нужен перекрестный поиск, то он не реализован. Для всего это есть и Pageable и CriteriaBuilder. Есть куда стремится.
Отсутствует статистическая информация, к примеру, сколько книг за месяц было взято, вернули, вернули с задержкой? Ну и есть пункт adaptable to different devices
, внимательно проверяйте как себя ведет приложение на разных экранах.
В общем думайте об удобстве.
- Ну и наконец сам код.
К структуре папок и файлов особо нечего отметить неправильно. Сам код тоже оформлен с нормальной разбивкой на контроллеры/сервисы/репозитории. А дальше сложно сказать, что хотят увидеть проверяющие, поскольку практики и методы использования есть различные. Вот тут вам надо уточнять обязательно у проверявших.
Можно разве что порассуждать на тему DTO нормальных вместо Entity, которые должны быть отделены друг от друга. А так же проверки, которые можно туда же запихнуть (аннотации @Max, @Min, @NotNull, etc).
Необязательность разных адресов для Get/Post, они прекрасно будут работать на одном @GetMapping("/book/create") + @PostMapping("/book/create").