Czy moja mała biblioteka oprogramowania powinna unikać korzystania z innych bibliotek?

13

Właśnie wydałem małą bibliotekę Java, która oferuje tylko kilka klas i metod. Ponieważ zbudowałem projekt z Maven, od razu skorzystałem z kilku bibliotek stron trzecich, aby osiągnąć moje cele, w szczególności:

  • commons-lang3 (dla niektórych ogólnych rzeczy Java)
  • slf4j-api (do logowania)
  • commons-io (dla odrobiny rzeczy z pliku - myślę, że dosłownie czyta plik raz)

Nie chcę, żeby moja biblioteka była rozdęta w oczach innych. Czy powinienem próbować usunąć swoje poleganie na tych bibliotekach, aby zminimalizować swój ślad? Wszelkie porady dotyczące rodzajów bibliotek, których najlepiej byłoby unikać, rozważając korzystanie z nich w przyszłości?

Duncan Jones
źródło
1
konkretna część twojego pytania wygląda na odpowiedzialną: twój projekt plus konkretne libi plus czy jest w porządku. Problem polega na tym, że przeliterowałeś to wraz z ogólną częścią „powinien ... mały ... unikać”. W obecnej formie to pytanie nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi poparte będą faktami, referencjami lub specjalistyczną wiedzą, ale to pytanie prawdopodobnie będzie wymagało debaty, argumentów, ankiet lub rozszerzonej dyskusji. Jeśli uważasz, że to pytanie można poprawić, zapoznaj się z najczęściej zadawanymi pytaniami .
komara
1
@gnat Moje przeprosiny. Jako zwykły użytkownik stosu przepełnienia stosu miałem tendencję do zakładania, że ​​nieco subiektywne pytania są dopuszczalne dla programistów. Czy istnieje witryna Stack Exchange, na której takie problemy są w porządku? W międzyczasie usunę wszelkie niejasności z mojego pytania.
Duncan Jones
2
@gnat To pytanie jest w porządku, nawet w oryginalnej formie.
Thomas Owens
@ThomasOwens z całym szacunkiem, nie sądzę; w przypadku oryginalnej wersji szybko doszedłem do dwóch odpowiedzi z przeciwnymi zaleceniami, obie uzasadnione: witam grę wyborczą
gnat
1
@gnat Tylko dwa? W porządku. Niech będą publikowane i głosowane. Dwie potencjalnie poprawne odpowiedzi z uzasadnieniem i uzasadnieniem, które są przeciwne, nie czynią pytania złym. Ani 3, ani 4, a nawet 5. To dobrze sformułowane pytanie, z którym muszą sobie poradzić programiści bibliotek, a następnie nakłada się na nie odpowiedzi, aby były to dobre odpowiedzi .
Thomas Owens

Odpowiedzi:

8

Odpowiadam na to, biorąc pod uwagę twoją konkretną sytuację. Powiedziałbym, że korzystanie z tych bibliotek jest w porządku. Tylko upewnij się, że twój slf4j-api nie przyniesie z nim implementacji. Rozumiem przez to zależność implementacji jako „test”. NA PRZYKŁAD:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.2</version>
    <scope>test</scope>
</dependency>

Jest to szczegółowo opisane w FAQ SLF4j.

Jeśli chodzi o pozostałe dwa, IME, zawsze są one kompatybilne wstecz. Dlatego jeśli za 5 lat będę potrzebować twojej biblioteki, ale używasz starej wersji, mogę po prostu wykluczyć twoje zależności, a nasz kod będzie nadal działał. Innymi słowy, używając tych konkretnych bibliotek, nie wprowadzisz piekła dla innych.

Jeśli używam twojej biblioteki przez maven, nie zauważę, czy twoja biblioteka jest rozdęta czy nie. Będę zależał od twojego i użyję go. Myślę, że ważniejsze jest, aby kod działał poprawnie, niż ma mniejszy rozmiar. Wolę używać commons-io zamiast odkrywać koło z błędem.

Daniel Kaplan
źródło
Dziękuję za odpowiedź, myślę, że zasadniczo zgadzamy się co do podejścia, które powinienem przyjąć. Tylko żeby poprawić jeden bit - sposób, w jaki należy dołączyć slf4j do projektu bibliotecznego, polega po prostu na dołączeniu slf4j-apii bez żadnych innych powiązanych artefaktów, pod warunkiem lub w inny sposób. Zobacz slf4j.org/manual.html#projectDep .
Duncan Jones
Przypominam sobie niektóre niszczące mózg ćwiczenia ( excludezyliony s iirc), które musiałem wykonać, gdy poszczególne moduły w moich zależnościach nie mogły „zgodzić się” na wersję slf4j. Z twojej odpowiedzi wygląda na to, że projektanci modułów ujawnią to, ponieważ providednie byłoby takich problemów, prawda?
komara
2
@gnat Zwykle byłoby to rozwiązane (przynajmniej w Maven) poprzez zadeklarowanie jednej preferowanej wersji w POM. Maven przyjmuje „najbliższą” wersję zdefiniowaną dla artefaktu, a bezpośrednie POM przewyższa zależności przechodnie. Być może była to zmiana zachowania podczas wydania Maven 2.x.
Duncan Jones
1
+1 za określenie slf4j jako provided- bardzo dyskretne.
Gary Rowe,
@DuncanJones dzięki, prawdopodobnie wtedy to przegapiłem. Moja wersja maven to 2.2 lub 2.3, nie mogę sobie przypomnieć, która z nich (choć na pewno pamiętam, jak mvn dependency:analyzeprzyniosłem wersje crap, dopóki nie została wykluczona :)
gnat
1

Nie.

„Wzdęcia” to mit. Bez względu na to, ile kodu znajduje się w bibliotece, jeśli część tego kodu nigdy nie zostanie użyta, nie zostanie on umieszczony na stronie - nie będzie miał żadnego wpływu na wydajność ani wielkość pamięci.

Z drugiej strony, jeśli potrzebujesz tej dodatkowej funkcjonalności, masz dwie możliwości. Możesz napisać to sam i poświęcić dużo czasu i wysiłku na rozwiązywanie problemów, które inni już wcześniej rozwiązali, lub możesz wybrać rozwiązanie, które już istnieje (i zostało przetestowane / debugowane / itp.).

To pozostawia nam rozmiar pliku do pobrania i miejsce na dysku, a jeśli nie mówisz głupich liczb, w 2013 r. Są to dwa czynniki, które powinny znajdować się na dole listy rzeczy, o które musisz się martwić.

Maximus Minimus
źródło