Czy istnieją najlepsze praktyki organizacji pakietów (Java)? [zamknięte]

zamknięte . To pytanie jest oparte na opinii. Obecnie nie przyjmuje odpowiedzi.

Chcesz poprawić to pytanie? zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 5 lat temu .

Popraw to pytanie

Jakiś czas temu zobaczyłem tutaj odpowiedź na pytanie dotyczące drobnoziarnistej organizacji pakietów java. Na przykład, my.project.util, my.project.factory, my.project.service, itd.

Nie mogę go znaleźć więc równie dobrze mogę zadać pytanie.

Czy istnieją najlepsze praktyki dotyczące organizacji pakietów w Javie i co w nich jest?

Jak zorganizować zajęcia w projekcie Java?

Na przykład projekt, nad którym pracuję z kilkoma osobami, ma pakiet o nazwie beans. Zaczęło się od projektu zawierającego proste fasolki, ale skończyło się (przez słabe doświadczenie i brak czasu) zawierającym wszystko (prawie). Trochę je wyczyściłem., umieszczając niektóre klasy fabryczne w pakiecie fabrycznym (klasy ze statycznymi metodami, które tworzą beans), ale mamy inne klasy, które wykonują logikę biznesową i inne, które wykonują proste przetwarzanie (nie z logiką biznesową), takie jak pobieranie wiadomości dla kodu z pliku właściwości.

Twoje przemyślenia i komentarze są mile widziane.

Author: Dherik, 2010-07-12

7 answers

Organizacja pakietów lub strukturyzacja pakietów jest zwykle gorącą dyskusją. Poniżej kilka prostych wskazówek dotyczących nazewnictwa i struktury pakietów:

  • postępuj zgodnie z Javą konwencje nazewnictwa pakietów
  • Uporządkuj swoje pakiety zgodnie z ich rolą funkcjonalną i biznesową
    • podziel Pakiety według ich funkcjonalności lub modułów. np. com.company.product.modulea
    • dalszy podział może być oparty na warstwach w oprogramowaniu. Ale nie przesadzaj, jeśli masz tylko kilka klas w pakiecie, wtedy ma sens mieć wszystko w pakiecie. np. com.company.product.module.web lub com.company.product.module.util itp.
    • unikaj przesadzania ze strukturą, IMO unikaj oddzielnych opakowań dla WYJĄTKÓW, fabryk itp. chyba, że jest pilna potrzeba.
  • Jeśli twój projekt jest mały, zachowaj prostotę z kilkoma pakietami. np. com.company.product.model i com.company.product.util itp.
  • spójrz na niektóre z popularnych projektów open source na Apache projekty . Zobacz, jak wykorzystują strukturyzację dla projektów o różnej wielkości.
  • W przeciwieństwie do innych serwletów, API servletów może być dystrybuowane w różnych pakietach (np. API servletów).]}

Po kilku eksperymentach i próbach powinieneś być w stanie wymyślić strukturę, z którą czujesz się komfortowo. Nie bądź skupiony na jednej konwencji, bądź otwarty na zmiany.

 181
Author: naikus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 12:14:27

Organizuję Pakiety według funkcji, a nie według wzorców czy ról implementacji. Myślę, że pakiety takie jak:

  • beans
  • factories
  • collections

Są w błędzie.

Wolę, na przykład:

  • orders
  • store
  • reports

Więc mogę ukryć szczegóły implementacji poprzez widoczność pakietu. Fabryka zamówień powinna znajdować się w opakowaniu orders, więc szczegóły dotyczące tworzenia zamówienia są Ukryty.

 190
Author: onof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-05 09:03:29

Krótka odpowiedź: jeden pakiet na moduł/funkcję, ewentualnie z pod-pakietami. Umieść ściśle powiązane rzeczy w jednym opakowaniu. Unikaj kolistych zależności między pakietami.

Długa odpowiedź: zgadzam się z większością tego artykułu

 42
Author: Peter Tseng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-06 22:19:19

Preferuję funkcję przed warstwami, ale to chyba zależy od Twojego projektu. Rozważ swoje siły:

  • zależności
    Spróbuj zminimalizować zależności pakietów, zwłaszcza między funkcjami. W razie potrzeby wyodrębnij interfejsy API.
  • Organizacja zespołu
    W niektórych organizacjach zespoły pracują nad funkcjami, a w innych nad warstwami. Wpływa to na sposób organizacji kodu, użycie go do sformalizowania interfejsów API lub zachęcanie do współpracy.
  • rozmieszczenia i wersjonowanie
    Umieszczenie wszystkiego w module sprawia, że wdrażanie i wersjonowanie prostsze, ale trudniejsze naprawianie błędów. Dzielenie rzeczy umożliwia lepsze Kontrola, skalowalność i dostępność.
  • Odpowiedz na zmianę
    Dobrze zorganizowany kod jest dużo prostszy do zmiany niż wielka kula błota.
  • Rozmiar (Ludzie i linie kodu)
    Im większy, tym bardziej sformalizowany / ustandaryzowany musi być.
  • Znaczenie / jakość
    Jakiś kod jest ważniejszy niż inne. Interfejsy API powinny być bardziej stabilne niż implementacja. Dlatego też należy je wyraźnie rozdzielić.
  • poziom abstrakcji i punkt wejścia
    Osoba z zewnątrz powinna wiedzieć, o co chodzi w kodzie i od czego zacząć czytanie, patrząc na drzewo pakietów.

Przykład:

com/company/module
  + feature1/
    - MainClass          // The entry point for exploring
    + api/               // Public interface, used by other features
    + domain/
      - AggregateRoot
      + api/             // Internal API, complements the public, used by web
      + impl/ 
    + persistence/       
    + web/               // presentation layer 
    + services/          // Rest or other remote API 
    + support/            
  + feature2/
  + support/             // Any support or utils used by more than on feature
    + io
    + config
    + persistence
    + web
To tylko przykład. To dość formalne. Na przykład definiuje 2 interfejsy dla feature1 . Zwykle nie jest to wymagane, ale może być dobrym pomysłem, jeśli używane inaczej przez różnych ludzi. Możesz pozwolić wewnętrznemu API rozszerzyć dostęp publiczny.

Nie lubię nazw 'impl' lub 'support', ale pomagają one oddzielić mniej ważne rzeczy od ważnych (domeny i API). Jeśli chodzi o nazewnictwo, lubię być jak najbardziej konkretny. Jeśli masz pakiet o nazwie 'utils' z 20 klasami, przenieś {[1] } do support / string, HttpUtil do support / http i tak dalej.

 22
Author: ThomasGran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-05 09:20:43

Czy istnieją najlepsze praktyki dotyczące organizacji pakietów w Javie i co w nich jest?

Nie bardzo. Jest wiele pomysłów i opinii, ale prawdziwą "najlepszą praktyką" jest używanie zdrowego rozsądku!

(proszę przeczytać No best Practices , aby zapoznać się z "najlepszymi praktykami" i ludźmi, którzy je promują.)

Jest jednak jeden dyrektor, który prawdopodobnie ma szeroką akceptację. Struktura pakietu powinna odzwierciedlać (nieformalna) struktura modułów aplikacji, i należy dążyć do zminimalizowania (lub najlepiej całkowicie uniknąć) wszelkich cyklicznych zależności między modułami.

(Cykliczne zależności między klasami w pakiecie / module są w porządku, ale cykle między pakietami utrudniają zrozumienie architektury aplikacji i mogą być przeszkodą w ponownym użyciu kodu. W szczególności, jeśli używasz Mavena, przekonasz się, że cykliczne zależności między pakietami / między modułami oznaczają, że cały połączony bałagan to musi być jeden artefakt Mavena.)

Powinienem również dodać, że istnieje jest jedna powszechnie akceptowana najlepsza praktyka dla nazw pakietów. Oznacza to, że nazwy pakietów powinny zaczynać się od nazwy domeny organizacji w odwrotnej kolejności. Jeśli zastosujesz się do tej zasady, zmniejszysz prawdopodobieństwo problemów spowodowanych przez zderzanie się nazw Twoich (pełnych) klas z nazwami innych ludzi.

 13
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-16 23:25:58

Widziałem, jak niektórzy promują "pakiet po warstwie" nad "pakiet po warstwie", ale przez wiele lat korzystałem z kilku podejść i uznałem "pakiet po warstwie" znacznie lepiej niż "pakiet po warstwie".

Poza tym odkryłem, że strategia hybrydowa: 'pakiet po module, warstwa potem funkcja' działa bardzo dobrze w praktyce, ponieważ ma wiele zalet 'pakiet po funkcji':

  • promuje tworzenie frameworków wielokrotnego użytku (bibliotek z obu modeli i UI aspekty)
  • pozwala na implementacje warstw typu plug and play - praktycznie niemożliwe w przypadku 'package by feature', ponieważ umieszcza implementacje warstw w tym samym katalogu/pakiecie co kod modelu.
  • Wiele więcej...

Wyjaśnię tu szczegółowo: struktura i Organizacja nazw pakietów Java ale moja standardowa struktura pakietów jest:

Revdomain.typ modułu.nazwa modułu.warstwa.[layerImpl].cecha.subfeatureN.subfeatureN+1...

Gdzie:

revdomain Reverse domain np. com.mycompany

moduleType [app* / Framework / util]

moduleName np. myAppName jeśli Typ modułu jest aplikacją lub 'finance' jeśli jest to struktura księgowa

layer [model / ui|trwałość / bezpieczeństwo itp.,]

layerImpl np., wicket, jsp, jpa, jdo, hibernate (Uwaga: nie jest używany, jeśli warstwa jest modelem)

feature np., Finanse

subfeatureN np., księgowość

subfeatureN+1 np., amortyzacja

*czasami 'app' jest pomijane, jeśli ModuleType jest aplikacją, ale umieszczenie go tam sprawia, że struktura pakietu jest spójna we wszystkich typach modułów.

 9
Author: Volksman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-08 00:11:59

Nie znam standardowych praktyk organizacji pakietów. Zazwyczaj tworzę pakiety, które obejmują dość szerokie spektrum, ale mogę rozróżnić w ramach projektu. Na przykład, osobisty projekt, nad którym obecnie pracuję, zawiera pakiet poświęcony moim dostosowanym kontrolkom interfejsu użytkownika (pełnym klas podklasujących klasy swing). Mam pakiet poświęcony moim problemom z zarządzaniem bazami danych, mam pakiet dla zestawu słuchaczy / wydarzeń, które stworzyłem, i tak dalej.

On the other ręka kazałem współpracownikowi stworzyć nowy pakiet dla prawie wszystkiego, co zrobił. Każdy inny MVC, którego chciał, miał swój własny pakiet i wydawało się, że zestaw MVC jest jedyną grupą klas, która może być w tym samym pakiecie. Pamiętam, że w pewnym momencie miał 5 różnych pakietów, z których każdy miał jedną klasę. Myślę, że jego metoda jest trochę ekstremalna (a zespół zmusił go do zmniejszenia liczby pakietów, gdy po prostu nie mogliśmy sobie z tym poradzić), ale dla nietrywialnej aplikacji, więc umieszczanie wszystko w jednym opakowaniu. To punkt równowagi, który ty i twoi koledzy z drużyny musicie znaleźć dla siebie.

Jedną z rzeczy, które możesz zrobić, to spróbować się cofnąć i pomyśleć: gdybyś był nowym członkiem wprowadzonym do projektu, lub twój projekt został wydany jako open source lub API, jak łatwo/trudno byłoby znaleźć to, czego chcesz? Bo dla mnie to jest to, czego naprawdę chcę od pakietów: organizacja. Podobnie jak w przypadku przechowywania plików w folderze na komputerze, spodziewam się, że będę mógł je ponownie znaleźć bez konieczności przeszukiwania całego dysku. Oczekuję, że będę w stanie znaleźć klasę, którą chcę, bez konieczności przeszukiwania listy wszystkich klas w pakiecie.

 6
Author: Brian S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-21 11:46:38