понедельник, 1 декабря 2008 г.

Понятные assert'ы

Странное дело, вроде бы этой технике в обед сто лет, а, тем не менее, молодежь (в нашем департаменте) ее не знает...

Не далее как в пятницу, состоялась беседа, что
assert(m_mapping["uuid"].length() && (block[n]&0xFFFE) && index >=0 && !m_bDumping);

программиста, который support'ит код, надолго приводит в ступор, поскольку ему сначала приходится продираться через кучу условий, потом выяснять в каких ситуациях m_bDumping == 0, а потом смотреть - что именно не так, я уже не говорю о том, что условие записано некорректно (m_mapping портится).

Нужно быть проще:
assert(!m_bDumping && "Illegal call in dump mode");
assert(m_mapping.find("uuid") != m_mapping.end() && "uuid attribute can't be omitted since this is the primary key in...");


Ну, вы поняли.... :-)
- проверять одно условие за раз
- давать понятный комментарий, который виден разработчику (если это возможно)
- избегать side-effect'ов (в нашем случае в DEBUG-версии m_mapping будет хранить pair("uuid", ...) всегда, что может приводить к отличиям поведения в RELEASE-версии, если кто-то использует m_mapping.size() ).

Камнем преткновения, как всегда, является психология - очень трудно трактовать указатель как булевское выражение.

Да, согласен, это использование тоже side-effect'ов языка в чистом виде. НО! сам assert при этом понятен и не требует мозголомного осмысления.

Комментариев нет: