I've talked about this before (link in Spanish). A one-sentence resume of the entire post: You ain't gonna need it. Want more about the topic? Google it.
Anyway, I just read "How (not) to write Factorial in Java" by Bill Woody (late to the party, the post is one year old), and despite I'm not sure how he goes from a factorial function implementation to the conclusion of his article, I really love the final sentences, so I'm copying them here and bolding some words here and there to make them resonate even more:
The biggest complaint I have with many Java developers is that they develop a whole bunch of really bad habits. Specifications are unclear, or they think someday the code may need to be extended into a different direction. So they write a whole bunch of overblown architectural nonsense, sight unseen, thinking that the additional crap someday will help out and make things easier.You can sign my name next to these affirmations. They are not originally mine, but I agree 100% with them.
(...) Because a year from now they wade through all this excess baggage written at a time when they thought they understood the domain of the problem (but clearly didn't), instead of having simple code (...) that they can revise as needed, they wind up with the most over-engineered pile of nonsense that no-one can possibly understand.
So please, do us all a favor: if you have the urge to add complexity because "someday we'll need it, I just know it!", or because "it’s not sufficiently flexible enough" or "we need reusability in our code" or (God help us!) because it’s "cool" – just go home early. Watch some cartoons. Rent Inception on DVD.
And stop creating extra work for us in the future for no good reason.