обход состояниям показали как его отображать типами, вместо флажков
type VerifyEmail = ...
type UnVerifyEmail = ...
type Email =
| VerifyEmail of VerifyEmail
| UnVerifyEmail of UnVerifyEmail
возникло 2 вопроса
1) это приподносят как мигию F# но с помощью наследования я могу сделать такое-же и методы будут принимать конкретный тип если это нужно (VerifyEmail, UnVerifyEmail). Я правильно понял что это (type Email) похоже на наследование?
2) Как это будет храница в бд? отдельные таблицы?
при подтверждении почты я должен удалить почту из таблицы 1 и добавить в таблицу 2?
одна большая таблица где есть все свойства всех наследников 0_o?
1) магия лишь в том, что в F# это делается в пару строчек. Ну то есть ты можешь то же самое и на ассемблере сделать, разница лишь в уровне абстракции 2) SQL не имеет понятия как хранить типы суммы. Наследование ещё куда ни шло, поэтому обычно делают похожим образом
тут уже отвечали, но от себя немного добавлю: 1) Ты можешь сделать похожую штуку на сишарпе. Разница в следующем: - В сишарпе наследники — открытое множество. Кто угодно может имплементировать твой абстрактный класс. Из этого следует, что компилятор никак не может проверить, все ли возможные варианты в коде учтены, потому что этих вариантов может быть бесконечное множество. Кроме того, кто-то его рано или поздно наверняка попытается явно скастить явно к конкретному наследнику, что может привести к багу. Короче, код менее дуракоустойчивый. - Сишарповая имплементация — это больше кода, и он хуже структурирован. Это важно не потому, что бедному девелоперу трудно написать лишнюю пару строк, а потому, что это труднее прочесть и построить в голове общую картину. Условно, вместо 1 секунды это займет 10. И так на каждый подобный кейс. Соответственно, чтение и осознание кода занимает гораздо больше времени. 2) Как это хранится в бд — это другая проблема, более того, хранение зависит от типа бд. Мб это вообще все будет жить в монге, и тебе достаточно будет написать / использовать сериализатор. Но основная мысль автора этого примера была как раз в том, чтобы проектировать систему, исходя не из способа хранения в бд (как это часто бывает), а исходя из бизнеслогики, которая ни к какой бд отношения не имеет. Потому что бизнес-логика — это собсно главное и самое сложное, что у вас в проекте есть. К тому же в какой-то момент у вас может появиться дополнительное хранилище данных — кеш, рид модель, (которая будет кардинально отличаться от основной бд) или еще что. И тут от дизайна, завязанного на вашу БД, никакой пользы не будет, одни только неудобства.
Обсуждают сегодня