Balancing coupling in software design