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

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

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

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

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

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

7 ответов

17 просмотров

Как из 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% случаях обязательно кто-то привяжется к этим полям во внешнем коде. Что при желании отрефакторить внутреннюю структуру приведёт к проблемам. А если инициализация структуры требует валидации входных данных, то с открытыми полями совсем печально. Даже при наличии конструктора всегда есть возможность инициализации напрямую. В общем, есть масса условий при которых я бы не стал так делать…

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта