Как я должен структурировать приложение Java, где я помещаю свои классы?



Answers

Я большой поклонник организованных источников, поэтому я всегда создаю следующую структуру каталогов:

/src - for your packages & classes
/test - for unit tests
/docs - for documentation, generated and manually edited
/lib - 3rd party libraries
/etc - unrelated stuff
/bin (or /classes) - compiled classes, output of your compile
/dist - for distribution packages, hopefully auto generated by a build system

В / src я использую шаблоны Java по умолчанию: имена пакетов, начинающиеся с вашего домена (org.yourdomain.yourprojectname) и имена классов, отражающие аспект OOP, который вы создаете с помощью класса (см. Другие комментаторы). Также полезны такие общие имена пакетов, как util , model , view , events .

Я склонен ставить константы для определенной темы в собственном классе, например SessionConstants или ServiceConstants, в том же пакете классов домена.

Question

Прежде всего, я знаю, как создать Java-приложение. Но я всегда был озадачен тем, где поставить свои занятия. Есть сторонники для организации пакетов строго ориентированным образом, другие - отдельными.

У меня всегда были проблемы с

  • именование,
  • размещение

Так,

  1. Где вы помещаете свои специфичные для домена константы (и как лучшее название для такого класса)?
  2. Где вы кладете классы для вещей, которые являются как инфраструктурными, так и специфичными для домена (например, у меня есть класс FileStorageStrategy, который хранит файлы либо в базе данных, либо, альтернативно, в базе данных)?
  3. Где помещать Исключения?
  4. Существуют ли какие-либо стандарты, на которые я могу ссылаться?



Одна вещь, которую я нашел очень полезной для модульных тестов, заключалась в том, чтобы иметь файлы myApp / src /, а также myApp / test_src /. Таким образом, я могу размещать модульные тесты в тех же пакетах, что и те классы, которые они тестируют, и тем не менее я могу легко исключить тестовые примеры при подготовке моей производственной установки.




Названия классов всегда должны быть описательными и понятными. Если у вас есть несколько доменов ответственности за ваши классы, то их, вероятно, нужно будет реорганизовать.

Точно так же для вас пакеты. Они должны быть сгруппированы по областям ответственности. У каждого домена есть свои исключения.

Как правило, не потейте, пока не дойдете до точки, где она становится подавляющей и раздутой. Затем сядьте и не используйте код, просто переформатируйте классы, регулярно компилируя, чтобы убедиться, что все работает. Затем продолжайте, как и раньше.




Я думаю, держать это просто и не думать об этом. Не переусердствуйте и не сложите слишком много. Просто держите его аккуратным, и, поскольку он растет, рефакторинг является тривиальным. Одной из лучших возможностей IDE является рефакторинг, поэтому почему бы не использовать его и не избавить вас от способности мозга решать проблемы, связанные с вашим приложением, а не мета-проблемы, такие как организация кода.




Одна вещь, которую я делал в прошлом - если я расширяю класс, я попытаюсь следовать их соглашениям. Например, при работе с Spring Framework у меня будут свои классы MVC Controller в пакете com.mydomain.myapp.web.servlet.mvc. Если я не расширяю что-то, я просто перехожу к тому, что является самым простым. com.mydomain.domain для объектов домена (хотя, если у вас есть тонна объектов домена, этот пакет может стать немного громоздким). Для доменных констант я фактически ставил их как общедоступные константы в наиболее родственный класс. Например, если у меня есть класс «Member» и максимальная константа длины имени члена, я помещаю его в класс Member. В некоторых магазинах есть отдельный класс Constants, но я не вижу значения для объединения несвязанных чисел и строк в один класс. Я видел, как некоторые другие магазины пытаются решить эту проблему, создав классы SEPARATE Constants, но это просто кажется пустой тратой времени, и результат слишком запутан. Используя эту настройку, большой проект с несколькими разработчиками будет дублировать константы повсюду.




Links