Я думал об этом некоторое время назад, и недавно он всплыл, когда мой магазин делает свое первое настоящее веб-приложение на Java.
В качестве вступления я вижу две основные стратегии именования пакетов. (Для ясности, я не имею в виду всю часть этого «domain.company.project», я говорю о соглашении о пакете под ним.) В любом случае, соглашения об именах пакетов, которые я вижу, следующие:
Функциональность: именование пакетов в соответствии с их архитектурной функцией, а не их идентичностью в соответствии с бизнес-областью. Другой термин для этого может быть именование в соответствии с «слоем». Итак, у вас будет пакет * .ui, пакет * .domain и пакет * .orm. Ваши пакеты представляют собой горизонтальные срезы, а не вертикальные.
Это гораздо более распространено, чем логическое именование. На самом деле, я не верю, что когда-либо видел или слышал о проекте, который делает это. Это, конечно, заставляет меня насторожиться (вроде как думать, что вы придумали решение проблемы NP), поскольку я не очень умен и полагаю, что у всех должны быть веские причины, чтобы делать это так, как они. С другой стороны, я не против того, чтобы люди просто скучали по слону в комнате, и я никогда не слышал реальных аргументов в пользу такого именования пакетов. Это просто стандарт де-факто.
Логика: присвоение имен вашим пакетам в соответствии с идентификаторами их бизнес-домена и включение в этот пакет каждого класса, имеющего отношение к вертикальной части функциональности.
Я никогда не видел и не слышал об этом, как я уже упоминал ранее, но для меня это имеет большой смысл.
Я предпочитаю подходить к системам вертикально, а не горизонтально. Я хочу заняться разработкой системы обработки заказов, а не уровня доступа к данным. Очевидно, есть большая вероятность, что я коснусь уровня доступа к данным при разработке этой системы, но дело в том, что я не думаю об этом так. Это, конечно, означает, что когда я получаю приказ на изменение или хочу реализовать какую-то новую функцию, было бы неплохо не копаться в кучке пакетов, чтобы найти все связанные классы. Вместо этого я просто смотрю в пакет X, потому что то, что я делаю, связано с X.
С точки зрения разработки, я считаю большой победой то, что ваши пакеты документируют вашу бизнес-область, а не вашу архитектуру. Мне кажется, что домен - это почти всегда та часть системы, которую труднее разобрать, поскольку архитектура системы, особенно на данном этапе, становится почти приземленной в ее реализации. Тот факт, что я могу прийти к системе с этим типом соглашения об именах и сразу по именованию пакетов знать, что она имеет дело с заказами, клиентами, предприятиями, продуктами и т. Д., Кажется чертовски удобным.
Похоже, это позволит вам лучше использовать модификаторы доступа Java. Это позволяет гораздо более четко определять интерфейсы в подсистемах, а не в уровнях системы. Поэтому, если у вас есть подсистема заказов, которая должна быть прозрачно постоянной, вы могли бы теоретически никогда не позволять никому другому знать, что она постоянна, не создавая общедоступные интерфейсы для своих классов постоянства на уровне dao и вместо этого упаковывая класс dao в только с классами, с которыми он имеет дело. Очевидно, что если вы хотите раскрыть эту функциональность, вы можете предоставить для нее интерфейс или сделать его общедоступным. Просто кажется, что вы многое теряете из-за того, что вертикальная часть функций вашей системы разделена на несколько пакетов.
Я полагаю, что один недостаток, который я вижу, заключается в том, что он немного затрудняет извлечение слоев. Вместо того, чтобы просто удалить или переименовать пакет, а затем вставить новый с альтернативной технологией, вы должны войти и изменить все классы во всех пакетах. Однако я не вижу в этом особого значения. Возможно, это из-за недостатка опыта, но я должен представить, что количество раз, когда вы меняете технологии, бледнеет по сравнению с количеством раз, когда вы входите и редактируете вертикальные срезы функций в своей системе.
Итак, я думаю, тогда у вас возникнет вопрос, как вы называете свои пакеты и почему? Пожалуйста, поймите, я не обязательно думаю, что наткнулся на золотого гуся или что-то здесь. Я новичок во всем этом, в основном с академическим опытом. Тем не менее, я не могу заметить пробелов в своих рассуждениях, поэтому надеюсь, что вы все сможете, и я смогу двигаться дальше.