Today’s task: extract a compound conditional.
This is best explained in a live-coding, video format. Fortunately, I have just the thing!
Please watch the first 5 minutes of this video: https://www.youtube.com/watch?v=0rsilnpU1DU&t=13s
The linked video is a sample of a course I created recently, and it contains my best explanation of how and why to extract compound conditionals.
Again, you only need to watch until 4:58.
For those of you that truly hate video, here’s a brief text version:
Compound conditionals look like this:
if foo && bar ... end
if foo || bar ... end
Your language might write these slightly differently, but the essential bit is that you have a conditional whose truth depends on the truth of two components combined with a boolean logic operator.
I’ve found that extracting these compound conditionals into a named method almost always improves the code.
In abstract terms, that looks like this:
if foo && bar ... end
if higher_level_concept? ... end def higher_level_concept? foo && bar end
And here’s a concrete example:
if user_created_account_today? && user_has_unconfirmed_email? prevent_user_from_posting end
if user_has_high_spam_risk? prevent_user_from_posting end private def user_has_high_spam_risk? user_created_account_today? && user_has_unconfirmed_email? end
I prefer the second version because it’s more explicit. It takes an implicit idea: “users with new accounts and unconfirmed emails are more likely to post spam” and makes it explicit in the code. This is usually a big win, since it means there is more information in the code, and less that exists only in developers’ heads.
Again, there’s even more useful info in the video https://www.youtube.com/watch?v=0rsilnpU1DU&t=13s , and it’s only 5 minutes, so I suggest watching it.
Today’s challenge: find a compound conditional in your code (just grep for && and ||) and try extracting it into a well-named method. Try to make the new method explain a little more about what the compound conditional means at a higher level.
If the new name is a big enough improvement, consider committing/merging/opening a PR. If not, no worries. Just revert and remember this lesson next time you reach for && or ||.