True? False? А может Neutral?

Стандартный тип boolean с true/false это мощный инструмент, но может ли он стать еще лучше? Реализуем с его помощью состояние поставил ли юзер лайк или дизлайк посту.

1. Начнем с дефолтного варианта - юзер ставил лайк/дизлайк

Foo { boolean isLiked = false; boolean isDisliked = false; }

У нас есть два поля + нужна дополнительная логика/тесты что бы у нас не было случая, когда юзер поставил и лайк, и дизлайк.

2. Заменяем тип на объект - теперь лайк это true, дизлайк это false. Отсутствие реакции это null. Но это не совсем корректно - null должен говорить, что объект пуст, а не обозначение стостояние.

Foo { Boolean reacted = null; }

3. Можно создать Enum,

enum Reaction { DISLIKE, NEUTRAL, LIKE }

... но есть решение получше...

4. Представляю вашем вниманию новый тип - Нибулин (neboolean), который кроме значений true и false может принимать значение - neutral.

Foo { neboolean reacted = neutral; }

Теперь по дефолту состояние - нейтральное, лайк - true, дизлайк - false. Идея пришла после прочтения мема - "true neutral".

True? False? А может Neutral?

Прежде чем повторится ответ из мема ниже

True? False? А может Neutral?

хочу сказать что до 1 апреля еще далеко, по-этому решил поделится идеей раньше времени.

3 комментария

enum лучше, проходим дальше

3
Ответить

Есть более общее решение под названием "Алгебраический тип данных"
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 без резолвов какого-то третьего типа

1
Ответить
Автор

спасибо за развернутый ответ. поизучаю

Ответить