# These are more like guidelines

## Naming schemes
- Use reasonable names, especially for class members
- Use shortened names for local variables
- Use comments to explain if a name doesn't obviously imply what the
  variable does
  
## Constants and types
- All constant variables should be in all CAPS
- When not needing values to distinguish flags (i.e. the flag is only
  there to denote a type, its value can be anything), use **enum**.
- If a template object is used more than once, it is a good idea to
  wrap it in a class/struct or use a **typedef**
- If the purpose of a class is solely to store data, use a struct.

## Object design
- If an object isn't meant to be inherited, declare it **final**
- If a member function has to be implemented individually, declare it
  as a pure virtual function.

## Global variables
- Avoid using global variables at all costs
- Can improve **rng** to be referenced instead of externally exported

## Functions and local variables
- A function should be at most 40 lines unless it's logically simple
  (e.g. has a long switch statement that calls other functions).
  *rationale: functions should be short and sweet and let the people
  reading them know what it does.*
- Never have more than 4 local variables in the scope of a function at
  the same time.
  *rationale: a normal human's brain can only keep track of a handful
  of things at once*

## STL library
- Prefer using the STL library over raw data types unless it's a very
  simple data type
- Use unique_ptr<> for heap-allocated objects
