Q2What is tight coupling vs loose coupling?
Tight coupling means depending on a concrete class (new X() inside). Loose coupling means depending on an interface plus injection (DI). Loose enables swapping, testing with mocks, and changing without breaking. OOP plus DI always strives for loose coupling.