Tips For Lowering Indention Levels

Linus Torvalds, the creator of linux, sets his tabs/indentations to 8 spaces. Personally that seems a little wide, but he says some interesting things about why shorter isn’t necessarily better. Me, I’ll stay with 4 because it just looks right. But you still shouldn’t have too many indent levels.

“If you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.” – Linus Torvalds, Linux Kernel Coding Style

Use Continue

Example:
[cc lang=”python”]
for item in sequence:
if is_valid(item):
if not is_inconsequential(item):
item.do_something()
[/cc]
Becomes:
[cc lang=”python”]
for item in sequence:
if not is_valid(item):
continue
if is_inconsequential(item):
continue
item.do_something()
[/cc]

Notice you have to flip the values of your if statements making this change. This only works inside a loop and if your language has continue.

Factor Out A New Method

This is true for a lot of things. As I recently heard if a method starts to get over 10-15 lines it starts to feel like maybe I’m doing something wrong.

If your indents are starting to get deep, maybe some of those sub-levels should just be put in their own routine.

On a python related note, Mr Rhodes points out if you need a new routine and you are in a class, your natural thought is to make a new method on the object. But if you aren’t using self – referring to the object in your new method – you can just make a function. These become easier to test and easier to move.

Factor Out An Iterator

Mr Rhodes says iterators are a Python superpower. I don’t understand python iterators yet and didn’t even understand his example, in the interest of completeness, here’s his example.

Example:
[cc lang=”python”]
for item in sequence:
for widget in item:
for pixel in bitmap:
pixel.align()
pixel.darken()
pixel.draw()
[/cc]

becomes:

[cc lang=”python”]
def widget_pixels(sequence):
for item in sequence:
for widget in item:
for bitmap in widget:
for pixel in bitmap:
yield pixel

for pixel in widget_pixels(sequence):
pixel.align()
pixel.darken()
pixel.draw()
[/cc]

Lastly he talked about going to an argument per line for function calls. I want to write a full post on this idea because it has some cool implications in version control. The short version is once a function call gets to 79 characters, just go right to putting each parameter on its own line.

Source: A Python Aesthetic: Beauty and Why I Python by Brandon Rhodes

Submit a Comment

Your email address will not be published. Required fields are marked *