Writing by Peter Hilton

Object-oriented programming with constrained types

What if you had to define types for all values? 2014-07-17 #programming

With object-oriented programming in a language like Java or Scala, we conventionally define classes for complex types, such as Person and Organisation. At the same time, we use ‘primitive types’ such as String and Integer for single values, such as a person’s name or a company’s registration number. We also use general types such as Date, for a date of birth say, that the language doesn’t already provide.

Why don’t we go further, and use custom types for single values as well? Why not define PersonName, RegistrationNumber and BirthDate as types?

Primitive types

The problem is, when you’re writing code, it’s too convenient to using String and Integer types to store names and numbers, resulting in code that’s harder to read and more fragile. You might be able to see that a value is 42 without knowing what that means, or that you have 3 of something, without knowing what they are. Not having named the types, you can end up having to compensate with more wordy variable and parameter names.

Worse, you can end up with subtle bugs, when you do things like assigning a person’s name to the name of a status, or calling an API that expects a BirthDate with an InvoiceDate instead.

Wrapper types for value objects

You can solve this by defining custom wrapper types for value objects, so that mixing types causes compilation errors. The only problem is that this isn’t necessarily convenient. In Scala, for example, you can use a case class that has a single value property to wrap a primitive type, such as String or Int. This is certainly convenient, but it doesn’t happen by itself.

The missing constraint is to only allow primitive types to be used for private values/variables. This would mean that all API and function/method parameter and return value types would have to be defined types.

Hard coding constraints

Of course, what would be really cool would be if the language enforced this constraint, rather than merely using a coding standard. That would be more hardcore than constrained coding style.

Meanwhile, you’ll have to settle for team coding standards that enforce this. To understand more about why and how, read Ken Scambler’s excellent article about The abject failure of weak typing.

Share on BlueskyShare on XShare on LinkedIn