под DDD структуру.
Поэтому все поля у них приватные и реализованы только методы для работы с данными.
Например, есть структуры Amount, Asset и прочие.
Эти структуры нужно записывать в Монго в составе других аггрегатов и структур.
Для них реализованы методы MarshalJSON и UnmarshalJSON.
Я думал, что в случае если нет открытых полей, то Монго перегоняет структуру в JSON и таким образом сохраняет её.
Но так не происходит. Записывается в БД пустые данные. Типа того: Asset{}.
Есть какой-то интерфейс для того, чтобы реализовать верное сохранение данных в Монго для закрытых структур?
Пытался реализовать MarshalBSON, но там какая-то ерунда получается. Видимо он не для этого… Либо я не разобрался.
Как из DDD следуют приватные поля в моделях? И уж что точно ему противоречит, так это маршаллинг моделей в JSON
Дело в инкапсуляции данных. Если коротко, то по той же причине, по которой в Time скрыты вот эти поля: wall uint64 ext int64 loc *Location
я лично забил на этот момент и часто делаю поля публичными. Надо ответить на вопрос: от кого мы инкапсулируемся/защищаемся. Если этот доменный объект включен в какой-то общий пакет, тогда скорее всего нужны приватные поля. Может если над кодом работают много человек тоже надо. В остальных случаях от самого себя нет смысла защищаться
Мне кажется, что это из разряда “если с кем-то встречась сегодня, то почищу зубы”. Любой коммерческий проект рано или поздно умрёт или появятся дополнительные разработчики. Сменится тот, кто поддерживает проект и прочее. А также может выделится в отдельный пакет, особенно на Го, как мне кажется, это наиболее вероятно. Поэтому уже сейчас работа с ценами и стоимостью через int привела к проблемам даже в маленькой команде. Кто-то забыл или не понял, что это в центах. А кто-то не понял в какой точности объем биткоина, и в какой эфириума… В общем, проблем много. И все они ушли после внедрения инкапсуляции. Да и ещё в сложных сервисах сразу всплыли ошибки при математики с ценами. Оказывается в некоторых случаях сравнивались или складывались несовместимые Amount. Это когда Amount был для разных Asset. Грубо говоря, биткоин складывался с долларом, что в случае использования int не выдаст ошибки, но приведёт к логической ошибке в коде.
Я вам так скажу: крайне сложно защитить код от глупого или ленивого программиста. Ибо он всегда может кастануть типы и сложить int-ы. В приведенном вами примере я не вижу плюсов в приватных полях. Достаточно описать валюту как тип и сделать для нее операции сложения и т.д.
Не могу с Вами согласиться… Если я вижу структуру с открытым полем, то логично сделать вывод, что я могу её поменять, вывести и тп Если открытых полей нет, то любой программист озадачится вопросом, а какие есть у неё методы для работы с данными? И с 90% вероятностью найдёт нужный и использует его. В случае наличия открытых полей 90% программистов не станут разбираться в методах. Кроме того, в 90% случаях обязательно кто-то привяжется к этим полям во внешнем коде. Что при желании отрефакторить внутреннюю структуру приведёт к проблемам. А если инициализация структуры требует валидации входных данных, то с открытыми полями совсем печально. Даже при наличии конструктора всегда есть возможность инициализации напрямую. В общем, есть масса условий при которых я бы не стал так делать…
Для монги нужен отдельный контракт с публичными полями. Тогда всё будет нормально маршаллиться
Обсуждают сегодня