A concept in object-oriented programming which means the redistribution of software functionality among smaller, well-defined components. When every component in a software system has a clearly defined job description, it is easier to locate any piece of functionality by looking up the component whose scope of operation includes it. This also makes adding new functionality simpler, as it's often clear which component should take the new responsibility upon itself.

In order for such a software system to operate, components acquire services from each other to supply their own services. The requests are done via well-defined contracts of supply and demand. The benefit to having such autonomous self-contained components is that it's relatively easy to extract them from one software environment and reuse them in another.