Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#993 closed ожидается проверка (задача сдана)

WW #15

Reported by: Igor Engel Owned by: Egor Suvorov
Component: WW_linq Version: 1.0
Keywords: Cc:

Description


Change History (4)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Igor Engel
Type: ожидается проверкаожидаются исправления

Корректность: 6/7

  • Не хватает инклудов для move, iterator_traits и ещё много чего.

Стиль 1.75/3:

  • Не хватает слов explicit (конструктор и оператор), noexcept, rvalue-ref-qualifier у методов.
  • У Sequence стоит запретить копирование и перемещение — это точно ошибки. Перемещение можно запрещать, начиная с C++17 из-за copy elision.
  • Можно не исправлять: от переименования enumerator --> Sequence решение стало сильно отличаться от выданной заглушки, что усложнило проверку и я её отложил.
  • Реализацию методов Sequence я бы оставил прямо внутри Sequence. Да и у остальных классов тоже. Они очень маленькие, с полями тесно связаны, хочется класс читать целиком. Заодно будет легче следить, что принятие параметров по ссылке/значению — это ровно то, что надо.
  • O=T — пробелы, пожалуйста.
  • В RangeSequence со ссылками сложно. С одной стороны логичнее писать iterator_traits::const_reference (потому что мало ли что внутри итератора лежит), но тогда надо это дело протаскивать через весь Sequence. Например, сделав там параметр не T, а const_reference везде.
  • Вместо if (*this) в operator++ лучше уж assert(*this);
  • UntilSequence::terminated какой-то сложный: он мутируется по сложным условиям и всё равно в operator bool требуется ещё одно условие.

comment:2 Changed 4 years ago by Igor Engel

Owner: changed from Igor Engel to Egor Suvorov
Type: ожидаются исправленияожидается проверка

В лс договаривались о продлении

Вроде добавил, и apple clang и g++ (собранный руками) компилят.

Вроде навесил везде где возможно
Позапрещал
Оставлю пожалуй
Ок
Ок
Ух... Пусть остаётся так...
Ок
Упростил

comment:3 Changed 4 years ago by Egor Suvorov

Resolution: задача сдана
Status: assignedclosed

Корректность 6.2/7:

  • Не хватило инклуда для <cassert>
  • Ещё как минимум не хватает <cstddef> для std::size_t и <vector>. Конкретно у меня это тоже не крэшится, но вообще надо.
  • Можно грепнуть std::. Ещё бывает IWYU. А вообще тут скорее не компилятор нужно перебирать, а стандартные библиотеки. Типа stdlibc++ и libc++, они обычно с компиляторами связаны, правда.

Стиль 2.5/3:

  • bool(x) (functioncal cast expression) --> static_cast<bool>(x), пожалуйста, иначе это C-style-cast, т.е. жуть какая-то
  • RangeSequence::operator++: очень несимметричный if. Вообще лучше всегда писать на разных строчках (иначе плохо читается по диагонали), но тут ещё и скобки неконсистентно расставлены.
  • Итераторы в конструкторе RangeSequence лучше тоже мувать. Они, конечно, не должны быть большие, но код всё-таки обобщённый.
  • if( — пробел.
  • Немного путанный assert(*this) в operator* везде. Он, конечно, по делу, но не всегда ясно, зачем. Например, в DropSequence там скорее assert(input).
    • А в SelectSequence вообще неясно, зачем там связываются *this и cur_value.has_value().

comment:4 Changed 4 years ago by Egor Suvorov

А, кхм, забыл запустить решение. Падает со страшной силой на пустых векторах, например:

linq_tests: ../../../cpp19/engel.igor/lab_15/include/linq.hpp:96: virtual Sequence<linq::impl::RangeSequence::T> &linq::impl::RangeSequence<std::__1::__wrap_iter<int *> >::operator++() [Iter = std::__1::__wrap_iter<int *>]: Assertion `*this' failed.

Это всё-таки не больше 4.5/7 за корректность. То есть 7/10 в сумме, а тогда выгоднее оставить предыдущий балл: 7.75/10.

Note: See TracTickets for help on using tickets.