Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Package by feature - подводные камни / 25 сообщений из 42, страница 1 из 2
09.08.2021, 10:18
    #40089630
Package by feature - подводные камни
Последние полгода на одном из своих проектов я перешел на необычный для меня концепт - package by feature . Суть его в том что мы не делим проект на пакеты типа model, dao, service, controller. Вместо этого мы делим их по фичам, и внутри фича-пакета у нас классы всех слоев.

Пока я очень доволен - структура проекта отражает то что он делает, кол-во public классов уменьшилось, наверно, раза в 3. Однако проект пока скромных размеров (без тестов это 25 kloc на бэке), а на мелких проектах все подходы выглядят хорошо.

Особенно интересно мнение людей которые уже сталкивались с таким.
...
Рейтинг: 0 / 0
09.08.2021, 10:36
    #40089635
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет).
...
Рейтинг: 0 / 0
09.08.2021, 11:16
    #40089644
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Stanislav Bashkyrtsev,
Странный ты.
ИС уже 20 лет резали по функционалу и по предмету бизнес задач.
А вот внутри подсистема резалась на слои... DAO и т.д.
...
Рейтинг: 0 / 0
09.08.2021, 11:18
    #40089645
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
lleming,
Конечно, фичи это слишком мелко. Согласен.
...
Рейтинг: 0 / 0
09.08.2021, 14:10
    #40089697
Package by feature - подводные камни
lleming
если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет).
У меня пока таких проблем не было. Видимо зависит от того что считать "фичей". Пока у меня разбиение по кускам домена, поэтому в пакете классов может быть прилично.

Вообще мне сложно представить как может в пакете один класс оказаться, ведь очень вероятно что ему нужно что-то отдать на UI или сохранить что-то в БД. Вот, например, простенький пример где нужно лишь получить запрос с UI и ответить обратно:
Код: sql
1.
2.
3.
RegressionApi
RegressionRequest
RegressionResponse

Я не думаю что (во всяком случае в моей ситуации) пакет может быть меньше этого. Разве что и запрос, и ответ - примитивы, тогда останется только 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.
apextrack
deriv
smooth
AreaIntegrator
AreaIntegratorFactory
Baseline
CachingDigitalFilter
CentralWeightedSum
CompoundFilter
DigitalFilter
ExactMaskMatch
IntegrationEvent
IntegrationEvents
IntegrationEventsBuilder
MaskMatcher
MockAreaIntegrator
NoOpFilter
PartialMaskMatch
PeakDetector
RecursiveFilter
SignalAverager
SummingAreaIntegrator
TrapezoidAreaIntegrator

А вот более типичный пакет где все слои есть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
masking
score
Injection
InjectionApi
InjectionDao
InjectionFullDto
InjectionInfo
InjectionMeta
InjectionMetaDto
InjectionService
PlateDimensions
PlatePosition
ReintegrationRequest
...
Рейтинг: 0 / 0
09.08.2021, 14:42
    #40089704
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Stanislav Bashkyrtsev
lleming
если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет).
У меня пока таких проблем не было. Видимо зависит от того что считать "фичей". Пока у меня разбиение по кускам домена, поэтому в пакете классов может быть прилично.

Вообще мне сложно представить как может в пакете один класс оказаться, ведь очень вероятно что ему нужно что-то отдать на UI или сохранить что-то в БД. Вот, например, простенький пример где нужно лишь получить запрос с UI и ответить обратно:
Код: sql
1.
2.
3.
RegressionApi
RegressionRequest
RegressionResponse

Я не думаю что (во всяком случае в моей ситуации) пакет может быть меньше этого. Разве что и запрос, и ответ - примитивы, тогда останется только 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.
apextrack
deriv
smooth
AreaIntegrator
AreaIntegratorFactory
Baseline
CachingDigitalFilter
CentralWeightedSum
CompoundFilter
DigitalFilter
ExactMaskMatch
IntegrationEvent
IntegrationEvents
IntegrationEventsBuilder
MaskMatcher
MockAreaIntegrator
NoOpFilter
PartialMaskMatch
PeakDetector
RecursiveFilter
SignalAverager
SummingAreaIntegrator
TrapezoidAreaIntegrator

А вот более типичный пакет где все слои есть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
masking
score
Injection
InjectionApi
InjectionDao
InjectionFullDto
InjectionInfo
InjectionMeta
InjectionMetaDto
InjectionService
PlateDimensions
PlatePosition
ReintegrationRequest



Тяжелое наследие Java и ООП головного мозга.
Если убрать весь шум из геттеров, сеттеров, конструкторов и equals\hashcode, то всю доменную модель можно уместить в одном файле Models. Также, из-за наличия стейта в классах и неудобства оформления\переиспользования лямбд - приходится городить все эти AreaIntegrator, DigitalFilter и т.п хрень, которые по сути являются функциями, которые принимают что-то на вход и выдают детерменированный результат и поэтому могут быть отправлены в неймспейс calc либо math либо filters.
У меня обычно feature это объект Model, объект Service, и возможно API(но тут надо взвесить все за и против, зачастую оно нафиг не надо). Ну и общий подпроект common со всякими утилсами(иногда имеет делать общий на проект, иногда на фичу)
...
Рейтинг: 0 / 0
10.08.2021, 13:53
    #40089859
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Если у Станислава фичи - слабосвязные между собой то это хорошая практика. Получается что внедрение новой фичи
почти не затрагивает старый код. Минимум изменений - всегда знаешь где искать баг.

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

И еще в голове почему-то вертится Blue-Green deployment и мне кажется что это по духу близко к теме
топика. Такой-себе безобрывный и надежный деплой.
...
Рейтинг: 0 / 0
10.08.2021, 14:41
    #40089866
Package by feature - подводные камни
maytonЕсли у Станислава фичи - слабосвязные между собой то это хорошая практика. Получается что внедрение новой фичи
почти не затрагивает старый код. Минимум изменений - всегда знаешь где искать баг.Было бы здорово конечно, но в моем случае это все-таки не так. Наверно слово "feature" в этом подходе сбивает с толку. Я бью пакеты по куску домена, и уж если внутри большого пакета наклевывается какая-то фича, тогда получается еще создать пакет вот только с этой фичей. Но пока это редкость.
maytonИ еще в голове почему-то вертится Blue-Green deployment и мне кажется что это по духу близко к теме
топика. Такой-себе безобрывный и надежный деплой.Не, с деплоем это никак не связано. Все пакеты (независимо от разбиения) попадают в общий итоговый артефакт. И если нам нужен беспрерывный деплой, то в любом случае нужно какой-то код написать или конфигурацию изменить. Т.е. изменения потребуются те же вне зависимости от того как мы на пакеты нарежем.
...
Рейтинг: 0 / 0
10.08.2021, 14:42
    #40089868
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
mayton,
Вот твой соседний топик - утилита а ля информационная система (ИС).
Ты пакеты как нарезаешь?
Я к тому что пакет
org.apache.catalina.authenticator.My.....
Вполне решает задачи ТС штатным образом.
Или у него пакет не
org.apache.catalina.authenticator.My.....
А такой:
app.myDAO?
...
Рейтинг: 0 / 0
10.08.2021, 14:45
    #40089869
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Stanislav Bashkyrtsev,
>Я бью пакеты по куску домена
= ну вот вам и причина.
...
Рейтинг: 0 / 0
10.08.2021, 14:50
    #40089873
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
кусок домена = микросервис, не?
...
Рейтинг: 0 / 0
10.08.2021, 14:55
    #40089876
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
забыл ник
кусок домена = микросервис, не?
не. У него по старинке)
Без них.
Кстати, кусок домена странная фраза. Хоть с сервисами, хоть без них)))
...
Рейтинг: 0 / 0
10.08.2021, 16:49
    #40089892
kolchanov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
>Последние полгода на одном из своих проектов я перешел на необычный для меня концепт - package by feature.

Мы пришли к похожему решению в одном из продуктов, а также оставивли только final public классы доступными снаружи этих пакетов (см. https://en.wikipedia.org/wiki/Fragile_base_class или https://codeburst.io/inheritance-is-evil-stop-using-it-6c4f1caf5117)
Причина:
- у нас продукт состоит из нескольких фич-доменов.
- проекты внедрения у заказчика забирают часть функциональных доменов и кастомизируют продуктовое поведение

Такой подход позволяеет уменьшить импакт при выпуске патча или новой версии на проекты.
...
Рейтинг: 0 / 0
10.08.2021, 16:55
    #40089895
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Stanislav Bashkyrtsev
Было бы здорово конечно, но в моем случае это все-таки не так. Наверно слово "feature" в этом подходе сбивает с толку. Я бью пакеты по куску домена, и уж если внутри большого пакета наклевывается какая-то фича, тогда получается еще создать пакет вот только с этой фичей. Но пока это редкость.

Непонятно что такое "кусок домена". Можно пример?
...
Рейтинг: 0 / 0
10.08.2021, 16:58
    #40089896
kolchanov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
deleted
...
Рейтинг: 0 / 0
10.08.2021, 17:06
    #40089898
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Тема топика была - подводные камни. И мне кажется что подводным камнем может быть просто
распухание системы имен пакетов.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
com.app.doctor
com.app.drug
com.app.patient
com.app.presription
com.app.report
com.app.security
com.app.webmaster
com.app.util



И некая бюрократия. Возможно в каком-то 2025 году будет сложно собрать части одного слоя т.к. он распылен
по большому количеству пакетов.
...
Рейтинг: 0 / 0
10.08.2021, 17:13
    #40089901
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
kolchanov,
Согласен. Вообще все крутится вокруг фич))).
Ну а для удобства Внутри фичи, делай и дели на что угодно.
...
Рейтинг: 0 / 0
10.08.2021, 17:18
    #40089902
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
mayton,
Для кого то фича это - ТорговляИсклад.
Для кого то фича это - справочник валют.
На сколько бить систему вопрос сложный.
Думаю доменные куски у него и есть как раз Справочник валют.
...
Рейтинг: 0 / 0
10.08.2021, 18:02
    #40089911
Package by feature - подводные камни
mayton
Stanislav Bashkyrtsev
Было бы здорово конечно, но в моем случае это все-таки не так. Наверно слово "feature" в этом подходе сбивает с толку. Я бью пакеты по куску домена, и уж если внутри большого пакета наклевывается какая-то фича, тогда получается еще создать пакет вот только с этой фичей. Но пока это редкость.

Непонятно что такое "кусок домена". Можно пример?
Ну если взять разработку форума, то мы могли бы получить такие пакеты:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
user
  |_access
  |     |...
  |...
branch
  |...
topic
  |_post
  |    |...
  | ...
privatemessage
  |...

В каждом пакете может быть как одна или несколько Сущностей, так и DAO, Service, API, DTO классы. Мм.. возможно даже вызовы к внешним сервисам.
maytonВозможно в каком-то 2025 году будет сложно собрать части одного слоя т.к. он распыленВот я сначала тоже переживал, а потом подумал.. а зачем бы это надо было.
maytonИ мне кажется что подводным камнем может быть просто
распухание системы имен пакетов.А разве мы получаем много новых пакетов? Раньше было:
Код: sql
1.
2.
3.
model.Branch
service.BranchService
...

И если пакет распухал, то внутри model & service мы создавали пакет branch. А теперь:
Код: sql
1.
2.
branch.BranchService
branch.Branch
...
Рейтинг: 0 / 0
10.08.2021, 18:25
    #40089920
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Stanislav Bashkyrtsev, просто мне на секунду показалась что количество пакетов возводится в квадрат.
Ну... знаешь когда тебе надо каждый с каждым сочетать. Это как конвертер их классов {m} в {n}.
Если не делать косвенных уровней абстракции то тебе надо кодить m*n сущностей-конвертеров.
...
Рейтинг: 0 / 0
10.08.2021, 18:43
    #40089928
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Stanislav Bashkyrtsev
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
user
  |_access
  |     |...
  |...
branch
  |...
topic
  |_post
  |    |...
  | ...
privatemessage
  |...



Сущность это класс. А класс это таблица. Понятно что ты зачастил сударь)))
...
Рейтинг: 0 / 0
10.08.2021, 19:04
    #40089934
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Тут два аспекта.
- практический. После года программирования, прогер и так увидит что выше деление слишком частое.
- теоретический
Если работать по ГОСТ, то в п. 4.1.1.1 есть перечень подсистем.
Это и есть прекрасная возможность поделить на пакеты)
http://www.rugost.com/index.php?option=com_content&view=article&id=108:34-4-8&catid=25&Itemid=62
...
Рейтинг: 0 / 0
10.08.2021, 19:06
    #40089935
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
Я думаю что большинству из нас эти госты не нужны. Так... потеря времени.
...
Рейтинг: 0 / 0
10.08.2021, 19:09
    #40089938
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
mayton
Я думаю что большинству из нас эти госты не нужны. Так... потеря времени.
а можно спросить альтернативу?
А то говорят и пол сейчас не нужен)))))
...
Рейтинг: 0 / 0
10.08.2021, 19:11
    #40089941
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Package by feature - подводные камни
mayton,
Вот ты выше сказал "пакет пухнет". Назови обратный процесс.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Package by feature - подводные камни / 25 сообщений из 42, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]