With bigger, more adaptable projects, you have fewer constants and more variables. So, if I was coding something, and I wanted to insert something into a player's inventory, i'd write a function that might look like this:
function addToInventory(itm as myItemUDT)
if totalItems<maxItems
index=findFirstFreeItemSlot()
itemarr(index)=itm
endif
endfunction
That code has 0 constants. Whenever I wanted to add something to the user's inventory I know I'd just have to say "addToInventory(fireballspell)" or what not.
If I was making a game about zombies, and I wanted to create another zombie, I'd say something like:
function addZombie(posx as float, posy as float)
object_number=getUnusedZombieObject()
index=getUnusedZombieArrayIndex()
make object cube object_number,1
zombieArray(index).objnum=index
endfunction
It's not specially limiting if you have to number everything. I don't see how naming would solve the problem of keeping track of hundreds of objects. Would you have "Zombie_number_one" and "Zombie_number_two", etc? 1,2,3,4, is - in my opinion - way more concise.
I program so that I don't have to keep track of anything, my program keeps track of it all. (in the above examples, I used variables, arrays, and UDTs)

Tell me if there's a broken link to images in a thread I post, and I'll fix 'em.