Re-design is necessary if the subject system should be adapted to new technologies like moving from sequential to concurrent execution, or from mainframes to client/server architectures.
Re-design is also necessary after a lot of previous changes which muddled up the architecture of the system. Then modules must be reorganized.
To improve future understanding and alteration of source code abstract data types can be introduced.