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

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

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

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

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

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

7 ответов

11 просмотров

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

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
70
Здравствуйте. Задача состоит в том, чтобы сделать real-time чат в мобильном приложении. После передачи сообщения пользователем через веб-сокеты, для основного и долговременног...
🐾
5
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Люди добрые, помогите с идеями, потому что свои закончились. У клиента падает софтина в момент инициализации модуля OtlEventMonitor на RegisterWindowMessage('Gp/OtlTaskEvents/...
Михаил Усков
7
Тут просто дело в том, что я не могу сейчас дать такие подробности из за того что рассчитать это всё нереально. Этого проекта который я хочу сделать ещё даже не существует) И ...
🐾
8
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
2
GridView fully ignored first parent(SizedBox), and take width from second parent(Container). How can I constrain GridView by first parent? Widget build(BuildContext context) {...
Hamster
1
Карта сайта