I see two main types of project activities.
There is decomposition in the primary parts of the system. So, you already have an idea of separating parts of the presentation from the rest of your system. You probably also have business logic and persistence. The first important question is how much Business Logic you really have. Some systems are a little more than thin skin in front of a simple database, hardly any true business logic. Others have very important pieces of business logic that are somewhat independent.
If you have basic semi-independent parts, they can communicate better through events and message queues. Therefore, indicate whether you have fragments that need such an unleashed relationship, and this leads to the identification of events and useful data of these events. Here, where Fowler refers in another answer, becomes relevant.
Then check the details of the business logic. Interfaces and abstract classes, etc. - these are methods of structuring the implementation of complexity. Separate your code so that details are hidden and flexibility is included. I see this as an OO design exercise, there are many books about this, for example head first .
source share