"if not" condition check (for data validation)

Denis noreply at noserver.lan
Wed Jun 17 23:46:54 UTC 2020


Is there a cleaner way to implement an "if not" condition check?

WHY NOT JUST USE "IF"?

For data validation, code is cleaner and more intelligible if the 
condition being checked is written in an affirmative sense; that 
is, in the same way that `assert` is written. This is especially 
true when `and` and `or` logic is involved. `if` is not a good 
substitute, because it works in the opposite sense, often 
requiring lots of `not`s. As a trivial example:

   assert( configfile.isFile && configfile.extension == ".conf" )
     -vs-
   if ( !configfile.isFile || configfile.extension != ".conf" ) 
<handle it>

An `if` statement can be written in the affirmative sense, by 
using an empty `then` statement + an `else` statement:

   if ( configfile.isFile && configfile.extension == ".conf", 
message ) { }
   else <handle it>

But then the logic intuitively feels wrong for an `if`, because 
the handler is always in the `else`. When there are only a few 
such checks, it might not matter. But when there are a lot of 
checks, the code gets ugly (lots of `else`s) and the clutter adds 
up.

ORIGINAL SOLUTION

The following solution works and the code is very readable. 
However, it has a couple of notable deficiencies.

   void unless(T)(T condition, lazy void func ) {
       if ( !condition ) func(); }
    :
   unless( configfile.isFile && configfile.extension == ".conf", 
handleIt( _ _ ));

The most obvious shortcomings are:
   1. It only works with a handler function. So `continue` and the 
like can't be used, for example.
   2. It is inefficient, adding an extra function call to every 
condition check. Inside a loop, this is cumulative.

A BETTER SOLUTION ???

I haven't been able to come up with another option that is more 
efficient yet doesn't sacrifice readability. I would welcome 
suggestions.

Thanks in advance.
Denis


More information about the Digitalmars-d-learn mailing list