Daan,
I completely agree that returning null is bad. Not only does it yield a ton of
useless null checks, it creates leaky abstractions by spreading the handling of
the missing case out beyond the boundary of the class/subsystem.
As a big proponent of the Null Object Pattern [1], I really wanted to like
Optional. It is a great concept in functional languages. So, I tried using it
in three (3) different projects since 2011. In all three systems, I would say
that, at best, it was no better than returning null, and, in other cases,
worse. Since Optional.get throws an exception when the wrapped value is null,
all optional accesses must be defensively checked so the code base is littered
with code like the following:
if (value.isPresent()) {
return value.get();
}
So, basically, you end up replacing null checks and NPEs with isPresent checks
and a Guava exception. As a bonus, when exceptions occurred in production, we
had explain the meaning of them. The quickest explanation — “They are the new
NPE”. For all new developers on the projects, we had one more thing to explain
to them which, again, was asking them to do something differently with no added
value. Based on these experiences, I prefer null checks to optional.
While it is more effort (i.e. more code), I have gone back to using the Null
Object Pattern implemented in this manner [2]. Not only does this approach
avoid NPEs, it also explicitly defines the behavior for the missing case. For
more complex examples, it can be unit tested to ensure the missing case behaves
as expected.
Thanks,
-John
[1]: https://en.wikipedia.org/wiki/Null_Object_pattern
[2]: https://gist.github.com/jburwell/f5162ad2d2de32c842b3
>
[ShapeBlue]<http://www.shapeblue.com>
John Burwell
ShapeBlue
d: +44 (20) 3603 0542 | s: +1 (571) 403-2411
<tel:+44%20(20)%203603%200542%20|%20s:%20+1%20(571)%20403-2411>
e: [email protected] | t:
<mailto:[email protected]%20|%20t:> | w:
www.shapeblue.com<http://www.shapeblue.com>
a: 53 Chandos Place, Covent Garden London WC2N 4HS UK
[cid:[email protected]]
Shape Blue Ltd is a company incorporated in England & Wales. ShapeBlue Services
India LLP is a company incorporated in India and is operated under license from
Shape Blue Ltd. Shape Blue Brasil Consultoria Ltda is a company incorporated in
Brasil and is operated under license from Shape Blue Ltd. ShapeBlue SA Pty Ltd
is a company registered by The Republic of South Africa and is traded under
license from Shape Blue Ltd. ShapeBlue is a registered trademark.
This email and any attachments to it may be confidential and are intended
solely for the use of the individual to whom it is addressed. Any views or
opinions expressed are solely those of the author and do not necessarily
represent those of Shape Blue Ltd or related companies. If you are not the
intended recipient of this email, you must neither take any action based upon
its contents, nor copy or show it to anyone. Please contact the sender if you
believe you have received this email in error.
On Nov 17, 2015, at 11:16 AM, Daan Hoogland <[email protected]> wrote:
>
> LS,
>
> As a spin off from a discussion in a PR where it is no longer relevant I
> made another PR to show the principle of the use of Optionals[1]
> <https://github.com/apache/cloudstack/pull/1060>
>
> Miguel from Schuberg Philis has been proposing this as replacement of the
> bad practice of returning null in methods and I agree. In seldom cases it
> might be more expedient to throw an exception, most notably when a null is
> returned but no check against is done in the calling method. In those cases
> throwing a CloudRuntimeException would be an easier way to go then the
> pattern in this PR. This is a runtime exception however so maybe creating
> an explicit one is more appropriate in those places.
>
> Anyway I want to propose to move to using the pattern from the PR from now
> on.
>
> [1] https://github.com/apache/cloudstack/pull/1060
>
> thoughts?
> --
> Daan
Find out more about ShapeBlue and our range of CloudStack related services:
IaaS Cloud Design & Build<http://shapeblue.com/iaas-cloud-design-and-build//> |
CSForge – rapid IaaS deployment framework<http://shapeblue.com/csforge/>
CloudStack Consulting<http://shapeblue.com/cloudstack-consultancy/> |
CloudStack Software
Engineering<http://shapeblue.com/cloudstack-software-engineering/>
CloudStack Infrastructure
Support<http://shapeblue.com/cloudstack-infrastructure-support/> | CloudStack
Bootcamp Training Courses<http://shapeblue.com/cloudstack-training/>