Множественное ветвление в алгоритме, кто виноват и что делать?

site.com/gallery
site.com/gallery/edit (либо site.com/gallery?action=edit, не суть)
site.com/gallery/add
site.com/gallery/delete
Теперь к главному - обработка действия выполняется свитчем
switch ($action){
case 'edit': ... break;
case 'add': ... break;
case 'delete': ... break;
case 'view': default: ...
}
Иногда бывает нужно дополнительное деление по поддействиям:
site.com/gallery/add/category
site.com/gallery/add/item
switch ($action){
...
case 'add':
switch ($what){
case 'category': { ... } break;
case 'item': { ... } break;
}
break;
...
}
аналогично для edit и delete
switch ($action){
case 'edit':
switch ($what){
case 'category': /* много строк */ break;
case 'item': /* много строк */ break;
}
break;
case 'add':
switch ($what){
case 'category': /* много строк */ break;
case 'item': /* много строк */ break;
}
break;
case 'delete':
switch ($what){
case 'category': /* много строк */ break;
case 'item': /* много строк */ break;
}
break;
case 'view': default: ...
}
Как вы уже понимаете, действия и поддействия могут добавляться и дальше, и однажы мы обнаружим что написали свитч длиной пятьсот и больше строк. Запутаться сложновато, но и листать его туда-сюда - то ещё удовольствие.
Что же делать, как же быть? можно /* много строк */ вынести в функции, но в них будут уже другие пространства имён, что создаст сложности. Можно настроить редактор, чтобы он сворачивал case ... break, уменьшая занятое место на экране (как это сделать в эклипсе, кто подскажет?). Ещё варианты?