I don’t really want to go deep here, because it all depends on many factors: knowledge, necessity, time, a specific project, etc. etc. The main thing that you should not forget and adhere to that everything good is useful in moderation. ')
Tactile code
What should be disposed of in the process of refactoring and when writing new programs.
Duplication code.
Long method.
Great class.
Long list of options.
Divergent modifications. If when adding a new functional it is necessary to modify several methods and a significant part of the code in the class.
Shooting shot. If at addition of a new functional it is necessary to make identical changes to a large number of classes.
Envious features. The method is no longer interested in the class in which it is located, but in others.
Data groups. Similar groups of data in different parts of the code.
Obsession with elementary types.
Switch type operators. Unforgettable about the PLO.
Parallel inheritance hierarchies. Duplicate code.
Lazy class. Not used or containing few methods (remaining after refactoring / design).
Theoretical generality. An abundance of abstractions is also harmful.
Temporary field. If a class has variables that are used in one method out of five, then it is better to transfer this variable to that method through a parameter, and not through a constructor or in any other way.
Message chain Deep sequence of calls to the necessary information, through objects on the class hierarchy.
Mediator. The class delegates most of the methods to another class.
Inappropriate intimacy. Classes should not expose closed parts, i.e. internal kitchen. When inheriting, subclasses must know the minimum necessary information about the parent.
Alternative classes with different interfaces. Duplication of logic.
Incomplete library class. Do not be afraid to extend the functionality of library classes: extension methods or decorate an object of a library class.
Classes of data. Divide into logical units. Access to change data should be meaningful.
Waiver of inheritance. If the heir needs only a small part of the information (data, methods) about the parent.
Comments Evidence of the code with the "smell", you need to refactor. Perhaps the code remains for future refactoring or describes complex manipulations
I do not provide solutions to these problems, because you can take as a basis what is described in the book. And with the experience, something of their own. Read on, technique: Compilation methods .
What a profit.
Simplicity in support and understanding of the code, as well as in writing tests.
Afterword
I will add that this is only a necessary minimum. Depending on the complexity of the project and the architecture in it, more heavyweight principles, patterns and methodologies will appear on the Arena.