=0 && !m_bDumping); программиста, который support’ит код, надолго приводит в ступор, поскольку ему …" /> =0 && !m_bDumping); программиста, который support’ит код, надолго приводит в ступор, поскольку ему …" />

Понятные assert’ы Jan 12, 2008

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

Не далее как в пятницу, состоялась беседа, что

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 при этом понятен и не требует мозголомного осмысления.