[geos-devel] Why empty LineString should return a null pointer from getCoordiante()

strk at refractions.net strk at refractions.net
Fri Mar 31 05:17:08 EST 2006


+1 on returning NULL.
Again, this is part of the *HUGE* exposed API :)

--strk;

On Fri, Mar 31, 2006 at 05:01:52AM +0200, Mateusz Å?oskot wrote:
> Hi,
> 
> Please, forgive me that I'm annoying with all those recent questions but
> I really would like to understand GEOS internals.
> 
> 
> Here is getCoordinate:
> 
> const Coordinate* LineString::getCoordinate() const
> {
>    // should use auto_ptr here or return NULL or throw an exception !
>    // 	--strk;
>    if (isEmpty())
>       return(new Coordinate());
> 
>    return &(points->getAt(0));
> }
> 
> as you see, there is Sandro's comment about what could be best.
> I think it's time to answer this question :-)
> 
> For comparison and reference, here is JTS' version of this function:
> 
> public Coordinate getCoordinate()
> {
>    if (isEmpty()) return null;
>    return points.getCoordinate(0);
> }
> 
> Here are my comments to current solution:
> 1. Returning newly allocated Coordinate is confusing and will cause
> problems that user won't free the memory
> 
> 2. This brokes the logic because how empty linestring can return any
> Coordinate? This does not make any sense.
> 
> 
> Here are my comments to possible solution:
> 
> 1. auto_ptr will not solve the problem because it won't fix broken logic
> will
> 
> 2. My suggestion is to return *null pointer*
> 
> As you can see above, JTS version returns null reference.
> 
> What is Java null reference (a pointer to nothing)?
> It is a reference that does not refer to any instance of any type.
> 
> What we can do with Java null reference?
> null reference can be safely compared with other references (null or not
> null), null reference can be safely passed to the function, returned
> from function, null reference can be safely assigned to the existing
> reference etc.
> What we can not do with null reference is dereferencing, e.g.:
> 
> Type x = null;
> x.Fire(); // BUM!
> 
> Now, how to transit this Javism to C++. It's very simple - just use null
> pointer.
> 
> What is null pointer in C++?
> Null pointer is a *valid* pointer value that doesn’t point to anything.
> Just as null reference in Java.
> 
> Similarly, with null pointers in C++ we can do (almost) the same as what
> we can do with Java null reference.
> 
> The only thin that can not be done with C++ null pointer is
> dereferencing. Dereferencing null pointer causes undefined behavior
> This rule applies to every pointer that does not point to point to anything.
> 
> What I'd like to repeat is that "null pointer is a *valid* pointer",
> but not invalid. Invalid pointer is another category and *any* use of
> invalid pointer causes Undefined Behaviour, even comparing, etc.
> 
> So, I vote for returning null pointer.
> 
> 3. Throwing an exception is a bad idea
> 
> Exceptions should be used for unexpected situations but when user is
> asking object for coordinate he is aware that the object may or may not
> include any coordinates. So, there is no unexpected behaviour here.
> 
> 
> BTW, I'm really sorry if my explanation seems to be like in books of
> seriece "XXX for dummies". This is completely not my intetion!
> Simply, I usualy try to explain my point as clear as possible.
> 
> 
> Cheers
> -- 
> Mateusz Łoskot
> http://mateusz.loskot.net
> _______________________________________________
> geos-devel mailing list
> geos-devel at geos.refractions.net
> http://geos.refractions.net/mailman/listinfo/geos-devel

-- 

 /"\    ASCII Ribbon Campaign
 \ /    Respect for low technology.
  X     Keep e-mail messages readable by any computer system.
 / \    Keep it ASCII. 




More information about the geos-devel mailing list