1. Introduction
Modularity is a measure of the extent to which software systems are composed of disparate, substitutable modules; whereby each of which accomplishes a single functionality. In principle, modularity can be classified into functional modularity and architectural modularity. Functional modularity separates different functions from each other in different parts of the source code. Functional modularity enables high cohesion and low coupling by breaking the source code in to independent non-blocking modules. The principle of architectural modularity recommends dividing the software system in to separate layers with separate concerns for each of the layers. In software systems design, modularity is a widely accepted design principle [1], [2]. It has been considered together with hierarchical structure and interaction locality as the three basic rules governing the evolution of complex systems [3], [4]. In software systems, to achieve high understandability, maintainability, and reusability, the entire system should be decomposable into manageable components, such as libraries, functions, classes, and aspects. One objective of these different abstractions is to reduce source code redundancy. For example, a library function or an abstract class shall be consumed and implemented by the client components.