Если вы можете дать классу достаточно полезной функциональности, чтобы оправдать добавленную сложность не быть строкой, то сделайте это. Для идентификаторов, таких как ISBN и ISIN, я подозреваю, что это не так.
Чтобы класс идентификатора был полезным, я ожидал, что он будет выглядеть примерно так:
class ISIN {
fromCUSIP()
fromRawISINString()
toString(ISIN::FormatType)
getExchange()
getCountryCode()
getLastFourDigits()
getWhateverCode()
...
}
Если вместо этого это выглядит больше так:
class ISIN {
getString()
setString()
}
Затем я полностью исключил бы класс, использовал бы регулярные строки везде и удостоверился, что я последовательно использую «isin» во всех соответствующих именах переменных.
Обратите внимание, что в некоторых языках добавление нового типа практически не имеет «дополнительной сложности» в типичных программах, и в этом случае вам будет предложено создать новый тип, даже если он вообще не имеет никакой функциональности. Но это не так для большинства традиционных языков ООП, таких как C ++.