@phdthesis {Vokac.2005.2,
	title = {On the Practical Use of Design Patterns},
	year = {2005},
	school = {University of Oslo},
	type = {phd},
	abstract = {This thesis investigates the empirical evidence for the usefulness of design patterns, in the context of software maintenance. Advocates of design patterns claim general benefits in the form of higher flexibility, easier maintenance and reduced development time, though there is mostly only anecdotal evidence to support these claims. The thesis reports on empirical research that has been conducted in three related areas: the effects of design patterns on maintenance effort and correctness; the connection between design patterns and corrective maintenance needs, and the utility of design patterns in organizing the development process. The presence of design patterns in the code can have a significant effect on the effort needed to perform maintenance tasks, and the correctness of the results. The effects are strongly dependent on the expertise of the developers-a pattern that is beneficial to an expert, may cause a sharp increase in effort and a reduced correctness for a novice or intermediate developer. However, some patterns are simple and intuitive enough that they provide benefits to all types of developers, even those who lack knowledge of the particular pattern, or even design patterns in general. The presence of design patterns can also be correlated with the need for corrective maintenance, i.e., the error rates in the parts of the code conforming to the patterns, relative to the code at large. Some patterns are correlated with complex program structures that are prone to errors, while other patterns result in simple, less connected structures with lower error rates. Assuming that the patterns are used appropriately, this correlation can be used as a predictive or diagnostic tool to determine areas of the code that need particular design attention from expert developers. Design patterns can also be used in the organization of the development team. Teams are often organized around functional areas or around layers in the code (such as a Web front end or a database-related back end). An alternative, when the architecture of the system is expressed using patterns, is to organize the team around the patterns themselves, so that individual developers work with all the code involved in a pattern, across other boundaries. This can aid in the implementation of complex architectures, for example J2EE applications. Empirical evidence for these contributions was gathered through a combination of controlled experiments and case studies. Realism was ensured by using paid, professional developers as experimental subjects. In the case studies, industrial projects were examined and a large scale analysis of industrial C++ code performed. Research methods in the field were advanced both by the scale, design and realism of the experiment, and by the creation and validation of a tool for extracting design patterns from C++ code at a high precision and speed.},
	author = {Vok{\'a}c, Marek}
}
