So, to be more specific, here is one of cases where it actually caused trouble in practice. Someone has originally written code that looked roughly like this:

while (something)
{
    // ...
    auto str = format("%s", parser.node);
}

Long time later I have been adding trace logs to that module and this has become akin to

while (something)
{
    log(parser.node);
    // ...
    auto str = format("%s", parser.node);
}

Which resulted in broken application. It took almost an hour to bisect all changed to trace the failure to this specifc line and realize that `parser.node` wasn't just trivial getter but method which actually advanced internal iterator to next node while returning current one.

In Java many people would have done this instead:

while (something)
{
    log(parser.getNode());
    // ...
    String str = format("%s", parser.getNode());
}

Because trivial accessors are everywhere in Java one usually has to assume it has no side-effects. I fail to see the relevance of the missing () in your example; () doesn't scream side-effect in C++/Java/C#/C. The real issue here is that 'node' or 'getNode' is simply poorly named suggesting it has no side-effects. 'nextNode' for instance doesn't have this problem.

Reply via email to