Se puoi fornire alla classe funzionalità utili sufficienti a giustificare la complessità aggiuntiva di non essere una stringa, fallo. Per identificatori come ISBN e ISIN, sospetto che non sia così.
Affinché una classe identificatore sia utile, mi aspetto che assomigli a qualcosa del tipo:
class ISIN {
fromCUSIP()
fromRawISINString()
toString(ISIN::FormatType)
getExchange()
getCountryCode()
getLastFourDigits()
getWhateverCode()
...
}
Se invece è più simile a questo:
class ISIN {
getString()
setString()
}
Quindi eliminerei completamente la classe, userei stringhe regolari ovunque e assicurarmi di usare costantemente "isin" in tutti i nomi delle variabili rilevanti.
Si noti che in alcune lingue, l'aggiunta di un nuovo tipo non ha quasi nessuna "complessità aggiunta" nei programmi tipici, nel qual caso si sarebbe incoraggiati a creare il nuovo tipo anche se non aveva alcuna funzionalità. Ma questo non è il caso della maggior parte dei linguaggi OOP tradizionali come il C ++.