Chapter 4. Structure
It’s a trap!
Admiral Ackbar
Let’s move on into questions of structure and how you can hurt your future self with tangled logic and deep coupling. These structural problems impact your ability to change or reuse your code as its requirements inevitably change.
Pathological If/Elif Blocks
This anti-pattern arises when you get into the business of creating a “one-stop shop” function that has to contend with many special cases.
The first if/else block
arrives innocently,
and even the first elif
doesn’t seem so bad.
But soon their friends
arrive:
defdo_awesome_stuff():...ifthing.has_condition_one():...elifthing.has_condition_two():...elifthing.get_conditions()in['conditon3','condition4']:...elifthing.has_condition_forty_two():...else:......
Suddenly you find yourself with
hundreds of lines of elifs.
And good luck if any of
the contents of those blocks
is at all complicated—anyone reading this code
will be fortunate
if they even remember
they’re in this elif nightmare
after 30 or 40 lines.
And how excited will you be
to write tests for this function?
This has a kind of momentum as well—special cases tend to attract
more special cases,
as if drawn together gravitationally.
Just adding more elifs
feels easier than cleaning up.
Except cleaning up isn’t so bad.
If we really do need to manage
many special cases,
we can employ the Strategy pattern:
defstrategy1():...defstrategy2():...strategies={'condition1':strategy1,'condition2':
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access