Opened 4 years ago
Last modified 4 years ago
#931 assigned ожидается проверка
HW #3
Reported by: | Filippov Denis | Owned by: | Egor Suvorov |
---|---|---|---|
Component: | HW #3 (Huffman) | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (8)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
P.S. И ещё в паре мест не хватает final
и noexcept
.
P.P.S. Странно, что в isLeaf
стоит assert
, а в getByte()
стоит исключение. Хотя на самом деле и там, и там у нас ошибка программиста и инвариантов, а не какая-то проблема, которую можно обработать. Это 5/8 по стилю.
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:4 Changed 4 years ago by
Version: | 2.0 → 3.0 |
---|
К сожалению, попытка сделана после дедлайна второй посылки. Первой попытки было недостаточно, чтобы разблокировать третью.
Так что это считается посылкой по акции и проверяется с весом 0.5. Будет выставлена наиболее удачная из двух.
comment:5 Changed 4 years ago by
Version: | 3.0 → 2.0 |
---|
Напомнили, что была договорённость. Пишите в следующий раз прямо в тикете, пожалуйста.
comment:6 Changed 4 years ago by
Owner: | changed from Egor Suvorov to Filippov Denis |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Проверялась ревизия 4051.
Третья попытка разблокирована.
Корректность 8.99/9
- Записывать через
reinterpret_cast
не стоит: это не будет работать на, скажем, древних маках и роутерах, где порядок байт у чисел другой.
Тесты 6.5/8
- В тестах
Huffman archiver compress
вы дублируете код, а надо получить тот же результат другим методом. Например, не надо писать черезreinterpret_cast
, надо честно собрать массив нулей нужной длины. Делается в пару строчек.- Там как-то очень, очень много разной настройки тестов происходит. Наверняка можно вынести в
TEST_CASE
и сделатьSUB_CASE
. Или какую-то вспомогательную функцию.
- Там как-то очень, очень много разной настройки тестов происходит. Наверняка можно вынести в
Build from nontrivial example
какой-то дико сложный. Я не понял, что там происходит. Лучше деревце поменьше. Или проверять в таком сложном не дерево, а сразу коды. Потому что рекурсивный dfs в тестах — это что-то явно лишнее.- Чтобы было проще отлаживать, сделайте несколько простых
CHECK
подряд. Тогдаdoctest
их распарсит. Не надо упихивать всё в одно условие. - Никакого
allOk
,CHECK
на каждое значение. Чем больше отладочной информации "что не так" — тем лучше. - Многовато церемоний в тестах для того, чтобы что-то простое проверить. Кажется, что слишком сложные интерфейсы у классов, надо упростить, чтобы было проще запускать.
Архитектура 3.5/5
- Не хватает
namespaces
для порядка. HuffmanCLIException
можно сделать проще и точнее:using std::logic_error::logic_error;
. Аналогично сHuffmanException
.HuffmanCLI
parseComLineAndRun
даже не определён.getMode()
noexcept.NUM_OF_ARGUMENTS
— точно приватная деталь реализации вCLI.cpp
- Не очень хорошо, что вы всё время храните аргументы. Лучше один раз распарсить и сохранить. Тогда сразу можно будет все ошибки выдать.
- Странно, что
argc
у вас константный, аargv
— нет. - Не влияет на баллы: обычно всё-таки целиком парсят вход, чтобы найти сразу все ошибки. А не пытаются распарсить "лениво". Например, сейчас у вас не будут найдены лишние аргументы, а это тоже популярная ошибка.
- То, что вам приходится в тестах делать что-то странное с
.data()
— знак того, что интерфейс плохо спроектирован.
Huffman
- Очень странно, что есть отдельный
HuffmanFreqsCounter
(кстати, не должен иметь никакого отношения к Хаффману), но при этом вызываемtree.getFreqsArray()
. А вextract()
вообще массив создаём. Не надо ли "массив частот" всё-таки объектом сделать? А то много церемоний и в разных местах по-разному. HuffmanTree
- После вызова конструктора всегда надо вызывать
buildForest()
+buildTree()
. Тогда это должен делать конструктор, чтобы нельзя было забыть. Заодно уйдут лишние флаги, лишние проверки, лишние поля (типа_nodes
), лишние тесты с проверкойis_sorted
.
- После вызова конструктора всегда надо вызывать
- Очень странно, что есть отдельный
HuffmanFreqsCounter
явно не в своём файле лежит, даже тесты намекают.HuffmanNode
- Конструктор от двух вершин может сам посчитать себе байт и частоту.
- Странно, что геттер для байта есть, а для частоты и
_freq
нет. Плюс странно, зачемHuffmanTree
друг.
Стиль 5/8
- НЕ ИСПОЛЬЗУЙТЕ C-STYLE CAST (в тестах, например).
- ОБЪЯВЛЯЙТЕ ПЕРЕМЕННЫЕ ТОЛЬКО ТАМ, ГДЕ НУЖНО (в
buildTree()
, например,last
не по делу). BitStream
CHAR_BIT
, а не__CHAR_BIT__
. И лучшеstatic_assert
, причём в какой-нибудь одной единице трансляции, а не во всех методах.- Не надо в ассёртах писать
[]
, он и так говорит точную строчку файла. Или нет? - Не надо писать
CHAR_BIT - 1
, пишите7
. - Тесты
- Не надо выводить ничего на экран в тестах.
- Лучше не шестнадцатеричные значения, а двоичные:
0b1100'1010
- Неконсистентное наличие/отсутствие пробелов между
TEST_CASE
и(
HuffmanCLI
std::string result{}
— тут{}
лишние- Лишние конвертации в
string_view
,==
и так работает.
Huffman
readlData
— опечатка.- Раз уж знаете про
char_traits
, то иint32_t
— не то, что возвращаетget()
.
HuffmanNode
- Код
(!_left && _right) || (!_right && _left)
не соотносится сboth children have to be null or no null pointer
- Код
HuffmanTree
- Странное отсутствие пустой строки в
.cpp
междуtestGetForest()
иdebugPrintFreqs()
- Лучше не
> 1
, а>= 2
, чтобы было похоже на2
из вложенного цикла. - По умолчанию цикл всё-таки по
int
, а не поsize_t
. makeCodes
зря принимаетconst unique_ptr<>&
- Странное отсутствие пустой строки в
- Вы пытаетесь упихнуть всё в 80 символов, забить. Хотя бы 120.
comment:8 Changed 4 years ago by
Owner: | changed from Filippov Denis to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
Проверялась ревизия 3876.
Корректность 3/9
Test failed -- expected compressed data to be no longer than source data, got 257 > 256
(тут смотрим на сжатые данные без учёта дополнительных)Test failed -- invalid compressed size reported: 2304 instead of 2305
Тесты 1/8
Архитектура 3/5
HuffmanCLI
приниципиально не отличается отmain
. Например, вы не можете протестировать парсинг аргументов.HuffmanException
runtime_error
/logic_error` и не надо перереализовывать руками.HuffmanNode
приватен дляHuffmanTree
HuffmanTree
updateFreqs
не имеет никакого отношения к дереву Хаффмана. Конструктор от строчки тоже странный (к тому же он должен быть отstring_view
).buildCodes
должен возвращать значение, иначе неясна семантика случая "передали непустойarray
".HuffmanArchiver
не должен ничего выводить на экран никогда. Что делать с посчитанной статистикой — вопрос кmain
. Никогда не прибивайте потоки ввода-вывода гвоздями.Стиль 6/8
CLI
#include
HuffmanException
определён вCLI.cpp
, но объявлен черт-те где.cmd
— это ужас.Stream
pushBitsByte()
, а ставитьassert
, что пользователь это вызвал. Всё-таки это какое-то очень нетривиальное действие.pushBitsByte
—flush()
MAX_BIT_POS
лесом, содержательнее будет поставитьassert(CHAR_BIT == 8)
int32_t
-->int
HuffmanNode
getByte() noexcept
assert
изisLeaf
должен быть в конструкторе на самом деле. Заодно исчезнут аналогичные assert'ы из прочих мест.HuffmanTree
collapce
-->collapse
. Или вообщеbuildTree()
? Я не понял разницы.rotate
вызвать. Илиemplace
явный вместоemplace_back
. Циклfor
по индексам явно лишний.getFreqsArray
— хватитauto&
, незачем->
printFreqs()
нужен для отладки? ТогдаdebugPrintFreqs()
HuffmanArchiver
eof()
, проверяйте возвращаемое значение функции чтения. И [мойте тарелки перед едой](http://blog.algoprog.ru/init-not-clear/).ADDITIONAL_INFO_SIZE
незачем делать константой. Точно не хватаетassert
'а на то, что она посчитана правильно.