Organizing by Feature
Let's try to address some of the issues of the "organize by layer" approach.
The next approach is to organize our code by feature:
Figure 3.2: When organizing code by feature, the underlying architecture tends not to be apparent
In essence, we have put all the code related to accounts into the high-level account package. We have also removed the layer packages.
Each new group of features will get a new high-level package next to account and we can enforce package boundaries between the features by using package-private visibility for the classes that should not be accessed from the outside.
The package boundaries, combined with package-private visibility, enable us to avoid unwanted dependencies between features.
We have also renamed AccountService to SendMoneyService to narrow its responsibility (we actually could have done that in the package-by-layer approach, too). We can now see that the code implements the "Send Money" use case...