Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- + Здорово, что выполнение команд поручено наследникам Command.
- - Хаос в регистре букв: с маленькой буквы в camelCase названы и методы класса, и переменные.
- - Не нужно искусственное ограничение по MAX_USER_ID. Хорошо, что заранее резервируем место в векторе под 10e5 читателей, но если вдруг придет миллион первый - можно сделать resize и код продолжит работать. То же и с MAX_PAGE_ID.
- - Оооочень длинные имена двух констант - ANSWER_IN_CASE_OF_NO_USER, ANSWER_IN_CASE_OF_THE_ONLY_ONE_USER - которые нужны в единственном месте. С первого взгляда неясно, зачем они нужны. Код, который специально обрабатывает частные случаи, кажется хрупким. Стоит потом случайно забыть о частном случае и программа рухнет.
- - Страшно сложные объявления векторов :)
- std::vector<std::optional<std::uint16_t>> statistics_per_user_;
- std::vector<std::optional<std::uint32_t>> statistics_per_page_;
- Почему optional? Разве число страниц 0 не говорит, что человек книгу еще не читал?
- В условии написано криво, якобы нужен частный случай когда "ни поступало ни одного READ", но это бред автора, код не обязан буквально его повторять :)
- Почему uint16_t, uint32_t? Чем не угодил int?) unsigned и точные размеры чисел в битах нужны для побитовых операций, например, шифрования, здесь важно строго указать размеры блока. Но здесь это стрельба из пушки по воробьям.
- - Счетчик total_users_ ни к чему - мы всегда знаем кол-во всех читателей - это все, кто прочел первую страницу.
- - Имена statistics_per_user_, statistics_per_page_слишком общие - непонятно, что за статистики? Куда лучше user_to_page и page_to_user_count. По аналогии с word_to_document в SearchServer.
- - Имя addStatisticsForUser тоже слишком общее ) Лучше SetPagesRead(user_id, pages_count). Set намекает, что что-то запоминаем/записываем. Add - это скорее что-то добавляем и этого в контейнере становится больше. Например AddUser.
- - getUsersPercentageReadLessThan: название трудно читается. Получить пользователей процент (ага, доля пользователей) прочитать меньше чем (хм, кто прочел меньше чем... кто? user_id). Не уверен, что понял, надо читать код. Уж лучше GetUserStatistics =) или GetUserScore, это же своего рода оценка.
- О частных случаях в getUsersPercentageReadLessThan уже писал, а еще вызов for_each кажется лишним.
- Мы ведь знаем кол-во всех читателей: total_readers = statistics_per_page_[0]. Еще мы знаем кол-во тех, кто читает с нами наравне или быстрее: fast_readers = statistics_per_page_[user_id]. Остается вычесть и поделить.
- Приятнее смотрится сравнение, в котором меньшее - слева :) - if (MAX_USER_ID < userId)
- Суть абстрактной Command - независимое действие. Его можно выполнить однажды, повторить несколько раз или отменить (undo). Например https://pastebin.com/3mHVMq3q
- У тебя же ReadCommand - не команда, а скорее CommandProcessor - он читает из cin строку и каждый раз работает по-разному.
- Хороший пример реализации - QUndoStack в Qt https://doc.qt.io/qt-5/qundostack.html , реализует стек действий (QAction) - историю команд.
- Для чтения команды из cin лучше завести static метод ReadCommand ReadCommand::Parse(istream&), тогда выполнение команды (Execute) не будет лезть в cin.
- Book book;
- ReadCommand cmd = ReadCommand::Parse(cin);
- cmd.Execute(book);
- Тогда и shared_ptr не нужны, команда хранится на стеке. В этой задаче не нужно повторять команды, не нужно их хранить, можно обойтись без shared_ptr.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement