Как стать автором
Обновить
32
0
Andrii Bui @andreyka26

Software Engineer II

Отправить сообщение
Почему два? Вы понимаете недостатки двух микросервисов?
Да, понимаю. Это даст сложности в деплоинге, в разроботке, по финансам, о если говорить, о том случае, когда проект начнет расти — это окупится, потому что, скорее всего, на неё бы перешли при росте сложности.

Почему два? потому что принципиально разные ответственности и причины для изменения у них.
Окей, дайте точное определени «текущей» абстракции.

И что же вы скажете в этом случае про ОС. У них очень даже неплохо получилось абстрагироваться от железа. Насколько все проще становиться, когда тебя не заботит как все устроенно там, под коробкой, ты просто используешь интерфейс. Это экономит время, ресурсы.
Я не знаю, как работает aws lamda. Поэтому я не знаю. Я бы выбрал первый, если это единственные реквайрменты.
Было бы два микросервиса, один на артиклы, другой на фидбек. Если нужно будет что-то дополнительное реализовать, мне будет проще это добавить. К примеру скажу что может поменятся. Артиклы могут расти, и хранить все в еластике станет лишним. Например, в моем проекте, все с серч енджайна тянется только айдиха, потом уже от модельки, мы подтягиваем необходимые данный с постгресса. Это к слову тоже отдельные логики, ибо постгрес может с легкостью сменится на MYSQL, к примеру. И что бы в одном методе не менять какой то синтаксис SQL, и редеплоить все — я поменяю это только в компоненте, отвечающего за доступ к бд.
Кстати, забавно. Джоэл Спольски, который озвучил «закон текущих абстракций» («All non-trivial abstractions, to some degree, are leak
Мельком пробежался по статейке, что-то в этом есть. Я не буду как то это комментировать, в следствие того, что человек имеет побольше опыта, я сейчас говорю о ТСП, не как о гарантии доставки, а о том, что они вынесли логику, независимую одну от другой отдельно. И это позволяет так просто свичнуться к примеру с TCP на UPD, и не нужно ничего делать с двумя нижними лейерами.
Гм. У меня весь код, отвечающий за полнотекстовый поиск — это формирование HTTP-запроса к ElasticSearch. Вы мне предлагаете его выделять в отдельный компонент?
Да, потому что, допустим, потом появится реквайрмент считать количество запросов от юзера, илислать какой-то ивент на екстернал, когда серч енджайн тыкнули — это может призвести к виолейшн перечесленных принципов. Поэтому, я б вынес.
Например, расскажите мне, как именно я должен применить REP к своей задаче. Или, еще веселее, CCP — что именно является компонентом в моей задаче?

окей, по CCP: если нужно полнотекстовый поиск — это отдельный кусок логики, который можно выделить как отдельный компонент:
Gather into components those classes that change for the same reasons and at the same times.
Потому что что запихнуть туда ещё и логику валидации — это виолейшн этого принципа — ибо валидация может менятся независимо от серч енджайна. Вот, один простенький пример
Нужно, нужно. Даже у вас нужно как минимум два места обойти. А теперь я вам добавлю веселья: если этот же сценарий вызывается из браузера, проверка должна делаться на клиентской стороне (отзывчивость, вот это всё).

Не нужно, если ты уже раз видел где валидация на проекте.

Так как же узнать, в каком из двух (на самом деле — больше) «там» валидация, ни у кого не спрашивая? Вы только что говорили, что если сказано, что «по DDD», сразу понятно, где.

Окей перефразирую — ты будешь знать где валидации точно не может быть. И я ещё раз повторяю, в вашем примере не вижу ничего плохого, что бы держать валидацию в контрллере. теперь представьте, там моделька на 15 пропертей, и в каждой делать иф, потом ещё логику в контроллер запихнуть — это уже посложнее будет выглядеть, и разобраться в этом посложнее будет. Ну лично мне проще перейди в какую-то папочку «validation», и разобраться там с 20 строками, нежели бегать по всему екшене на 400 строк.

Мне кажется, вы пока даже не понимаете мою мысль, о каком уж подтверждении тут говорить.

Ну пока, конкретные мысли которые вы пытались донести, кроме 100500 вопросов лично мне:
— абстракции текут, в прочем, разработчики ОС, например, разработчики TCP\IP доказали, что не всегда они текут.
— что на мое «напихать всю логику в контроллере» — вы ответили, «а что в этом плохого». И виолейшн обычного SOLID принципа — это в порядке вещей, и тоже нормально. С чем я тоже, не согласен. В большинстве случаев, это может привести к проблемам.
Ну как минимум SOLID, Reuse\release equivalenxe, common closure, common reuse principles, и ещё ряд рекомендаций, почему — там автор и говорит.
И где же? Вот представьте себе, что я вам сказал, что в этом примере все по DDD. Дальше что?


так как имеем дело с инпутом, скорее всего должно быть в апликейшн лейере. так же, если это уже относится к Домену, валидация и некоторые констрейны могут быть и в домене, в какой-то ентите к примеру. Так или иначе, если вся валидация там или там, то она на весь сервис там будет. И не нужно будет искать каждый раз в разном месте.

Пока что вам не удалось никак эту мысль подтвердить.

как и вам — вашу. Как по мне, накидать все в екшн контроллера и сказать «что в этом плохого» — так себе идея. по крайней мере не видел такого ни в одном коммерческом проекте, и ни одного совета ни от одного дева, кроме вас, делать так.
Вот только это будущее, а мне сейчас писать надо. Как мне сейчас писать?

Есть готовые решения, которые минимизируют возможность налажать, готовые принципы — которым можно следовать. В книге эти принципы и описаны.
Ну то есть что читай книжки, что не читай, что следуй паттернам, что не следуй — все равно надо идти и спрашивать. В чем тогда смысл?
в том, что если скажут, там все по DDD, ты сразу поймешь где они должны бы быть.

А теперь давайте это сравним с вашим же утверждением из поста:

И где тут противоречие? Следуя принципам, разумным, естевственно, вероятность налажать будет меньше, я думаю.
Ну вот вам конкретный пример: я пишу веб-сервис (в том смысле, что он общается с внешним миром посредством JSON по HTTP), который должен обеспечивать полнотекстовый поиск по базе статей и отслеживать качество этого поиска на основании пользовательского отклика. Как мне оценить качество его архитектуры?


Я думаю, что на протяжении развития проекта, будут возникать новые требования на новые фичи, если текущая архитектура будет затруднять по ресурсам и времени их имплементацию. Во время обдумывания имплементации новых фич, вы осознаете, к примеру, что если бы я когда-то сделал по -другому, не было бы такой проблемы сейчас. И вот чем больше таких проблем — тем хуже архитектура, я думаю. А сразу оценку сделать, сложно я думаю. На то и придумали такие рекомендации как SOLID и Dependency Rule, что бы четко видеть, где может быть плохо сразу. По этому если ребята берут DDD, то держат домен независимым, по тому же Dependency rule. Хотя в в тот момент это может быть и не нужно, но для возможных будущих проблем это делается.
никак не можно считать сходной моделью конроллера — бизнес моделью — опять таки виолейшн SRP.
Я не понимаю, что вы хотели сказать.


Входная модель контролера — не имеет ничего общего с Доменом

Попробуйте просто перечислить, сколько уже мест, где искать валидацию, вы назвали, и сколько еще потенциально есть. Знаете, просто в списочек.


Если вы — новый человек в проекте — то нужно, наверное, спросить в ответственного человека — какая архитектура, и какой компонент ответственный за валидацию — и искать её там. Нету точного определения, где должна быть валидация, как и вообще нету конкретных стандартов правильной архитектуры, ну или киньте мне какой-то аналог RFC, где бы четко было прописано «как надо». Нужно прежде всего думать. А книга это набор принципов и инструментов, которые можно использовать — можно не использовать, никто же не запрещал. Только вот в нужном месте использование их — уменьшит вероятность нагавнить своим «велосипедом»
Вы не правы. Длина пароля — это бизнес-правило.


Ну тогда, этот инпут должен конвертироваться в доменную модель, которая, в свою очередь должна валидить. никак не можно считать сходной моделью конроллера — бизнес моделью — опять таки виолейшн SRP.

Даже в случае с юзер сервисом, должен быть валидатор, я думаю, как отдельный сервис, и в нем уже искать валидацию. либо же не усложнять себе жизнь и прописать все в контроллере. Если это позволяет сложность.

(я, собственно, не понимаю, что за «валидация инпута», которая не вызвана бизнес-правилами)


Насколько мне известно, валидация инпута, и бизнесс-констрейнты — это разные вещи.
Гм. А я-то думал, проверка бизнес-ограничений в бизнес-слое быть обязана… И как же на самом деле надо делать?
Может быть я не прав, но это не бизнес правило — это валидация инпута.

И это первый раз, когда вы вообще упоминаете борьбу со сложностью как критерий качества.
Так или иначе, я его упомянул.
Ну да, потому что из таких вопросов и состоит выбор архитектуры. Странно, да?
так давайте конкретный пример и обсуждать, а не абстрактно говорить, если хотите не абстрактных и цикличных ответов.

ну а если внесет — ресурсы будут больше, насколько мне известно.

Если захочет внести эти изменения потом — они выйдут дороже, нежели подготовка к этим изменениям на раннем этапе проекта.(Ошибки проектирование — самые дорогие)
В каком из вариантов вы поменяете сообщение быстрее? Если этот вопрос кажется вам издевательским, то вот вам более интересный: где вообще искать это сообщение во втором случае?

Есть для этого разного рода валидаторы, от дефолтных аспнетовских — где можно атрибутами навешать почти все констрейнты — до флюент валидаторов.
Но конкретно в этом примере — оставить это в контролере это нормально, потому что далеко не факт, что юзерСервис должен валидацией заниматься.

За этим, я думаю, надо в устанавливающие документы идти. Но что-то мне кажется, что не для легкости изменений, нет.
Не только за этим, но за этим в ТОМ ЧИСЛЕ. Потому что, с такисм пожзодом легко свичнуться например с UDP -> TCP, и при этом логика IP & LINK лееров будет не затронута, их не надо апдейтить, редеплоить и т.п. ВОТ одна из причин почему, я думаю. Плюс к тому, для борьбы со сложностью, потому что каждый леер представляет довольно сложно реализующуюся логику с разного рода алгоритмами и т.д.
Что для легкости изменения не нужна, скажем, архитектура со слоями (и много других «правил» тоже мешают).


Ну тогда зачем ребята делали абстракцию, например, на TCP\IP стеке?? Там тоже все на леерах, и она вроде-бы не течет, по крайней мере за столь бедный опыт, не было проблем с этим. Ребята дали абстракцию для работы с сетью (сокет), Никто не пишет логики поиска роута, логики транслирования битов в электрические или радио сигналы. ПОЧЕМУ? Почему сделали абстракцию над тем самым ассемблером, почему вы не пишите все на нем? Раз уж вы считаете, что абстракции текут — откажитесь совсем от них, они не несут, как вы сказали ничего полезного. По вашим словам, и простоты они не добавляют, и легкости изменения не дают.
то есть мы приходим к тому, что «хорошая архитектура» зависит от проекта? А как понять, какая архитектура хороша для конкретного проекта?
Ну если простота сервиса позволяет не делать 100500 абстракций, лейеров и т.д. То нет нужды их делать просто так. Майкрософты в книжке хорошо про это писали. Один сервис они иплементнули просто как CRUD, за'DI'или ормку в контролер, и написали 4 метода CRUD. Потому что сервис простой, и его низкая сложность позволяет так сделать. С другой стороны — они применили DDD принципы при разработке другого -более сложного сервиса. Они могли их применить их и в случае первого, только смысла и денег для этого нет.
Ну то есть критерий «как правильно» — это легкость изменения? Все мои аргументы остаются валидными, значит.


Напомните, какие аргументы? Я понмню только кучу вопросов.

Информация

В рейтинге
Не участвует
Откуда
Украина, Украина
Зарегистрирован
Активность