Se você puder dar à classe funcionalidade útil suficiente para justificar a complexidade adicional de não ser uma sequência, faça-o. Para identificadores como ISBN e ISIN, suspeito que não seja esse o caso.
Para que uma classe de identificador seja útil, seria de esperar algo parecido com isto:
class ISIN {
fromCUSIP()
fromRawISINString()
toString(ISIN::FormatType)
getExchange()
getCountryCode()
getLastFourDigits()
getWhateverCode()
...
}
Se, em vez disso, parecer mais com isso:
class ISIN {
getString()
setString()
}
Depois, abandonei a classe inteiramente, usei strings regulares em todos os lugares e certifique-se de usar consistentemente "isin" em todos os nomes de variáveis relevantes.
Observe que, em alguns idiomas, a adição de um novo tipo quase não tem "complexidade adicionada" em programas típicos; nesse caso, você seria incentivado a criar o novo tipo, mesmo que ele não tivesse nenhuma funcionalidade. Mas esse não é o caso das linguagens OOP tradicionais, como o C ++.