# misc. axioms of big O - Arithmetic operations are constant - Variable assignment is constant - Accessing element in an array (by index) or object (by key) is constant - In a loop, the complexity is the length of the loop times the complexity of whatever happens inside of the loop # SOLID - Single responsibility principle - a class should only have 1 reason to change - *separation of concerns* -- different classes handling different, independent tasks/problems - Open-closed principle - classes should be open for extension but closed for modification - Liskove substitution principle - you should be able to substitute a base type of a subtype - Interface segregation principle - don't put too much into an interface; split into seperate interfaces - Dependency inversion principle - high-level modules should no depend on low-level ones; use abstraction # Builder A component that provides an API for constructing an object step-by-step, this saves you from having a gigantic constructor.