Part of it is
Never Do Anything You Can Get Someone Else To Do. If you find a class doing three things, it should probably "delegate" two of those things to somebody else. (There are other ways to reallocate responsibilities to other classes, but this is the one you asked about.) One nice thing about delegates is that you can swap polymorphic delegates in and out. One day you might delegate logging to something that writes to disk, another day to something that writes to a database.