Many design methodologies emphasize starting with the UI, which all too often solidifies into a final system design. The code typically ends up with numerous if-else statements. Code structured in such a fashion can succeed for small, single-user systems whose functionality requirements change slowly over time. Due to monolithic fashion and excess interdependency, it is much more difficult to achieve modular systems. Indeed, a change to the code anywhere produces side effects everywhere.
Unit tests prove difficult too.
Dependencies among components make the components less usable in other contexts. Moreover, new interfaces must be developed from scratch, since the control logic is buried in the code. The result is often similar data calculated or accessed in different ways, resulting in display-value inconsistencies. Even if the displayed data are correct, any change to the data display must be updated in multiple places, opening the door for flaws. The solution To solve the problem, put your application into different layers, a move considered to be a better practice since it separates conceptually different issues.