Иво качи първо решение на 02.12.2019 18:34 (преди почти 6 години)
Кода е ок, макар че можеше да посъкратиш някои неща. На някои места си изпуснал и някои детайли, може да пробваш да ги дебъгнеш с пълния комплект тестове.
Compiling solution v0.1.0 (/tmp/d20200111-2173579-g8l1z7/solution)
Finished test [unoptimized + debuginfo] target(s) in 3.66s
Running target/debug/deps/solution-a73e64ec87929bd0
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-38971695424b36d5
running 15 tests
test solution_test::test_construct_packet_from_unicode ... ok
test solution_test::test_construct_packet_no_remainder ... ok
test solution_test::test_construct_packet_with_remainder ... ok
test solution_test::test_construct_packet_with_remainder_cyrillic ... ok
test solution_test::test_consuming_packets ... ok
test solution_test::test_deserialize_invalid_packet ... FAILED
test solution_test::test_deserialize_packet ... ok
test solution_test::test_deserialize_unicode_packet ... ok
test solution_test::test_full_roundtrip ... ok
test solution_test::test_full_roundtrip_for_zero_size_string ... thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidPacket', src/libcore/result.rs:1165:5
FAILED
test solution_test::test_invalid_packet_combination ... thread '<unnamed>' panicked at 'Expression Err(InvalidPacket) does not match the pattern "Err(PacketError::CorruptedMessage)"', tests/solution_test.rs:239:9
FAILED
test solution_test::test_iterating_packets ... ok
test solution_test::test_iterating_packets_for_zero_size_string ... ok
test solution_test::test_serialize_packet ... ok
test solution_test::test_zero_size ... ok
failures:
---- solution_test::test_deserialize_invalid_packet stdout ----
thread 'main' panicked at 'index 102 out of range for slice of length 9', src/libcore/slice/mod.rs:2664:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
---- solution_test::test_full_roundtrip_for_zero_size_string stdout ----
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidPacket', tests/solution_test.rs:221:5
---- solution_test::test_invalid_packet_combination stdout ----
thread 'main' panicked at 'Expression Err(InvalidPacket) does not match the pattern "Err(PacketError::CorruptedMessage)"', tests/solution_test.rs:232:5
failures:
solution_test::test_deserialize_invalid_packet
solution_test::test_full_roundtrip_for_zero_size_string
solution_test::test_invalid_packet_combination
test result: FAILED. 12 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
Кода е ок, макар че можеше да посъкратиш някои неща. На някои места си изпуснал и някои детайли, може да пробваш да ги дебъгнеш с пълния комплект тестове.
Можеше да унифицираш двата клона на if-клаузата като предефинираш променливата
sizeда е правилното нещо.Тук не си проверил дали
payload_sizeе число, което има смисъл да индексираш с него. Теста, който фейлва, просто ти слага числото 100 в размера, и ти директно индексираш 102 малко по-долу, без да провериш дали е възможно :).Иначе, тук този
unwrapработи, понеже си сложил проверка по-горе за размера, но предвид, че функцията връщаResult, спокойно можеш да избегнеш началната проверка за минимален размер и да кажеш тукbytes.get(1).ok_or_else(|| PacketError::InvalidPacket)?. Малко по-дълго е, но пък си сигурен за себе си, че този код няма да panic-не ако не си домислил нещо.Няма нужда payload-а да бъде валиден низ. Комбинацията от payload-ове се очаква да бъде, и то само в случая, когато сериализираме и десериализираме низ, но когато говорим за индивидуални пакети, работим само с байтове. Така че тази проверка вероятно ти е fail-нала няколко теста.
Вероятно можеше да съкратиш този код, като извлечеш последния аргумент като примерно
remainderи да имаш само едно място, на което връщаш последнияOk. Можеше и малко да съкратиш самата структура,payload_size: payload_sizeпримерно може синтактично да се напише простоpayload_size, понеже името на променливата и името на ключа са едни и същи.Не би трябвало да ти е нужно тук да ползваш
&(pack), вероятно щеше да сработи и съсpack.serialize()-- rust автоматично взема референции в зависимост от сигнатурата на функцията.