A software GranuleOfRelease (or ''unit of modularity'') is a collection of software with the following attributes: * Performs, or contributes to, a specific functionality * All software within the GranuleOfRelease is necessary for completion of that functionality; it would be difficult to use only part of the GranuleOfRelease. (It may be possible for specific such granules; but you shouldn't depend on that). * May depend on other GranuleOfModularity''''''s (bad plural, I know); however ''the dependency graph among UnitsOfModularity should not contain any cycles''. Cycles among classes (etc) ''within'' a GranuleOfRelease are generally OK, though they should be short (no more than 2 or 3 participating entities); anything larger indicates that ReFactoring may be necessary. * The GranuleOfRelease is the granule of reuse - see ReuseReleaseEquivalencePrinciple. Names given to granules of release in various languages and various works in TheLiterature include: class, module, package, cabinet, library, component, etc. Unfortunately, this is one area where the terminology could use some harmonization. The phrase ''granule of release'' is chosen to avoid collisions with any of the above. ---- Many practitioners of various languages/paradigms insist that a particular language feature (such as the "class" or "module") is the proper granule of release. Languages which force the GranuleOfRelease to be a particular size usually result in maintenance/configuration headaches. That said, the UnitOfModularity generally shouldn't be smaller than a single class or stand-alone function. (Some languages require the GranuleOfRelease to be a class or first-class object; but allow other classes which do not have this functionality; that's OK. What is objected to is the notion that ''all'' classes should be releasable components). Not to be confused with the GranuleOfDeployment. The GranuleOfRelease should be smaller than the GranuleOfDeployment.