Model – holds data and knows nothing about the user interface.
View – is visible to the user and knows nothing about the model objects.
Controller – keeps the user interface and the model objects in sync and controls the flow of the application.
Designated initializer – ensures all properties in a class have a value.
Free initializer – init() is useful when all your class properties have default values and do not need new instances.
Convenience initializers – always call another initializer on the same class.
Dependency inversion principle – goal is to decouple objects in inverting dependencies between them. States that high-level objects should not depend on low-level objects, both should depend on abstraction. Also states that abstractions should not depend on details, details should depend on abstractions.
Dependency injection – high-level objects do not assume which low-level objects they need to use, instead they are passed through an initializer or property.