Excerpted from Domain-Driven Design Book
Definition: A technique for separating the concerns of a software system, isolating a domain layer, among other things.
Problem: In an object-oriented program, UI, database, and other support code often gets written directly into the business objects. Additional business logic is embedded in the behavior of UI widgets and database scripts. This happens because it is the easiest way to make things work, in the short run.