|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Последние полгода на одном из своих проектов я перешел на необычный для меня концепт - package by feature . Суть его в том что мы не делим проект на пакеты типа model, dao, service, controller. Вместо этого мы делим их по фичам, и внутри фича-пакета у нас классы всех слоев. Пока я очень доволен - структура проекта отражает то что он делает, кол-во public классов уменьшилось, наверно, раза в 3. Однако проект пока скромных размеров (без тестов это 25 kloc на бэке), а на мелких проектах все подходы выглядят хорошо. Особенно интересно мнение людей которые уже сталкивались с таким. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2021, 10:18 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2021, 10:36 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, Странный ты. ИС уже 20 лет резали по функционалу и по предмету бизнес задач. А вот внутри подсистема резалась на слои... DAO и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2021, 11:16 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
lleming, Конечно, фичи это слишком мелко. Согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2021, 11:18 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
lleming если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет). Вообще мне сложно представить как может в пакете один класс оказаться, ведь очень вероятно что ему нужно что-то отдать на UI или сохранить что-то в БД. Вот, например, простенький пример где нужно лишь получить запрос с UI и ответить обратно: Код: sql 1. 2. 3.
Я не думаю что (во всяком случае в моей ситуации) пакет может быть меньше этого. Разве что и запрос, и ответ - примитивы, тогда останется только RegressionApi. А вот пакет по-серьезней, который возможно следует нарезать по-тоньше, но здесь нет БД и API: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
А вот более типичный пакет где все слои есть: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2021, 14:10 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev lleming если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет). Вообще мне сложно представить как может в пакете один класс оказаться, ведь очень вероятно что ему нужно что-то отдать на UI или сохранить что-то в БД. Вот, например, простенький пример где нужно лишь получить запрос с UI и ответить обратно: Код: sql 1. 2. 3.
Я не думаю что (во всяком случае в моей ситуации) пакет может быть меньше этого. Разве что и запрос, и ответ - примитивы, тогда останется только RegressionApi. А вот пакет по-серьезней, который возможно следует нарезать по-тоньше, но здесь нет БД и API: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
А вот более типичный пакет где все слои есть: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Тяжелое наследие Java и ООП головного мозга. Если убрать весь шум из геттеров, сеттеров, конструкторов и equals\hashcode, то всю доменную модель можно уместить в одном файле Models. Также, из-за наличия стейта в классах и неудобства оформления\переиспользования лямбд - приходится городить все эти AreaIntegrator, DigitalFilter и т.п хрень, которые по сути являются функциями, которые принимают что-то на вход и выдают детерменированный результат и поэтому могут быть отправлены в неймспейс calc либо math либо filters. У меня обычно feature это объект Model, объект Service, и возможно API(но тут надо взвесить все за и против, зачастую оно нафиг не надо). Ну и общий подпроект common со всякими утилсами(иногда имеет делать общий на проект, иногда на фичу) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2021, 14:42 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Если у Станислава фичи - слабосвязные между собой то это хорошая практика. Получается что внедрение новой фичи почти не затрагивает старый код. Минимум изменений - всегда знаешь где искать баг. Но мне кажется что это может быть специфика напрмимер маркетинг-акций. Акция длилась 1 мес. Под нее писались изолированные покеты (или слабосвязные). Потом она закончилась и ее логика уже по сути не нужна. И еще в голове почему-то вертится Blue-Green deployment и мне кажется что это по духу близко к теме топика. Такой-себе безобрывный и надежный деплой. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 13:53 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
maytonЕсли у Станислава фичи - слабосвязные между собой то это хорошая практика. Получается что внедрение новой фичи почти не затрагивает старый код. Минимум изменений - всегда знаешь где искать баг.Было бы здорово конечно, но в моем случае это все-таки не так. Наверно слово "feature" в этом подходе сбивает с толку. Я бью пакеты по куску домена, и уж если внутри большого пакета наклевывается какая-то фича, тогда получается еще создать пакет вот только с этой фичей. Но пока это редкость. maytonИ еще в голове почему-то вертится Blue-Green deployment и мне кажется что это по духу близко к теме топика. Такой-себе безобрывный и надежный деплой.Не, с деплоем это никак не связано. Все пакеты (независимо от разбиения) попадают в общий итоговый артефакт. И если нам нужен беспрерывный деплой, то в любом случае нужно какой-то код написать или конфигурацию изменить. Т.е. изменения потребуются те же вне зависимости от того как мы на пакеты нарежем. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 14:41 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, Вот твой соседний топик - утилита а ля информационная система (ИС). Ты пакеты как нарезаешь? Я к тому что пакет org.apache.catalina.authenticator.My..... Вполне решает задачи ТС штатным образом. Или у него пакет не org.apache.catalina.authenticator.My..... А такой: app.myDAO? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 14:42 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, >Я бью пакеты по куску домена = ну вот вам и причина. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 14:45 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
кусок домена = микросервис, не? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 14:50 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
забыл ник кусок домена = микросервис, не? Без них. Кстати, кусок домена странная фраза. Хоть с сервисами, хоть без них))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 14:55 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
>Последние полгода на одном из своих проектов я перешел на необычный для меня концепт - package by feature. Мы пришли к похожему решению в одном из продуктов, а также оставивли только final public классы доступными снаружи этих пакетов (см. https://en.wikipedia.org/wiki/Fragile_base_class или https://codeburst.io/inheritance-is-evil-stop-using-it-6c4f1caf5117) Причина: - у нас продукт состоит из нескольких фич-доменов. - проекты внедрения у заказчика забирают часть функциональных доменов и кастомизируют продуктовое поведение Такой подход позволяеет уменьшить импакт при выпуске патча или новой версии на проекты. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 16:49 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Было бы здорово конечно, но в моем случае это все-таки не так. Наверно слово "feature" в этом подходе сбивает с толку. Я бью пакеты по куску домена, и уж если внутри большого пакета наклевывается какая-то фича, тогда получается еще создать пакет вот только с этой фичей. Но пока это редкость. Непонятно что такое "кусок домена". Можно пример? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 16:55 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
deleted ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 16:58 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Тема топика была - подводные камни. И мне кажется что подводным камнем может быть просто распухание системы имен пакетов. Код: java 1. 2. 3. 4. 5. 6. 7. 8.
И некая бюрократия. Возможно в каком-то 2025 году будет сложно собрать части одного слоя т.к. он распылен по большому количеству пакетов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 17:06 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
kolchanov, Согласен. Вообще все крутится вокруг фич))). Ну а для удобства Внутри фичи, делай и дели на что угодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 17:13 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, Для кого то фича это - ТорговляИсклад. Для кого то фича это - справочник валют. На сколько бить систему вопрос сложный. Думаю доменные куски у него и есть как раз Справочник валют. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 17:18 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton Stanislav Bashkyrtsev Было бы здорово конечно, но в моем случае это все-таки не так. Наверно слово "feature" в этом подходе сбивает с толку. Я бью пакеты по куску домена, и уж если внутри большого пакета наклевывается какая-то фича, тогда получается еще создать пакет вот только с этой фичей. Но пока это редкость. Непонятно что такое "кусок домена". Можно пример? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
В каждом пакете может быть как одна или несколько Сущностей, так и DAO, Service, API, DTO классы. Мм.. возможно даже вызовы к внешним сервисам. maytonВозможно в каком-то 2025 году будет сложно собрать части одного слоя т.к. он распыленВот я сначала тоже переживал, а потом подумал.. а зачем бы это надо было. maytonИ мне кажется что подводным камнем может быть просто распухание системы имен пакетов.А разве мы получаем много новых пакетов? Раньше было: Код: sql 1. 2. 3.
И если пакет распухал, то внутри model & service мы создавали пакет branch. А теперь: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 18:02 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, просто мне на секунду показалась что количество пакетов возводится в квадрат. Ну... знаешь когда тебе надо каждый с каждым сочетать. Это как конвертер их классов {m} в {n}. Если не делать косвенных уровней абстракции то тебе надо кодить m*n сущностей-конвертеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 18:25 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Сущность это класс. А класс это таблица. Понятно что ты зачастил сударь))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 18:43 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Тут два аспекта. - практический. После года программирования, прогер и так увидит что выше деление слишком частое. - теоретический Если работать по ГОСТ, то в п. 4.1.1.1 есть перечень подсистем. Это и есть прекрасная возможность поделить на пакеты) http://www.rugost.com/index.php?option=com_content&view=article&id=108:34-4-8&catid=25&Itemid=62 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:04 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Я думаю что большинству из нас эти госты не нужны. Так... потеря времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:06 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton Я думаю что большинству из нас эти госты не нужны. Так... потеря времени. А то говорят и пол сейчас не нужен))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:09 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, Вот ты выше сказал "пакет пухнет". Назови обратный процесс. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:11 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, Вот ты ляпнул как Стас про госты. В том числе международные. А как у вас заказчик договор заключает на производство ПО? Очень интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:15 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
У меня - в основном зарубежные. Они по ISO-* работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:18 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
PetroNotC Sharp mayton, Вот ты выше сказал "пакет пухнет". Назови обратный процесс. Сохнет? Сдувается? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:22 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton У меня - в основном зарубежные. Они по ISO-* работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:29 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton PetroNotC Sharp mayton, Вот ты выше сказал "пакет пухнет". Назови обратный процесс. Сохнет? Сдувается? Раздувается количество пакетов. Воинствующая безграмотность (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 19:31 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, давай проявим уважение к автору и не будем флудить. Я знаю ты - любитель поговорить на свои темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 21:52 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, Пост же про архитектуру?)) Или есть другие мнения как ее строить? Я не вижу мнений. Кроме извини, безграмотного - госты не нужны. Ну, говорите, кто вам мешает то)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 06:51 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Последние полгода на одном из своих проектов я перешел на необычный для меня концепт - package by feature . Суть его в том что мы не делим проект на пакеты типа model, dao, service, controller. Вместо этого мы делим их по фичам, и внутри фича-пакета у нас классы всех слоев. Пока я очень доволен - структура проекта отражает то что он делает, кол-во public классов уменьшилось, наверно, раза в 3. Однако проект пока скромных размеров (без тестов это 25 kloc на бэке), а на мелких проектах все подходы выглядят хорошо. Особенно интересно мнение людей которые уже сталкивались с таким. я не знал что это так называется и что такое есть - но я давно остоял свое решение по пакетированию у нас на проекте у меня оно как раз в рамках фичи,но фичи достаточно большой - чтобы она была удостоена отдельного пакета. Это супер удобно тем - что если у тебя на проекте хулирады репозиториев,сучностей и прочего - это не удобно идти в тот пакет общий и искать нужное тебе Гораздо удобней по фич пакету работать и в отладке и в разработке.Смысл держать все в одной бочке я не понимаю- ну да репозиторий пакет и там килотонны интерфейсов. По поводу публичности классов - ну это какой то пережиток уже наверно - что с того что твой класс будет не публичен? ты фреймворк пишешь или опасаешься что какой то мамкин хаклер твое пятирублевое приложение угонит? )так он и так угонит если захочет ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 18:45 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
O_79_OПо поводу публичности классов - ну это какой то пережиток уже наверно - что с того что твой класс будет не публичен?1. Более быстрая компиляция. Когда проект 30kloc - эт не такая большая проблема, когда же он вырастает до 200kloc - тут уж начинает раздражать что для запуска модульного теста нужно сначала полминуты ждать компиляции. 2. Ускоряет/упрощает рефакторинги и поиски. Когда что-то переименовываешь, то IDE не путается и не начинает искать несвязанные с этим кодом куски/комментарии, в которых фигурирует такое же название. 3. Но самое главное - это упрощает чтение проекта. Видишь класс и сразу понимаешь - это внутренности текущего пакета, и глобального влияния он никакого не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 19:19 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, итого, пакеты по фичам используют все отметившиеся прогеры. Иного подхода нигде не видно. Автора можно поздравить что он вернулся в лоно программистов. Вот такой вот флейм... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 19:55 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev O_79_OПо поводу публичности классов - ну это какой то пережиток уже наверно - что с того что твой класс будет не публичен? 2. Ускоряет/упрощает рефакторинги и поиски. Когда что-то переименовываешь, то IDE не путается и не начинает искать несвязанные с этим кодом куски/комментарии, в которых фигурирует такое же название. 3. Но самое главное - это упрощает чтение проекта. Видишь класс и сразу понимаешь - это внутренности текущего пакета, и глобального влияния он никакого не имеет. что ж у вас там за проекты то) у нас монолитный огромный монстр и вроде не было такой проблемы,чтобы мы прям вот задумались о модификаторах доступа? а что разве модификатор доступа каким то образом влияет на быстроту компиляции? пс. я давно уже думал над тем что модификатор доступа хорош только для написания каких то либ или фреймворков,в каком то коммерческом проекте - я вообще хз зачем оно ? только если попониться- поставить protected и пусть потом джуны ,как петро,гадают что тут задумано было)) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 19:56 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
O_79_O, ты в сторону не уводи топик)) ....ГОСТЫ выкинуть, public private protected - выкинуть)) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 20:01 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
PetroNotC Sharp O_79_O, ты в сторону не уводи топик)) ....ГОСТЫ выкинуть, public private protected - выкинуть)) Введение в последних версиях Java language spec. новых типов "record" упрощает взгляд на ООП. Разумеется рекорды не отменяют ООП но они хотя-бы расширяют окно Овертона. Раз можно не делать private здесь - то почему-бы не обсудить private в других местах и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 10:10 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, Не люблю в один топик все мешать. Ты уловил связь пакетов и уровня переменной классов? Я нет. 2. Нет ни кода ни примеров. Все кричат что нельзя без этого начинать топик. Ведь сутки выясняли у ТС что он сказал про "осколки домена") :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 10:24 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
mayton, "Ближе к коду не выходя за тему! Тогда можно обсуждать" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 10:26 |
|
Package by feature - подводные камни
|
|||
---|---|---|---|
#18+
Я думаю что ТС не даст кода. Ведь во первых в коде нет проблемы. А во вторых ТС делится положительным опытом использования методики. Ну и в третьих.... ну кто-ж тебе даст посмотреть продуктовый код? Вот и получается что можем только писать предположения. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 10:36 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120377]: |
0ms |
get settings: |
27ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
785ms |
get tp. blocked users: |
2ms |
others: | 287ms |
total: | 1163ms |
0 / 0 |