Final by default?

Walter Bright newshound2 at digitalmars.com
Thu Mar 13 15:43:36 PDT 2014


On 3/13/2014 3:21 PM, Timon Gehr wrote:
> On 03/13/2014 02:32 PM, Steven Schveighoffer wrote:
>>
>> The one I would really like to see is logical OR. There is no easy way
>> around this, one must come up with convoluted mechanisms that are much
>> harder to design, write, and understand than just version(x || y)
>
> version(A) version=AorB;
> version(B) version=AorB;
> version(AorB){ }
>

If you're writing things like that, it's still missing the point. The point is 
not to find workarounds, but to rethink just what feature is being version'd on.

For example, suppose it's wrapping a call to SomeWackyFunction:

version (Linux)
     SomeWackyFunction();
else version (OSX)
     SomeWackyFunction();
else
     ... workaround ...

Execrable answer:

     version (Linux) version=LinuxOrOSX;
     version (OSX) version=LinuxOrOSX;
     ...
     version (LinuxOrOSX)
	SomeWackyFunction();
     else
         ... workaround ...

This is execrable because LinuxOrOSX:

1. has no particular relationship to SomeWackyFunction()
2. makes for confusion if LinuxOrOSX is used also to version in other things
3. makes for what do I do if I add in FreeBSD? Rename to LinuxOrOSXOrFreeBSD ? yeech


Better answer:

     version (Linux) version=hasSomeWackyFunction;
     version (OSX) version=hasSomeWackyFunction;
     ...
     version (hasSomeWackyFunction)
	SomeWackyFunction();
     else
         ... workaround ...

At least this is maintainable, though it's clumsy if that code sequence appears 
more than once or, worse, must be replicated in multiple modules.

Even better:

     --------
     import wackyfunctionality;
     ...
     WackyFunction();
     --------
     module wackyfunctionality;

     void WackyFunction() {
         version (Linux)
   	    SomeWackyFunction();
         else version (OSX)
             SomeWackyFunction();
         else
             ... workaround ...
     }
     --------

Simple, maintainable, easy on the eye.




More information about the Digitalmars-d mailing list