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

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

Особенно интересно мнение людей которые уже сталкивались с таким.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089635
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если фичи мелкие то часто получается структура из пакетов фичи где внутри по одному классу. если проект долгожвущий со временем становися очень много пакетов фич, в IDE не влазит а удалять вроде как не хочется вдруг что используется (заказчик сторонний и сам управляем что работает а что нет).
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089644
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,
Странный ты.
ИС уже 20 лет резали по функционалу и по предмету бизнес задач.
А вот внутри подсистема резалась на слои... DAO и т.д.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089645
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,
Конечно, фичи это слишком мелко. Согласен.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089697
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
Package by feature - подводные камни
    #40089704
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Package by feature - подводные камни
    #40089859
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у Станислава фичи - слабосвязные между собой то это хорошая практика. Получается что внедрение новой фичи
почти не затрагивает старый код. Минимум изменений - всегда знаешь где искать баг.

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

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

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

Код: 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
Package by feature - подводные камни
    #40089901
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolchanov,
Согласен. Вообще все крутится вокруг фич))).
Ну а для удобства Внутри фичи, делай и дели на что угодно.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089902
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Для кого то фича это - ТорговляИсклад.
Для кого то фича это - справочник валют.
На сколько бить систему вопрос сложный.
Думаю доменные куски у него и есть как раз Справочник валют.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089911
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
Package by feature - подводные камни
    #40089920
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev, просто мне на секунду показалась что количество пакетов возводится в квадрат.
Ну... знаешь когда тебе надо каждый с каждым сочетать. Это как конвертер их классов {m} в {n}.
Если не делать косвенных уровней абстракции то тебе надо кодить m*n сущностей-конвертеров.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089928
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
user
  |_access
  |     |...
  |...
branch
  |...
topic
  |_post
  |    |...
  | ...
privatemessage
  |...



Сущность это класс. А класс это таблица. Понятно что ты зачастил сударь)))
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089934
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут два аспекта.
- практический. После года программирования, прогер и так увидит что выше деление слишком частое.
- теоретический
Если работать по ГОСТ, то в п. 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
Package by feature - подводные камни
    #40089935
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что большинству из нас эти госты не нужны. Так... потеря времени.
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089938
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я думаю что большинству из нас эти госты не нужны. Так... потеря времени.
а можно спросить альтернативу?
А то говорят и пол сейчас не нужен)))))
...
Рейтинг: 0 / 0
Package by feature - подводные камни
    #40089941
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Вот ты выше сказал "пакет пухнет". Назови обратный процесс.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Package by feature - подводные камни
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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