Each time you create a piece of software - you create a language. It can be composed of just a few verbs in a simple script or it can encompass a whole new and complex domain of knowledge.
Each class and each function add a concept to your language. Every time you create one - either from primitive statements or from other concepts you've already defined - you make your language more expressive. You rise it's level of abstraction.
And you explicitly define things that were too hazy or unclear before allowing you to solve more complex problems.
Decorator in the names of the decorating classes. For example,
AutoHangupModemDecorator might be the name of a class that decorates a Modem with the ability to automatically hang up at the end of a session.
toString. It is better to follow conventions like these than to invent your own.
You'd often straggle to give them a clear name. Function defines a concept in a language that you are creating. If your function is too large and it's doing too many things - you can't give it a name that would sharply define the concept. Making your language less expressive.