Как стать автором
Обновить
Представьте, что вы оказались в шахте: перед вами каменный монолит, в котором что-то поблёскивает — куски золота, не иначе. Блеск заманчивый, но вокруг грубый камень. В разработке часто возникает похожая ситуация: полезный юзерам код со всех сторон окружён камнем в виде инфраструктуры, конвертеров данных и легаси. На помощь приходит микросервисная архитектура: огромную глыбу можно раздробить на кусочки, в каждом из которых камня поменьше, а полезного кода — побольше. ПСБ предлагает разработчикам .NET и Java поддаться золотой лихорадке: посмотрим, кто лучше добывает полезный код из монолита. Присоединяйтесь к своей команде и работайте на общую победу: в зачёт идёт каждый правильный ответ.
Нужно больше золота
Всего голосов 20: ↑12 и ↓8+15
Комментарии19

Комментарии 19

|А какие из перечисленных принципов SOLID уменьшают запутанность системы и увеличивают изолированность её модулей?

|А вот и нет. Принцип открытости/закрытости говорит скорее о правильности использования сокрытия, а не о том, насколько модульной получится конечная система.

После первого же вопроса решил дальше не продолжать. Если Open/Closed не способствует изолированности модуля, то пожалуй у нас разное понимание этого термина.

Open/Closed он же про наследование. А в модульных структурах composition over inheritance. Можно сделать жёстко сцепленный монолит, почти не нарушающий open/closed.

Полиморфный вариант не единственный. Для меня приоритетным прочтением будет принцип открытости/закрытости Мейера: A module will be said to be closed if [it] is available for use by other modules.

Собственно, при закрытости модуля, его изменения и расширения не влияют на другие модули. Если пойти от обратного, то отсутствие изолированности - это когда при изменениях модуля А необходимо изменить модуль Б.

Достигается это обычно через полиморфный принцип, введением абстракции (интерфейс - реализация).

OCP можно и в функциональном стиле сделать, и в процедурном, и в каком угодно.

Он не про наследование, а про расширение без модификации, то есть о наличии (закладывании) большого количества степеней свободы для кастомизации при расширении без модификации исходного модуля.

На плюсах это может быть достаточное количество шаблонных параметров или трейтов. В функциональных языках на каждый чих принимать внешние функции (желательно с поведением по умолчанию). Аспектно-ориентированное программирование - это тоже возможная реализация OCP. Ну и так далее.

абсолютно согласен.

Даже если внутри сложный адский класс , то использовать легко как , т.к. "вовне" всего 1 метод.

mySuberBilling.SPISAT_DENEG(userid, 55);

Больше тебе ничего не нужно знать. Если это не "уменьшают запутанность системы и увеличивают изолированность ", то ...

После первого же вопроса решил дальше не продолжать.

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

заминусовали, а ответить не удосужились. Так и живем )

Вот на том же вопросе офигел) А дальше вопрос про коммуникацию между сервисами, в котором шина данных - единственный правильный вариант

In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. 

Дядя Фаулер, не знаешь ты о чём пишешь, не добудешь золота.

Меня бесит, что подобное бывает на собеседованиях... Не то чтобы шина - не правильный вариант, но точно не единственно правильный. Но интервьюер, как и этот тест - булевая функция: надо угадать, что он загадал, а не дать правильный ответ.

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

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

Как будем обеспечивать взаимодействие между ними? Выберите самый распространённый в микросервисной архитектуре способ.

Взаимодействие зависит от бизнес-процессов. Что-то можно асинхронно (очереди, брокеры), а что-то нужно синхронно (api, rpc). События лучше через шину передавать, а что-то получить проще через http. Мне кажется, что синхронный самый распространённый, так как это проще и быстрее сделать. Довольно холиварный вопрос

Как я понимаю, речь идёт в основном про теорию, превалирующую в литературе по .NET микросервисам. Там что ни книжка, то шина событий. В реальной жизни все мы знаем, что сервисы могут и в БД друг к другу залезать если очень нужно :)

А посоветуйте к слову норм книжку на эту тему. Каноничные методы разработки микросервисов на .net, и всё такое.

Книг довольно мало, я знаю только одну и её редакции с 2018 года не обновлялись, а код там абсолютно нерабочий.

Вот здесь собранно куча паттернов, практик и тд, довольно полезный ресурс

Это был тест на время.

Спасибо, что предупредили.

класс может принимать к себе в конструктор объект другого класса и вызывать в нём нужные методы

И почему это не агрегация?

Агрегация -- это про хранение (поля объекта)

Внедрение -- это про получение (аргументы конструктора)

Прикольно. На 2 не ответил верно, потому что .WhenAll это инструмент ожидания всех а не запуска параллельных. Не верно здесь.
Ну и не знал про потокобезопасные массивы. Полезно)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий