169 похожих чатов

Привет, смотрел видос где рассказывали про проблемы состояния, и в

обход состояниям показали как его отображать типами, вместо флажков

type VerifyEmail = ...
type UnVerifyEmail = ...

type Email =
| VerifyEmail of VerifyEmail
| UnVerifyEmail of UnVerifyEmail

возникло 2 вопроса
1) это приподносят как мигию F# но с помощью наследования я могу сделать такое-же и методы будут принимать конкретный тип если это нужно (VerifyEmail, UnVerifyEmail). Я правильно понял что это (type Email) похоже на наследование?

2) Как это будет храница в бд? отдельные таблицы?
при подтверждении почты я должен удалить почту из таблицы 1 и добавить в таблицу 2?
одна большая таблица где есть все свойства всех наследников 0_o?

2 ответов

4 просмотра

1) магия лишь в том, что в F# это делается в пару строчек. Ну то есть ты можешь то же самое и на ассемблере сделать, разница лишь в уровне абстракции 2) SQL не имеет понятия как хранить типы суммы. Наследование ещё куда ни шло, поэтому обычно делают похожим образом

тут уже отвечали, но от себя немного добавлю: 1) Ты можешь сделать похожую штуку на сишарпе. Разница в следующем: - В сишарпе наследники — открытое множество. Кто угодно может имплементировать твой абстрактный класс. Из этого следует, что компилятор никак не может проверить, все ли возможные варианты в коде учтены, потому что этих вариантов может быть бесконечное множество. Кроме того, кто-то его рано или поздно наверняка попытается явно скастить явно к конкретному наследнику, что может привести к багу. Короче, код менее дуракоустойчивый. - Сишарповая имплементация — это больше кода, и он хуже структурирован. Это важно не потому, что бедному девелоперу трудно написать лишнюю пару строк, а потому, что это труднее прочесть и построить в голове общую картину. Условно, вместо 1 секунды это займет 10. И так на каждый подобный кейс. Соответственно, чтение и осознание кода занимает гораздо больше времени. 2) Как это хранится в бд — это другая проблема, более того, хранение зависит от типа бд. Мб это вообще все будет жить в монге, и тебе достаточно будет написать / использовать сериализатор. Но основная мысль автора этого примера была как раз в том, чтобы проектировать систему, исходя не из способа хранения в бд (как это часто бывает), а исходя из бизнеслогики, которая ни к какой бд отношения не имеет. Потому что бизнес-логика — это собсно главное и самое сложное, что у вас в проекте есть. К тому же в какой-то момент у вас может появиться дополнительное хранилище данных — кеш, рид модель, (которая будет кардинально отличаться от основной бд) или еще что. И тут от дизайна, завязанного на вашу БД, никакой пользы не будет, одни только неудобства.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта