| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- Code convention:
- 1. Use common sense!
- If it looks wrong to humans then it's wrong.
- Don't defeat the purpose of the rule by taking it too far.
- 2. Don't use iterators when there is any other way to accomplish the task.
- You can't write efficient algorithms without knowing the data structures.
- 3. Tabs for indentation then spaces for alignment.
- It's the best of both worlds by both having variable length tabs
- and correct alignment that works between lines of the same indentation.
- 3.1. Do not use multiple spaces as a replacement for tabs in indentation.
- I don't care if you set your editor to 2, 4 or 8 columns per tab
- and neither should you care about my preferences.
- 3.2. Do not use a tab as a replacement for multiple spaces in alignment.
- The number of leading tabs should be equal to the indentation depth.
- This way we can prove mathematically that blocks of code in the same
- indentation will always keep the same relative alignment.
- 3.3. Do not use tabs after spaces.
- First tabs for indentation, then spaces for alignment.
- 3.4. Do not try to align between different indentation depths.
- Only align within the same depth so that it works for all tab lengths.
- Example using "--->" for tabs and "." for spaces:
- int foo(int x, int y) [
- --->if (superLongExpression(x) &&
- --->....superLongExpression(y)) {
- --->--->bar(x + y);
- --->}
- }
- If a reader uses 8 spaces per tab then superLongExpression is still aligned:
- int foo(int x, int y) [
- ------->if (superLongExpression(x) &&
- ------->....superLongExpression(y)) {
- ------->------->bar(x + y);
- ------->}
- }
- 4. No dangling else, use explicit {} for safety.
- Otherwise someone might add an extra statement and get random crashes.
- 5. No hpp extensions, use h for all headers.
- Could be either way, but this library uses *.h for compact naming, so keep it consistent.
- 6. C-style casting for raw data manipulation and C++-style for high-level classes.
- When using assembly intrinsics and raw pointer manipulation to alter the state of bits,
- verbose high-level abstractions only make it harder to count CPU cycles in your head.
- Always use the tool that makes sense for the problem you're trying to solve.
- C++ style is for things that are abstracted on a higher level.
- C style is for when a byte is just a byte and you just want to manipulate it in a specific way.
- 7. Don't call member methods with "this" set to nullptr.
- This would be undefined behaviour and may randomly crash.
- Use global functions instead. They allow checking pointers for null
- because they are explicit arguments declared by the programmer.
- 8. Avoid using STD/STL directly in SDK examples.
- Exposing types from the standard library should be done using an alias or wrapper in the dsr namespace.
- This allow replacing the standard library without breaking backward compatibility.
- The C++ standard have broken backward compatibility before and it can happen again.
- 9. Don't abuse the auto keyword everywhere just to make it look more "modern".
- Explicit type safety is what makes compiled languages safer than scripting.
- 10. No new line for opening brackets.
- Makes the code more compact and decreases the risk of copy-paste errors.
- 11. Don't fix the style of someone else's code if you can easily read it.
- Being pedantic can become an addiction consuming all your time.
- Fixing actual bugs and port to new systems is much more appreciated than
- causing version conflicts with others.
- 12. Don't change things that you don't know how to test.
- * Not doing enough regression tests will eventually create a mine-field of untested functions.
- Regression testing will only slow down the amount of new bugs, unless you keep adding more regression tests.
- * Manual testing only finds bugs in code that's actually called by the program.
- Two bugs may cancel each other out, which is common with negation and coordinate systems.
- * The larger the input is relative to the output, the lower coverage you will get from each test.
- If your input is a video and the result is a boolean, any implementation has a 50% chance to pass the test on pure luck.
- If your input is a boolean and the result is a video, you just try both cases and have full coverage.
|