* Code Quality 2
Memory Management
Is hard in C++
Any non-trivial memory management should be inspected by someone else
Learn to use memory analysis tools, e.g.
valgrind
RAII: ensure that memory is allocated at first use, freed after last use
The Pairing Principle
Every alloc should have a free
Every open should have a close
Every time you do something, think of and note "obligations" produced by it
- Ideally, "discharge" those right away
Unit Control Flow Made Easy
Idea: Successive strengthening of invariants
Start by picking off special cases
- Assertions: fail for unhandled cases
- Recursion: get base case
- Special cases: early
return
Each line of the unit you should know more about what you're working with
At the end of the routine you should just be able to dispatch stuff
break
andcontinue
are your friends
Idea: Case analysis
- Conditionals and case statements are the same thing
Idea: Hoare clauses and loops
Indentation Is The Enemy
Nesting depth only thing that has been shown to correlate strongly with poor code quality
Untangle logic
Early
return
vselse
Splitting out subunits
Idiom Is Your Friend
Write things the way other people write them in C++
- Maybe there's a reason
- Regardless, it means others can work with your code
Don't fight the language
Follow the coding standard
Coupling and Cohesion
Every unit tells a story
If a unit tells two unrelated stories, break it up
If a unit needs a lot of information to tell its story, put it with the information
- This is the idea behind OOP
Error Handling
C++ has an exception mechanism
All error returns must be handled
- Many can be handled with assertions, but not all
This is a real design thing
Comments
Clarifying comments at the top of interesting units
- Describe non-obvious features of parameters and results
Block comments on top of unit blocks
Use
XXX
commentsComment data structures
Comments should not restate the program
Comment anything that might be mysterious
- Or better yet fix the mystery
Use a comment-doc tool with C++