Вы не совсем правильно поняли идею "одержимости примитивами". Суть её в том, чтобы вместо использования примитивных типов (int, string и т.д.) использовать более специфические объекты - классы. Например, вам нужен класс пользователя, у которого есть поле e-mail. Можно его описать так: class User
{
int Id;
string Email;
} И это будет работать. Но: множество значений типа string намного больше, чем множество значений, которые может принимать e-mail. Т.е. строка "qwerty" - валидная строка, но не валидный имейл. Поэтому лучше сделать так: class Email
{
public class Email(string emailString)
{
// здесь можно проверить входную строку, например, регуляркой
// чтобы отсечь невалидные инварианты и выбросить исключение.
// или убрать лишние пробелы и т.п.
email = emailString
}
private string email
}
class User
{
int Id;
Email Email;
} Профит: 1) в вашей предметной области (домене) будет точно валидный имейл, иначе-вы получите исключение. 2) проще работать с методами. Например, метод SendEmail(string email) может принять абсолютно любую строку и компилятор здесь не поможет. Но метод SendEmail(Email email) принимает только класс имейла, который точно валиден. И если вы думаете, что "ну какой же дурак будет передавать туда невалидный имейл?", то, поверьте, будут и еще как. Кто-то накатил миграцию на БД и случайно изменил имейл, джун по незнанию всех кейсов бизнес-логики передал туда не ту строку и т.п.
Вы не совсем правильно поняли идею "одержимости примитивами". Суть её в том, чтобы вместо использования примитивных типов (int, string и т.д.) использовать более специфические объекты - классы.
Например, вам нужен класс пользователя, у которого есть поле e-mail. Можно его описать так:
class User
{
int Id;
string Email;
}
И это будет работать. Но: множество значений типа string намного больше, чем множество значений, которые может принимать e-mail. Т.е. строка "qwerty" - валидная строка, но не валидный имейл. Поэтому лучше сделать так:
class Email
{
public class Email(string emailString)
{
// здесь можно проверить входную строку, например, регуляркой
// чтобы отсечь невалидные инварианты и выбросить исключение.
// или убрать лишние пробелы и т.п.
email = emailString
}
private string email
}
class User
{
int Id;
Email Email;
}
Профит:
1) в вашей предметной области (домене) будет точно валидный имейл, иначе-вы получите исключение.
2) проще работать с методами. Например, метод SendEmail(string email) может принять абсолютно любую строку и компилятор здесь не поможет. Но метод SendEmail(Email email) принимает только класс имейла, который точно валиден.
И если вы думаете, что "ну какой же дурак будет передавать туда невалидный имейл?", то, поверьте, будут и еще как. Кто-то накатил миграцию на БД и случайно изменил имейл, джун по незнанию всех кейсов бизнес-логики передал туда не ту строку и т.п.