Reading healthy code should be as easy as reading a book in your native language. You shouldn’t have to stop and puzzle over what a line of code is doing. One small trick that can assist with this is to make boolean checks about something positive rather than about something negative.
Here’s an extreme example:
if not nodisable_kryponite_shield: devise_clever_escape_plan() else: engage_in_epic_battle() |
What does that code do? Sure, you can figure it out, but healthy code is not a puzzle, it’s a simple communication. Let’s look at two principles we can use to simplify this code.
1. Name your flags and variables in such a way that they represent the positive check you wish to make (the presence of something, something being enabled, something being true) rather than the negative check you wish to make (the absence of something, something being disabled, something being false).
if not enable_kryponite_shield: devise_clever_escape_plan() else: engage_in_epic_battle() |
That is already easier to read and understand than the first example.
2. If your conditional looks like “if not … else …” then reverse it to put the positive case first.
if enable_kryponite_shield: engage_in_epic_battle() else: devise_clever_escape_plan() |
Now the intention of the code is immediately obvious.
There are many other contexts in which this gives improvements to readability. For example, the command foo --disable_feature=False is harder to read and think about than
foo --enable_feature=True, particularly when you change the default to enable the feature.
There are some exceptions (for example, in Python, if foo is not None could be considered a “positive check” even though it has a “not” in it), but in general checking the presence or absence of a positive is simpler for readers to understand than checking the presence or absence of a negative.