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

Всем привет. Ребята, есть такой вопрос. Есть стуктуры данных, которые написаны

под DDD структуру.
Поэтому все поля у них приватные и реализованы только методы для работы с данными.

Например, есть структуры Amount, Asset и прочие.
Эти структуры нужно записывать в Монго в составе других аггрегатов и структур.
Для них реализованы методы MarshalJSON и UnmarshalJSON.

Я думал, что в случае если нет открытых полей, то Монго перегоняет структуру в JSON и таким образом сохраняет её.
Но так не происходит. Записывается в БД пустые данные. Типа того: Asset{}.

Есть какой-то интерфейс для того, чтобы реализовать верное сохранение данных в Монго для закрытых структур?
Пытался реализовать MarshalBSON, но там какая-то ерунда получается. Видимо он не для этого… Либо я не разобрался.

7 ответов

18 просмотров

Как из DDD следуют приватные поля в моделях? И уж что точно ему противоречит, так это маршаллинг моделей в JSON

Andrew-Popov Автор вопроса
Евгений Омельченко
Как из DDD следуют приватные поля в моделях? И уж ...

Дело в инкапсуляции данных. Если коротко, то по той же причине, по которой в Time скрыты вот эти поля: wall uint64 ext int64 loc *Location

я лично забил на этот момент и часто делаю поля публичными. Надо ответить на вопрос: от кого мы инкапсулируемся/защищаемся. Если этот доменный объект включен в какой-то общий пакет, тогда скорее всего нужны приватные поля. Может если над кодом работают много человек тоже надо. В остальных случаях от самого себя нет смысла защищаться

Andrew-Popov Автор вопроса
Evgeny Maltsev
я лично забил на этот момент и часто делаю поля пу...

Мне кажется, что это из разряда “если с кем-то встречась сегодня, то почищу зубы”. Любой коммерческий проект рано или поздно умрёт или появятся дополнительные разработчики. Сменится тот, кто поддерживает проект и прочее. А также может выделится в отдельный пакет, особенно на Го, как мне кажется, это наиболее вероятно. Поэтому уже сейчас работа с ценами и стоимостью через int привела к проблемам даже в маленькой команде. Кто-то забыл или не понял, что это в центах. А кто-то не понял в какой точности объем биткоина, и в какой эфириума… В общем, проблем много. И все они ушли после внедрения инкапсуляции. Да и ещё в сложных сервисах сразу всплыли ошибки при математики с ценами. Оказывается в некоторых случаях сравнивались или складывались несовместимые Amount. Это когда Amount был для разных Asset. Грубо говоря, биткоин складывался с долларом, что в случае использования int не выдаст ошибки, но приведёт к логической ошибке в коде.

Andrew Popov
Мне кажется, что это из разряда “если с кем-то вст...

Я вам так скажу: крайне сложно защитить код от глупого или ленивого программиста. Ибо он всегда может кастануть типы и сложить int-ы. В приведенном вами примере я не вижу плюсов в приватных полях. Достаточно описать валюту как тип и сделать для нее операции сложения и т.д.

Andrew-Popov Автор вопроса
Виталий Фунтиков
Я вам так скажу: крайне сложно защитить код от глу...

Не могу с Вами согласиться… Если я вижу структуру с открытым полем, то логично сделать вывод, что я могу её поменять, вывести и тп Если открытых полей нет, то любой программист озадачится вопросом, а какие есть у неё методы для работы с данными? И с 90% вероятностью найдёт нужный и использует его. В случае наличия открытых полей 90% программистов не станут разбираться в методах. Кроме того, в 90% случаях обязательно кто-то привяжется к этим полям во внешнем коде. Что при желании отрефакторить внутреннюю структуру приведёт к проблемам. А если инициализация структуры требует валидации входных данных, то с открытыми полями совсем печально. Даже при наличии конструктора всегда есть возможность инициализации напрямую. В общем, есть масса условий при которых я бы не стал так делать…

Для монги нужен отдельный контракт с публичными полями. Тогда всё будет нормально маршаллиться

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
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
Карта сайта