We have sort of a hybrid between the two approaches.
I abhor the numeric-code-with-text-alias approach to Domains. I get why it was used in the past, but as others have said: Data storage and throughput capacities are at a point these days where that has increasingly weakened utility, unless you're working with absurdly gargantuan datasets and long, complex calculations.
I interface with non-GIS people all the time, which often means spreadsheets are also going to get involved, and there's too much chance for error with the number/text combo approach.
On the flip side, though, there are plenty of values that are poor practice to allow into the raw data of your attribute table. For example, in our stormwater data, we had a condition domain that had as an option "Clogged > 20%".
That greater-than sign breaks all kinds of operations and generally just makes life needlessly difficult. So now that greater-than sign exists only in the Description/Alias. The raw code beneath just says "Clogged". (It was the only clogged value we had, otherwise it would've been "Clogged_20")
Other characters recommended to avoid in your raw code value, if you can afford to do so:
- Ampersand (&)
- Percent sign (%)
- Less than & Greater than (<), (>)
- Parentheses (()), Brackets ([]), or Curly Braces ({})
- Double quotes (") and the angled/curly variants thereof
- Single quotes (') and the angled/curly variants thereof
- Spaces (this actually isn't that much of an issue. But some operations might be ever-so-slightly easier without them. This is a pretty small list, though, so grain of salt on excluding this one. We do typically replace our spaces with underscores for consistency & clarity, though.)
I also tend to avoid special characters that aren't on a standard keyboard, like the degree sign (°). They're not likely to cause problems with most operations, but on the rare case that someone's running a field calculation or something similar where they need the raw value, it just makes it a little bit easier for them to write & run that code. I also used to do this for unicode/plain text reasons in Python, but that's not really an issue anymore, since Python 3 switched to a baseline assumption of unicode.
It also helps avoid confusion in cases where there are multiple similar characters that could be easily confused, like the the degree sign (°) compared to the masculine ordinal (º). They're different characters with different purposes and code points, but to the average end user, they look identical in most fonts.
That's a situation ripe for errors.
------------------------------
M Reed
"The pessimist may be right oftener than the optimist, but the optimist has more fun, and neither can stop the march of events anyhow." — Lazarus Long, in Time Enough for Love, by Robert A. Heinlein