Although refactoring code has been done informally for decades, William Griswold's 1991 Ph.D. dissertation[1] is one of the first major academic works on refactoring functional and procedural programs, followed by William Opdyke's 1992 dissertation[2] on the refactoring of object-oriented programs,[17] although all the theory and machinery have long been available as program transformation systems. All of these resources provide a catalog of common methods for refactoring; a refactoring method has a description of how to apply the method and indicators for when you should (or should not) apply the method.