Advertisement
sa2304

Комментарии к коду по задаче "Функция vs метод класса"

May 18th, 2021
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. + Здорово, что выполнение команд поручено наследникам Command.
  2.  
  3. - Хаос в регистре букв: с маленькой буквы в camelCase названы и методы класса, и переменные.
  4. - Не нужно искусственное ограничение по MAX_USER_ID. Хорошо, что заранее резервируем место в векторе под 10e5 читателей, но если вдруг придет миллион первый - можно сделать resize и код продолжит работать. То же и с MAX_PAGE_ID.
  5. - Оооочень длинные имена двух констант - ANSWER_IN_CASE_OF_NO_USER, ANSWER_IN_CASE_OF_THE_ONLY_ONE_USER - которые нужны в единственном месте. С первого взгляда неясно, зачем они нужны. Код, который специально обрабатывает частные случаи, кажется хрупким. Стоит потом случайно забыть о частном случае и программа рухнет.
  6.  
  7. - Страшно сложные объявления векторов :)
  8. std::vector<std::optional<std::uint16_t>> statistics_per_user_;
  9. std::vector<std::optional<std::uint32_t>> statistics_per_page_;
  10. Почему optional? Разве число страниц 0 не говорит, что человек книгу еще не читал?
  11. В условии написано криво, якобы нужен частный случай когда "ни поступало ни одного READ", но это бред автора, код не обязан буквально его повторять :)
  12. Почему uint16_t, uint32_t? Чем не угодил int?) unsigned и точные размеры чисел в битах нужны для побитовых операций, например, шифрования, здесь важно строго указать размеры блока. Но здесь это стрельба из пушки по воробьям.
  13.  
  14. - Счетчик total_users_ ни к чему - мы всегда знаем кол-во всех читателей - это все, кто прочел первую страницу.
  15.  
  16. - Имена statistics_per_user_, statistics_per_page_слишком общие - непонятно, что за статистики? Куда лучше user_to_page и page_to_user_count. По аналогии с word_to_document в SearchServer.
  17.  
  18. - Имя addStatisticsForUser тоже слишком общее ) Лучше SetPagesRead(user_id, pages_count). Set намекает, что что-то запоминаем/записываем. Add - это скорее что-то добавляем и этого в контейнере становится больше. Например AddUser.
  19.  
  20. - getUsersPercentageReadLessThan: название трудно читается. Получить пользователей процент (ага, доля пользователей) прочитать меньше чем (хм, кто прочел меньше чем... кто? user_id). Не уверен, что понял, надо читать код. Уж лучше GetUserStatistics =) или GetUserScore, это же своего рода оценка.
  21. О частных случаях в getUsersPercentageReadLessThan уже писал, а еще вызов for_each кажется лишним.
  22. Мы ведь знаем кол-во всех читателей: total_readers = statistics_per_page_[0]. Еще мы знаем кол-во тех, кто читает с нами наравне или быстрее: fast_readers = statistics_per_page_[user_id]. Остается вычесть и поделить.
  23.  
  24. Приятнее смотрится сравнение, в котором меньшее - слева :) - if (MAX_USER_ID < userId)
  25.  
  26. Суть абстрактной Command - независимое действие. Его можно выполнить однажды, повторить несколько раз или отменить (undo). Например https://pastebin.com/3mHVMq3q
  27.  
  28. У тебя же ReadCommand - не команда, а скорее CommandProcessor - он читает из cin строку и каждый раз работает по-разному.
  29.  
  30. Хороший пример реализации - QUndoStack в Qt https://doc.qt.io/qt-5/qundostack.html , реализует стек действий (QAction) - историю команд.
  31.  
  32. Для чтения команды из cin лучше завести static метод ReadCommand ReadCommand::Parse(istream&), тогда выполнение команды (Execute) не будет лезть в cin.
  33.  
  34. Book book;
  35. ReadCommand cmd = ReadCommand::Parse(cin);
  36. cmd.Execute(book);
  37.  
  38. Тогда и shared_ptr не нужны, команда хранится на стеке. В этой задаче не нужно повторять команды, не нужно их хранить, можно обойтись без shared_ptr.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement