True? False? А может Neutral?
Стандартный тип boolean с true/false это мощный инструмент, но может ли он стать еще лучше? Реализуем с его помощью состояние поставил ли юзер лайк или дизлайк посту.
1. Начнем с дефолтного варианта - юзер ставил лайк/дизлайк
У нас есть два поля + нужна дополнительная логика/тесты что бы у нас не было случая, когда юзер поставил и лайк, и дизлайк.
2. Заменяем тип на объект - теперь лайк это true, дизлайк это false. Отсутствие реакции это null. Но это не совсем корректно - null должен говорить, что объект пуст, а не обозначение стостояние.
3. Можно создать Enum,
... но есть решение получше...
4. Представляю вашем вниманию новый тип - Нибулин (neboolean), который кроме значений true и false может принимать значение - neutral.
Теперь по дефолту состояние - нейтральное, лайк - true, дизлайк - false. Идея пришла после прочтения мема - "true neutral".
Прежде чем повторится ответ из мема ниже
хочу сказать что до 1 апреля еще далеко, по-этому решил поделится идеей раньше времени.
enum лучше, проходим дальше
Есть более общее решение под названием "Алгебраический тип данных"
https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
Бул всаживать как дочерний по отношению к вашему типу neboolean будет мусором и путаницей
не всегда нужна третья логика, а если нужна: АТД легко ее решают... в виде енамов или кастомных штук, а также в виде монады Maybe и прочего — более мощнее и надежнее
вот пример из "Chaotic Evil":
https://wiki.php.net/rfc/enumerations_and_adts#examples
как вариант когда нет енама и задача отобразить третье пустое состояние: использовать Null Object Pattern
по дефолту использовать NullObject, если нет значения, если есть — использовать уже конкретный тип (например в приложении на Ангуляре я ее использую для аутентификации, если не залогинен, то по дефолту у меня AnonymousPassport, если залогинен — Passport, по итогу программа корректная и без всяких псевдо-типов (залогинен, незалогинен, neboolean) — код прямой как АК-47 без резолвов какого-то третьего типа
спасибо за развернутый ответ. поизучаю