For example, consider the use case when a product is being purchased; the Checkout module has to update the availability of the Product object, and if those two modules are in the same application, it's too easy for a developer to just obtain a reference to a Product object and update its availability directly. Maintaining a low coupling between internal modules is very hard in monolithic application, partly because the boundaries between them are not always clear or properly enforced.