Opened 4 years ago
Last modified 4 years ago
#930 assigned ожидается проверка
HW #3
Reported by: | abramov.nikita | Owned by: | Egor Suvorov |
---|---|---|---|
Component: | HW #3 (Huffman) | Version: | 3.0 |
Keywords: | Cc: |
Description
Пока что реализовано только дерево Хаффмана
Change History (6)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 4 years ago by
Owner: | changed from Egor Suvorov to abramov.nikita |
---|---|
Type: | ожидается проверка → ожидаются исправления |
/
Проверялась ревизия 4014 или ранее.
Третья попытка разблокирована.
Корректность 7/9
- Не поддерживается флаг
--output
- Файлы не открываются в бинарном режиме => не работает под Windows.
Тесты 4.5/8
- Не протестирован парсинг аргументов.
- Вместо ручной проверки
.size()
и[0]
лучше сделайте== vector<bool>{0, 1, 0, 1, 0}
- Проверьте, пожалуйста, точные коды построенных символов. Сейчас у вас префиксность не проверяется.
- Лучше тестировать не при помощи чтения из
stringstream
, а сравнениемstr()
с заготовленным массивом/вектором при помощи==
и конструкторомstring(first, last)
. - Не протестирован битовый ввод-вывод в отрыве от всего остального.
Архитектура 2.5/5 (основная проблема выделена полужирным)
- Не хватает
namespaces
дляbin_manip
иCLI
. Хотя бы дляMODE
, режимов очень много разных. А лучше во всех файлах как-то разделить. CLI
ArgParseException
- Лучше отнаследовать от
logic_error
/runtime_error, тогда реализация займёт пару строк из-за
using`. - Не выполняется правило пяти.
- Не используйте
throw()
, максимумnoexcept()
.
- Лучше отнаследовать от
CLI::get_file()
— не самая удачная идея, надо запоминать, какой файл где. Плюс это скорееget_files()
. Лучше отдельный геттер.
Huffman
HuffmanNode
- Не выполнено правило пяти. Прям совсем.
- Конструктор по умолчанию не нужен. И тест совершенно не проясняет, зачем он добавлен.
HuffmanTree
get_min_node
— вообще не метод, а приватная функция дляHuffman.cpp
.get_codes
лучше возвращать по константной ссылке.
HuffmanArchiver
HuffmanStat
- Не
print()
, аoperator<<
.cout
ничем не знаменит.
- Не
HuffmanArchiver
- Много за что отвечает: и подсчёт количества символов, и форматирование таблицы, и сжатие/разжатие. Это видно по количеству приватных методов.
- В частности,
read_table
/write_table
— не методы, а свободные функции. А судя по тому, что они делают — это вообще методы отдельной сущности "таблица частот".
main
- Зачем-то делает кусок работы
CLI
, проверяя количество аргументов.
- Зачем-то делает кусок работы
Стиль 3/8 (полужирным выделены адские замечания, каждое само по себе на -1)
Makefile
— жесть. Лучше переписать на CMake или хотя бы воспользоваться переменными, чтобы не приходилось руками заменятьg++
наclang++-10 -stdlib=libc++
и/или добавлять-fsanitize=address
bit_manip
- ОБЪЯВЛЯЙТЕ ПЕРЕМЕННЫЕ В ЦИКЛЕ (много где актуально).
- НЕ ИСПОЛЬЗУЙТЕ C-STYLE CAST.
- Не
basic_ostream<char>
, аostream
. - Незачем лишний уровень индирекции в
write_le_int32
/read_le_int32
— там можно сразу сделатьfriend operator<<
без промежуточного()
. - Не хватает заголовка для
int32_t
- Один из операторов почему-то принимает манипулятор по значению, а не по ссылке.
CLI
u
/c
— плохие названия для режима.ArgParseException
- неэффективно копирут себе
std::string
: принимайте по значению и делайтеmove
. - Должен быть
final
и много гдеnoexcept
- неэффективно копирут себе
CLI
- Возврат копии
std::string
— неnoexcept
, возможны исключения MODE
-->Mode
.- Переменная
size_t i
должна быть объявлена внутри цикла. А цикл должен бытьfor
. - Не надо проверять количество аргументов и вываливаться с непонятной ошибкой "мало аргументов", а честно пробегаться по ним и проверять, чего не хватает. Вы в любом случае это делаете, так что просто убираем лишний if.
- Не
strcmp
, а просто==
, раз ужstd::string
. - Не надо пытаться открывать файл для чтения прямо в парсинге аргументов. У вас всё равно может возникнуть проблема с открытием файла чуть попозже, только так вы этот путь кода замаскируете.
- Нехорошо, что не проверяется, что аргументы корректны (нет дубликатов и противоречий).
- Возврат копии
Huffman
- Не
<limits.h>
, а<climits>
HuffmanNode
- Используйте member initialization list, а не присваивания.
- Странная расстановка пустых строк в зщаголовке.
get_left
/get_right
— noexcept, равно как и конструкторы.
HuffmanTree
get_min_node
-->extract_min_node
.get_codes_from_tree
: очень странный инвариант из-за лишнего параметраdirection
. Пусть лучше этим занимается вызывающая сторона. Заодно можно будет соптимизировать и не копировать каждый разcurrent_code
. Всё равно этот метод скрыт в публичной обёртке.- Методы объявляются в
.cpp
и в.h
в разном порядке. - Счётчик цикла по умолчанию —
int
, а неuint32_t
- А что происходит, если дерево всё-таки пустое? Сейчас ощущение, что ошибка заглушается.
- Переменная
new_node
не нужна. - Есть странная пустая строка после
if (!root_->is_leaf()) {
- А ещё там же очень странно, что вообще приходится какие-то случаи разбирать. Такие же разбираются внутри
get_codes_from_tree
.
- Не
HuffmanArchiver
HuffmanStat
start_size
/end_size
— странные названия.input
/output
лучше.
HuffmanArchiver
- Поле лучше инициализировать при помощи
{}
, а неFoo x = Foo(....)
numb_of_elem
— непонятное название. Может, "длина закодированного/декодированного текста в символах" или что-то покороче?- Раз уж разбираете крайний случай "пустой файл", можно и таблицу не выводить.
write_orig_text
/write_compress_text
— дико странные названия.- А ещё эти две функции выглядят очень жутко: состояние из шести переменных, названия
i
/j
/ch
/ch1
, сишный лапшекод. Даже не хочу читать.
- Поле лучше инициализировать при помощи
- В тестах
- Не переиспользуйте переменные в тестах.
tmp_out
/res_out
— есть гораздо более подходящие названия. Например, что именно содержится вtmp_out
?
main
- Ловите исключения по константной ссылке
- Не
open
, а вызов конструктора.
comment:5 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:6 Changed 4 years ago by
Owner: | changed from abramov.nikita to Egor Suvorov |
---|
Тикет потерялся.
Note: See
TracTickets for help on using
tickets.
Проверялась ревизия 3875.
Корректность 0/9 из-за отсутствия
main
Тесты 0/8
Архитектура 1/5
CLI
HuffmanArchiver
compress
/extract
публичных методов тут быть не должно.read_table
принимаетostream
, как иwrite_table
write_text
приниматьint32_t
.int32_t
,uint32_t
,int
ровно один тип на каждый случай (а лучше просто один) и исползуйте. Сейчас рандом какой-то. Аналогично сchar
/uint8_t
/int8_t
.Huffman
explicit
, класс —final
, нужныnoexcept
.std::string symbol
— оксюморон.std::optional<char>
?HuffmanNode
— используйте правило нуля.HuffmanTree
: странныйif (size == 1)
без пояснений.Стиль 1/8 (мало корректности, чтобы ставить больше за стиль)
basic_istream
/basic_ostream
, аistream
/ostream
HuffmanArchiver
. Исчезнутassert(in && out);
.int32_t
, а простоint
.ASCII_MAX
— это не ASCII ни разу. ASCII — от 0 до 127. А ещё это не про ASCII на самом деле, а про какое-то свойство вашего алгоритма Хаффмана. Если очень хочется обобщать, то используйте стандартныйCHAR_BIT
, который на всех разумных системах равен 8. Или поставьте один разstatic_assert(CHAR_BIT == 8)
и дальше везде 8, 256.write_table
: тут можно не заводить переменнуюc
, простоstatic_cast
в нужных местах.unique_ptr
не требуется, он и такnullptr
.get_left
/get_right
пусть лучше возвращают ссылки.const unique_ptr<>&
бесполезен и является лишним ограничением на возвращаемое значение.less_compare
— less compare что?get_codes_from_tree
— снова не нуженunique_ptr
. И это, часом, не метод вершины?queue_
— не поле, используется отлько в конструкторе.HuffmanNode
.HuffmanTree
написано дублирование кодаget_codes_from_tree
.