title: How do you prevent classes becoming 'dependency magnets' and God classes?
body: <p>In virtually every project I've ever worked on, there will be one or two classes with the following properties:</p>
  
  <ul>
  <li>Extremely large with many many members and methods.</li>
  <li>Many other classes inheriting from this class.</li>
  <li>Many other classes otherwise depending on this class.</li>
  </ul>
  
  <p>Bad design, you might say.  But in all cases, this wasn't the case at design time. The classes just grew organically over time and became the proverbial 'God class'.  This has been such an invariant of my experience with large software projects that I have to ask:</p>
  
  <ul>
  <li>Is it possible to foresee likely dependency magnets and design software in such a way that the chance of such classes manifesting themselves is less likely?  If so, specifically, how?</li>
  <li>Or, does it simply require ruthless refactoring as time goes by?</li>
  <li>Or, is there some technical solution or design pattern which can mitigate the problems caused by such classes?</li>
  <li>Or, a combination of all three?</li>
  </ul>
  
  <p>Tips, experience and ideas welcomed!</p>