Organizing by feature
The next approach is to organize our code by feature:
In essence, we have put all the code related to accounts into the high-level package, account. 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 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 just by looking at the class name. Making the application’s functionality visible in the code is what Robert Martin calls a “Screaming Architecture”...