Иво качи първо решение на 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 автоматично взема референции в зависимост от сигнатурата на функцията.