Подтвердить что ты не робот

Является ли метод пакетной обработки хорошим?

Недавно я наткнулся на этот javalobby пост http://java.dzone.com/articles/how-changing-java-package на упаковку java-кода по функции.

Мне нравится идея, но у меня мало вопросов по этому подходу. Я задал свой вопрос, но не получил удовлетворительного ответа. Я надеюсь, что кто-то из StackOverflow может прояснить мои вопросы.

Мне нравится идея пакета по функции, которая значительно сокращает время перемещения по пакетам во время кодирования, и все связанные вещи будут находиться в одном месте (пакет). Но как насчет взаимодействия между службами в разных пакетах?

Предположим, что мы создаем приложение для блога, и мы помещаем все связанные с пользователем операции (контроллеры/службы/репозитории) в пакет com.mycompany.myblog.users. И все операции, связанные с блогами (контроллеры/службы/репозитории) в пакете com.mycompany.myblog.posts.

Теперь я хочу показать профиль пользователя вместе со всеми сообщениями, которые он опубликовал. Должен ли я называть myblog.posts.PostsService.getPostsByUser(userId) из myblog.users.UserController.showUserProfile()?

Как насчет связи между пакетами?

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

4b9b3361

Ответ 1

Отвечено где-то: взгляните на

Принципы дизайна упаковки

Он объясняет причины и мотивы этих принципов.

РЕДАКТИРОВАТЬ: У меня был исходный ответ более двух лет назад. Но он не изменился, поскольку он был принят. Но измените его так, чтобы любой новый посетитель мог извлечь выгоду и избежать гниения ссылок, как это было предложено @bPraktik.

Классы, которые повторно используются вместе, должны быть упакованы вместе, чтобы пакет можно рассматривать как своего рода полный продукт, доступный для вас. И те, которые повторно используются вместе, должны быть отделены от тех, которые не используются повторно. Например, ваши классы утилиты ведения журнала не обязательно используются вместе с вашими файлами io-классов. Таким образом, все они записываются отдельно. Но классы регистрации могут быть связаны друг с другом. Итак, создайте своего рода полный продукт для ведения журнала, скажем, из-за отсутствия лучшего имени для обмена сообщениями в его (повторно) используемом банке и другом отдельном полном продукте для io-утилит, опять же из-за отсутствия лучшего имени, например, io.jar. Если вы обновите библиотеку commons-io, сообщите о поддержке java nio, вы можете не захотеть внести какие-либо изменения в библиотеку протоколирования. Разделить их лучше.

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

Избегайте циклических зависимостей. a зависит от b; b на c; c на d; но d зависит от a. Сценарий, очевидно, сдерживает, так как будет очень сложно определить слои или модули и т.д., И вы не сможете изменять их независимо друг от друга.

Кроме того, вы можете упаковать ваши классы таким образом, чтобы при изменении слоя или модуля другой модуль или слои не обязательно должны меняться. Так, например, если вы решите перейти от старой среды MVC к обновлению API для остальных, то только просмотр и контроллер могут нуждаться в изменениях; вашей модели нет.

Ответ 2

Там много другого аспекта, кроме сочетания для дизайна упаковки, я бы предложил посмотреть на OOAD Priciples, особенно для дизайна пакетов, например

REP Принцип эквивалентности повторного использования Гранула повторного использования является гранулой выпуска.

CCP Принцип общего закрытия Классы, которые изменяются вместе, упаковываются вместе.

CRP Общий принцип повторного использования Классы, которые используются вместе, упаковываются вместе.

ADP Принцип ациклических зависимостей График зависимости пакетов не должен иметь циклов.

SDP Принцип стабильных зависимостей Зависит от стабильности.

SAP Принцип стабильных абстракций Абстракция увеличивается со стабильностью.

для получения дополнительной информации вы можете прочитать книгу "Разработка, принципы, шаблоны и практика Agile Software"

Ответ 3

Мне лично нравится подход "пакет по функциям", хотя вам нужно очень много судить о том, где рисовать границы пакетов. Это, безусловно, приемлемый и разумный подход во многих обстоятельствах.

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

Совершенно нормально, если пакет "сообщения в блогах" вызывается в пакет "users", если он использует хорошо разработанные публичные интерфейсы для этого.

Один большой совет, хотя если вы пойдете по этому подходу: будьте очень внимательны к своим зависимостям и, в частности, избегайте круговых зависимостей между пакетами. Хороший дизайн должен выглядеть как дерево зависимостей - с областями функциональности более высокого уровня в зависимости от набора общих сервисов, которые зависят от библиотек функций полезности и т.д. В какой-то степени это будет выглядеть как архитектурные "слои", end пакеты, вызывающие вспомогательные службы.