morinim / vita

Vita - Genetic Programming Framework
Mozilla Public License 2.0
35 stars 6 forks source link

Clean up code checking class invariants #28

Closed morinim closed 4 years ago

morinim commented 4 years ago

Classes should specify their invariants: what is true before and after executing any public method.

References:

morinim commented 4 years ago

The debug()/is_valid() method should exist only in the debug build, thus it does not add to code bloat.

It's handy to have the is_valid() method when compiling a unit test in release mode.

So the is_valid() method should be:

  1. called only in debug builds;
  2. available in release builds for unit testing.

1

is_valid() is used only together with macros Ensures, Expects, assert so it's not called in release builds.

2

Since only the first virtual function in a class increases its size (compiler-dependent, but on most - if not all - it's like this) and non-virtual functions don't affect the class size, it's not worth cluttering the source with code like:

#if !defined(NDEBUG) \
    || (defined(DOCTEST_LIBRARY_INCLUDED) && !defined DOCTEST_CONFIG_DISABLE)
#  define VITA_DEBUG_OR_TEST
#endif

class A
{
  // ...

#if defined(VITA_DEBUG_OR_TEST)
  bool is_valid() const;
#endif
};

#if defined(VITA_DEBUG_OR_TEST)
bool A::is_valid()
{
  // ...
}
#endif