0

Primitive obsession

ko22009 4 years ago updated by Vladimir Elizarov 4 years ago 1

Использование констант для кодирования какой-то информации. https://refactoring.guru/ru/smells/primitive-obsession

Значит ли это, что все константы теперь надо заменять на subclass?

Не совсем ясно, когда это имеет выигрышь. На академических примерах это вообще не ясно.

Ну и раз про рефакторинг речь, то другой вопрос.

Является ли instanceof нарушением подстановки Барбары Лисков, либо какие-то паттерны разрешают нарушать этот принцип?

Вы не совсем правильно поняли идею "одержимости примитивами". Суть её в том, чтобы вместо использования примитивных типов (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) принимает только класс имейла, который точно валиден.
И если вы думаете, что "ну какой же дурак будет передавать туда невалидный имейл?", то, поверьте, будут и еще как. Кто-то накатил миграцию на БД и случайно изменил имейл, джун по незнанию всех кейсов бизнес-логики передал туда не ту строку и т.п.