Re:Avoid Else, Return Early (2013)
by Merad on Monday March 26, 2018 @01:57PM
(#16680960)
K&R isn't that terrible when code is neat and clean, but it starts to have trouble IMO particularly when declarations or conditions wrap to multiple lines. Compare the following examples... I personally have to stop and read the code to find the blocks with K&R braces, vs being able to see them at a glance with Allman.
[ Parent
| on HN ]
Emacs autoindent to the rescue:
void MyLongMethodName(SomeLongParamType param1, SomeOtherLongParamType param2,
YetAnotherLongParamType param3) {
if (longContrivedVariableName1 == longContrivedVariableName2 &&
longContrivedVariableName1 != longContrivedVariableName3) {
// do stuff
}
}IME the more complex your code formatting, the less likely people are to do it, especially after your code has been touched by dozens of different people with a dozen different editors.
This is why emacs is the One True Editor ;-)
I treat the parentheses the same way I treat the braces:
void MyLongMethodName(
SomeLongParamType param1,
SomeOtherLongParamType param2,
YetAnotherLongParamType param3
) {
if (
longContrivedVariableName1 == longContrivedVariableName2 &&
longContrivedVariableName1 != longContrivedVariableName3
) {
// do stuff
}
}
I also make liberal use of temporary variables: void MyLongMethodName(
SomeLongParamType param1,
SomeOtherLongParamType param2,
YetAnotherLongParamType param3
) {
auto condition1 = longContrivedVariableName1 == longContrivedVariableName2;
auto condition2 = longContrivedVariableName1 != longContrivedVariableName3;
if (condition1 && condition2) {
// do stuff
}
}
Vertical space is allocated to the actual parameters and conditions, and the extra syntax-only lines exist only to separate chunks. This works well with "paragraphs": void MyLongMethodName(
SomeLongParamType param1,
SomeOtherLongParamType param2,
YetAnotherLongParamType param3
) {
auto condition1 = longContrivedVariableName1 == longContrivedVariableName2;
auto condition2 = longContrivedVariableName1 != longContrivedVariableName3;
if (condition1 && condition2) {
// do stuff
}
auto someData = buildSomeData();
doSomethingWith(someData);
while (someCondition) {
// loop
}
finishUp();
return someData;
}