guard clause style static if

kdevel kdevel at vogtner.de
Sat Jul 7 12:40:52 UTC 2018


On Saturday, 7 July 2018 at 11:56:40 UTC, rikki cattermole wrote:
> On 07/07/2018 11:44 PM, kdevel wrote:
>> On Saturday, 7 July 2018 at 11:29:35 UTC, rikki cattermole 
>> wrote:
>>>>        static if (args.length == 0)
>>>>           return;
>>>
>>> else {
>>>
>>>>
>>>>        writeln (args [0]);
>>>>        return bar (args [1 .. $]);
>>>
>>> }
>> 
>> That's not guard clause style [1][2].
>> 
>> [1] 
>> https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
>> 
>> [2] http://wiki.c2.com/?GuardClause
>
> Neither was your original example.

My example was

    void bar (T ...) (T args)
    {
       static if (args.length == 0) // 3
          return;                   // 4

       writeln (args [0]);
       return bar (args [1 .. $]);
    }

The guard clause is in lines 3 and 4.

> "A method has conditional behavior that does not make clear 
> what the normal path of execution is"

In my example one immediately spots the "normal path of 
execution". Your
proposal

    void bar (T ...) (T args)
    {
       static if (args.length == 0)
          return;
       else {
         writeln (args [0]);
         return bar (args [1 .. $]);
       }
    }

leads to unreadable arrow code [3].

>    void bar (T ...) (T args) if (T.length == 0)
>    {
>       return;
>[removed]
>    }
>
>    void bar (T ...) (T args) if (T.length > 0)
>    {
>       writeln (args [0]);
>       return bar (args [1 .. $]);
>    }

Interesting alternative but using template constraints introduces 
code repetition: If you want to add another special case, say 
length == 4, you have to repeat the logical complement in the 
"else" branch:

     void bar (T ...) (T args) if (T.length == 0)
     {
        return;
     }

     void bar (T ...) (T args) if (T.length == 4)
     {
     // some code
     }

     void bar (T ...) (T args) if (T.length > 0 && T.length != 4)
     {
        writeln (args [0]);
        return bar (args [1 .. $]);
     }

[3] https://blog.codinghorror.com/flattening-arrow-code/


More information about the Digitalmars-d-learn mailing list