- No conflicts
- No warnings
- Builds
- Tests passing
- No crashes
- No visible ui flaws
- No performance glitches
- Conforms to selected architecture
- SOLID is followed
- Shared mutable state avoided
- Code resolves the issue
- Corner cases are handled
- Configurations are not exposed
- Persistent data is saved to appropriate place
- No passwords/credentials in the source code
- Debug information and logs are hidden
- Proper threading
- No livelocks
- No deadlocks
- UI is accessed from main thread only
- Observer deregistered
- No reference cycles
- No heavy operations on the main thread
- No force unwrap
- No unnecessary swizzling
-
final
attribute where inheritance is not intended - Backward compatible
- Reference semantics only where necessary
- Correct access modifiers everywhere
- Mutable values only where necessary
- Functions are referentially transparent
- DRY is followed (DRY = Do not repeat yourself)
- Common functionality is extracted
- Proper formatting
- Proper api design/naming
- No magic values
- No or proper hardcodes
- No unnecessary coupling
- Code is testable
- More efficient?
- Better formatted?
- More concise?
- Reused?
- Better named?