Слоистая архитектура
Идея в том, чтобы писать код так, чтобы он отражал особенности предметной области. Для этого, весь код разделяют на модули.
При этом, зависимости между этими модулями должны быть расположены строго слева направо (Domain не может зависеть от Application или User Interface)