Techniques that allow for more abstraction Encapsulate field – force code to access the field with getter and setter methods Generalize type – create more general types to allow for more code sharing Replace type-checking code with state/strategy[8] Replace conditional with polymorphism [9] Techniques for breaking code apart into more logical pieces Componentization breaks code down into reusable semantic units that present clear, well-defined, simple-to-use interfaces. Extract class moves part of the code from an existing class into a new class. Extract method, to turn part of a larger method into a new method.