A design pattern is a named problem-solution pair that enables large-scale reuse of software architectures or their components. Ideally, patterns explicitly capture expert knowledge, design trade-offs, and design rationale and make these lessons learned widely available for off-the-shelf use. They can also enhance developers' vocabulary - for example, by easing the transition to object-oriented programming. Conventionally, patterns consist of four elements: a name, the problem to be solved, the solution to the problem (often termed the refactored solution), and the consequences of the solution. Numerous sets of patterns (collectively known as pattern languages) exist for software design, analysis, management, and so on. Shortly after the notion of design patterns emerged, practitioners began discussing problem-solution pairs in which the solution did more harm than good. These have come to be known as antipatterns, and they are well known in the design and management communities