The main message here is that flexibility is not something that comes automatically, even with OO. The other message is that it is not possible to create infinitely flexible software without introducing unmanageable complexity, so the only alternative is to rely on knowledge of the problem domain to make wise choices. Here's a way to do it.
Don't try to create software that's like a rubber band flexible in every conceivable direction. Instead, identify a few specific places where the system needs be flexible and do a good job with those places. If you get this point wrong, you'll end up with massive unnecessary complexity and your project will probably fail. |