Date: Mon, 13 Apr 2009 10:46:26 +0200 From: deeptech71@gmail.com To: freebsd-chat@freebsd.org Subject: My whitespace style (was: Why?? (prog question)) Message-ID: <49E2FBE2.8020305@gmail.com>
next in thread | raw e-mail | index | archive | help
Tabs are better, because they allow the programmer to specify the
desired width, and is dynamically changable at any time.
Width could be geared towards a purpose, for example: I've read
somewhere that the linux kernel guide recommends 8 characters per tab,
because the distance clearly separates levels, and warns the coder if
statements are nested too deep. So a linux kernel programmer sets the
tab with to 8, while another programmer with a small monitor prefers 4
to see code like "if(..) { if(..) { if(..) { if(..) { if(..) { if(..) {
...". This is all possible without text processing programs that convert
indentation sizes required if the code were hard-indented with spaces.
Tabs are to be considered non-constant in width. Specifically they
should be used for and only for indentation.
So here's my style. First, a display with a tab-size of 8. The arrows
("------->") denote tabs.
struct datatype {
------->int field_one; // this is the ...
------->int field_two; // this contains ...
------->
------->long long int field_three; // and this one is used for ...
------->long long int field_four; // this one is useless
};
void function( int x )
{
------->if( x > 1234567891011121314 ) {
------->------->do_something();
------->------->do_something_else();
------->}
------->else {
------->------->do_something_else();
------->------->do_something();
------->}
------->
------->assert( c89_is_outdated );
------->
------->struct datatype data;
------->
------->while( check_me_first() && then_check_me() ||
-------> read(&data) && data.field_three > x )
------->{
------->------->do_something();
------->------->x = x + 2*x + 4*x*x + 5*x*x*x + 5*x*x*x*x
------->-------> + x*x*x*x*x*x - 9*x*x*x*x*x*x*x;
------->}
}
The same code with 4 spaces per tab:
struct datatype {
--->int field_one; // this is the ...
--->int field_two; // this contains ...
--->
--->long long int field_three; // and this one is used for ...
--->long long int field_four; // this one is useless
};
void function( int x )
{
--->if( x > 1234567891011121314 ) {
--->--->do_something();
--->--->do_something_else();
--->}
--->else {
--->--->do_something_else();
--->--->do_something();
--->}
--->
--->assert( c89_is_outdated );
--->
--->struct datatype data;
--->
--->while( check_me_first() && then_check_me() ||
---> read(&data) && data.field_three > x )
--->{
--->--->do_something();
--->--->x = x + 2*x + 4*x*x + 5*x*x*x + 5*x*x*x*x
--->---> + x*x*x*x*x*x - 9*x*x*x*x*x*x*x;
--->}
}
For every left curly brace, the indentation increases, as the number of
tabs on a line. But take a look at the loop: It has level 1 nesting, but
the condition is as long as 2 lines. The second line of the condition is
indented properly by 1 tab, and is polished a bit by spaces. Finally, I
find it more readable to put the left curly brace on a new line for such
long conditions.
I like the idea of writing appropriate amount of tabs for empty lines
too, it could possibly make a diff output readable (note even the
additional spaces in the empty line of the struct definition). Although
I haven't used it in practice.
On a side note, I use spaces inside the outermost parentheses, but not
in the deeper ones.
I rarely write "} else {" on one line.
Everything else I can think of is based on opinion and good looks.
Finally, another possible definition of the struct:
struct datatype {
------->int field_one; ------->// this is the ...
------->int field_two; ------->// this contains ...
-------> ------->
------->long long int field_three;------->// and this one is used for ...
------->long long int field_four; ------->// this one is useless
};
Elastic tabstops look cool, they are just what I need.
I'm open to critics.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49E2FBE2.8020305>
