Destroyed 0002
I'm blogging my way through Gary Bernhardt's excellent Destroy All Software series of screencasts. If you write software, you should probably go buy it today.
Episode 0002 of Destroy All Software talks about nil
in Ruby. I’m not a
Rubyist. I may be someday, but I’m not today, so I just imagined he was talking
about None
in Python with weird syntax. This episode is really how returning a
nil
value can lead to exceptions that are miles away from where they
actually originated. Gary demonstrates this with a little Rails app, and I
found myself nodding along: I see this with some frequency in the
Eventbrite codebase, where a domain model’s property is set to None
, and
at a later point other code tries to call a method on that value.
You can, of course, write your own property descriptor (in Python) that checks
for None
and raises an exception when that value is set. At least then the
error is localized to when it’s really being set to (or returning) None
. But
what you really want is to avoid the error altogether. Gary shows a couple ways
to potentially do that, including inverting the relationship between domain
models, and introducing a new model instead of just setting a property on an
existing one.