0
Primitive obsession
Использование констант для кодирования какой-то информации. https://refactoring.guru/ru/smells/primitive-obsession
Значит ли это, что все константы теперь надо заменять на subclass?
Не совсем ясно, когда это имеет выигрышь. На академических примерах это вообще не ясно.
Ну и раз про рефакторинг речь, то другой вопрос.
Является ли instanceof нарушением подстановки Барбары Лисков, либо какие-то паттерны разрешают нарушать этот принцип?
Customer support service by UserEcho
Вы не совсем правильно поняли идею "одержимости примитивами". Суть её в том, чтобы вместо использования примитивных типов (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) принимает только класс имейла, который точно валиден.
И если вы думаете, что "ну какой же дурак будет передавать туда невалидный имейл?", то, поверьте, будут и еще как. Кто-то накатил миграцию на БД и случайно изменил имейл, джун по незнанию всех кейсов бизнес-логики передал туда не ту строку и т.п.