Portmap[1] lets you use names instead of port numbers. A server just grabs an arbitrary port number and then registers itself with the portmap server. When you want to connect from a client, you first ask the portmap server for the port number.
However, it sort of requires your service to be started by inetd. It doesn't work for services that want to manage their own listen queues.
It also complicates firewalls. It makes it much harder to have rules that vary per service.