null [re: spec#]
Nick Sabalausky
a at a.a
Sat Nov 6 23:54:24 PDT 2010
"Nick Sabalausky" <a at a.a> wrote in message
news:ib5ht0$2uff$1 at digitalmars.com...
> "Walter Bright" <newshound2 at digitalmars.com> wrote in message
> news:ib5bue$2ldp$1 at digitalmars.com...
>> Jonathan M Davis wrote:
>>> Going C# or Java's route forces the programmer to initialize variables
>>> even in cases where they know that it's not necessary (which is annoying
>>> but may or may not be worth it),
>>
>> Correct. It's not that doing flow analysis is hard, it's that it's
>> impossible to do it correctly. So you wind up with wishy-washy messages
>> that p "might not" be initialized, which is what the Java compiler does
>> for this:
>>
>> class A
>> {
>> public void foo()
>> {
>> Object p;
>> if (m)
>> p = new Object();
>> if (m)
>> p.toString(); // <-- p might not have been initialized
>> }
>> boolean m;
>> }
>>
>> It even errors out if you write it as:
>>
>> class A
>> {
>> public void foo()
>> {
>> Object p;
>> if (m)
>> p = new Object();
>> if (p != null) // <-- p might not have been initialized
>> p.toString();
>> }
>> boolean m;
>> }
>>
>> Note that the error message is on the null check!
>
> Since when should crap like that ever be written in the first place? In a
> code review, I'd slap both of those with a giant red "convoluted" stamp,
> *especially* if it's not just a trivial example like those.
>
> Besides, I'd much rather have easily-fixable false positives like that
> then the false negatives D gets now:
>
> Object p;
> if (m)
> p = new Object();
> p.toString(); // Boom!, but *only* at run-time, and *only* if m just
> happens to be true.
>
> Plus, as I've argued before, I *wouldn't* want perfect flow analysis on
> that, I'd rather have easily-rememberable rules. If the
> initialization-safety of your code is dependent on complex logic, then
> you've written it wrong anyway.
>
> In simple examples like yours above, the fixes are not only obvious, but
> much more clear:
>
> Object p;
> if (m)
> {
> p = new Object();
> p.toString();
> }
>
> And in more complex cases, relying on complex logic to ensure things are
> inited properly is just wrong anyway, as I said above. Seriously, this
> whole "feature" amounts to nothing more than allowing the following
> *broken* code to occasionally get overlooked...
>
> Object p;
> if (m)
> p = new Object();
> p.toString();
>
> ...just for the completely non-existent "convenience" of writing crap like
> this...
>
> Object p;
> if (m)
> p = new Object();
> if (m)
> p.toString();
>
> ...instead of just doing it right:
>
> Object p;
> if (m)
> {
> p = new Object();
> p.toString();
> }
>
> You can label C#-style init-checking "wishy-washy" all you want, but
> that's still a hell of a lot better than "wrong", which is what D does (as
> evidenced by my first example above).
>
Additionally, the root problem with default values is that they make
deliberately-default-inited declarations and accidentally-uninited
declarations completely indistinguishable by both the compiler and the
programmer.
(And no, "accidentally-uninited" does *not* imply "undefined value". If
something's supposed be inited to X and it gets inited to Y, that's still
*wrong* - *even* if it's reproducibly-wrong.)
More information about the Digitalmars-d
mailing list