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.