Root cause 1: Creating libraries of business functions without considering their domain module.
It’s a general tendency to club similar functions together in one library file. For example, while developing a banking application, we tend to write the all interest functions together without worrying whether that interest is calculated on loan or deposit. Loan and deposit are domain modules of the application here.
Another example of the similar mistake can be the reservation system; we tend to write the payment and reservation functions in same file as they are linked but we do not consider that their domain is different.
First of all, it will be very difficult to enhance such systems, if at all, you are able to do some modifications in to that worst effect is seen while performing regression testing. Your small modification will affect many unrelated functions.
Root cause 2: Mixing up the business logic with the presentation logic.
If user is borrower, screen 1 should appear; if user is depositor, screen2 should appear. All these are parts of presentation logic. These decisions shall be handled at the presentation layer of the application without disturbing the business logic.
Your loan calculation function checks whether the call for interest calculation is from batch processing or online is a classic example when you mix the business logic with the presentation logic.
Root cause 3: No proper layering of functions and communication mechanism.
We shall never keep utility function with domain specific at the same layer. For example, the utility function for date formatting shall not be at the same level of a domain specific function like interest calculation. There are general rules which shall be followed:
• Module residing on the same level shall communicate with each other via predefined interfaces.
• Module at upper layer can access the lower level functions but not vice -a- versa.
This will also enable user to put some common part of a function, which is used across the domains, in lower level and more specialized part for the specific domain in the upper layer.
Root cause 4: Not organizing code as per functional domain.
Do not keep all your files at the same hierarchy irrespective of their domain. Always make separate folder for keeping files which are related to one domain. This will improve the maintainability of the system as the code written is well organized.