The type system is a programmer's best friend
Wow, this is completely ill-informed.<p>Lets run with the example they give of a normalised, validated EmailAdress field.<p>If you use that, your user enters a value, and something else is stored and returned the next time. They think they did something wrong and they don&#x27;t care to learn that email addresses are (mostly) case-insensitive, so they try to re-update their email address to First.LAST@gmail.com repeatedly, then reach out to support to try to get that fixed (or give up on such a lousy product).<p>Or relying on the fact that <i>+whatever</i> indicates an alias (a gmail convention, and not a standard at all): on my own server, I could have an entirely different convention.<p>They sure want that EmailAddress field to understand the gmail convention of a dot being a &quot;formatting&quot; character with no semantics either, when that&#x27;s just another convention (and the one even gmail got wrong early on, so look up the horror stories of people having separate accounts from the early days with just dots in a different place).<p>And there&#x27;s now a problem with parsing the address, and you need to surface the exact problem: but how can a user see it from all the normalisation you just &quot;helpfully&quot; did?<p>And why is EmailAddress not consisted of a pair of InternetDomain and EmailAccountName instead? (Ofc, InternetDomain is a list of InternetDomains, so you can tell what a TLD is and whether it&#x27;s a country domain or maybe a deprecated country domain, or if there are aliases for a domain or...).<p>I am sure I can come up with more issues with this approach: this is a begginers fascination with OOP where they are still deceived by the promise that the world can be represented with nicely structured &quot;objects&quot;.<p>What you need to do instead is have an ability to accept any user input, and there&#x27;s a generic type that works great for the task: a string!<p>There is value in having some layers only accept validated and normalised input (you can avoid any error checking there of you are brave ;), but custom, &quot;smart&quot; types do not add much value and require too much work for no gain.