readability maintainability consistency exception handling simplicity test coverage side effect reuse of existing code performance