Damu,
I don't mean to be sarcastic, but the direct answer to this question would be like finding
The Silver Bullet.
The degree of extensibility or changeability of an application/module is directly proportional to the quality of design.
Without going into OOD and Software engineering concepts for answer, I'll try to put it short. Even before you are designing a module (class/interface/a functional module), often you have to decide how much change you would allow in the module you are writing.
In my opinion, the behaviour of a module can be divided into
1. Private behaviour (definite candidate for private members)
2. Customizable behaviour (protected et al)
Unfortunately, I endup giving pretty convoluted answers all the time.
Lemme know if you need clarification/resources for this (if this made sense @ all)
Dushy