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:
for item in sequence: if is_valid(item): if not is_inconsequential(item): item.do_something()
Becomes:
for item in sequence: if not is_valid(item): continue if is_inconsequential(item): continue item.do_something()
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:
for item in sequence: for widget in item: for pixel in bitmap: pixel.align() pixel.darken() pixel.draw()
becomes:
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()
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.