Co jest uważane za kod strony trzeciej?

15

Zainspirowany tym pytaniem Korzystanie z bibliotek firm trzecich - zawsze używasz opakowania? Chciałem wiedzieć, co ludzie faktycznie uważają za biblioteki stron trzecich.

Przykład z PHP:
Jeśli buduję aplikację przy użyciu frameworka Zend, czy powinienem traktować biblioteki frameworka Zend jako kod strony trzeciej?

Przykład z C #:
Jeśli buduję aplikację komputerową, czy powinienem traktować wszystkie klasy .Net jako kod strony trzeciej?

Przykład z Javy:
Czy należy traktować wszystkie biblioteki JDK jako biblioteki stron trzecich?

Niektórzy twierdzą, że jeśli biblioteka jest stabilna i nie zmienia się często, nie trzeba jej owijać. Jednak nie widzę, jak można przetestować klasę zależną od kodu strony trzeciej bez owijania go.

Songo
źródło
8
Czy osoba uprawniona do głosowania może wyjaśnić, dlaczego?
Songo,
Słyszałem o oprogramowaniu innej firmy, ale nie o kodzie innej firmy. Większość stron trzecich nie podaje kodu źródłowego.
Tulains Córdova

Odpowiedzi:

18

Twoje przykłady są kodami innych firm, ale nie powinieneś pisać dla nich opakowań. Są to duże, dojrzałe projekty ze stabilnymi i dobrze zaplanowanymi interfejsami API.

Potrzebne są opakowania, aby zapewnić warstwę abstrakcji między kodem a biblioteką. Ta abstrakcja jest potrzebna tylko wtedy, gdy odkryjesz, że biblioteka nie zapewnia dobrych interfejsów API dla konkretnej czynności. Następnie możesz utworzyć opakowanie, aby uprościć własny kod i ukryć fakt, że wywołania interfejsu API są niewygodne.

Twój kod będzie testowalny, jeśli użyjesz wstrzykiwania zależności. W testach jednostkowych możesz zamienić zależność od biblioteki za pomocą próbnego obiektu, co pozwala na izolację testowanego kodu.

M. Dudley
źródło
+1 za wyjaśnienie, kiedy opakowanie lub fasada, jeśli wolisz, mogą być konieczne.
Joshua Drake
Dzięki za odpowiedź, ale jeśli chodzi o ostatni akapit o testowaniu jednostkowym, czy mógłbyś rzucić okiem na to pytanie, w którym próbuję przetestować jednostkę, która jest bezpośrednio zależna od biblioteki?
Songo,
@Songo: Twoją strategią testową powinno być utworzenie Zend_Mailmakiety, którą przekażesz Loggertestowanemu obiektowi. Czy PHP nie obsługuje pisania kaczego? Jeśli tak, to czy tworzenie fałszywego obiektu nie powinno być trywialne ...? Tak naprawdę nie znam PHP, ale możesz spojrzeć na przykłady z fałszywych bibliotek PHP, aby zobaczyć, jak to się zwykle robi. W językach, które nie obsługują pisania kaczego, myślę, że musisz zmienić Zend_Mailinterfejs, a następnie utworzyć cienkie opakowanie, które implementuje interfejs i dziedziczy Zend_Mailwszystkie swoje wywołania lub po prostu je deleguje.
M. Dudley,
@ emddudley no tak, ale szukałem bardziej ogólnego rozwiązania problemu w innych językach, który nie obsługuje pisania kaczego. Właściwie twoje rozwiązanie do zawijania Zend_Mailbyło moją pierwszą myślą, ale jak widać w moim oryginalnym poście przed jego edycją, użyłem interfejsu i opakowania, które go implementuje. Jednak jedynym celem istnienia opakowania jest to, że mogę kpić z jego interfejsu. Czy jest to powszechne w językach, które nie obsługują pisania kaczego? Mam na myśli budowanie nieskończonej liczby opakowań?
Songo,
@Songo: Myślę, że jest to bardzo specyficzne dla języka i biblioteki i musisz zadowalać się wszystkim, co obsługuje twoja platforma. Czasami możesz utknąć w piśmie do pisania. Wstrzykiwanie zależności i wyśmiewanie obiektów są dość nowymi osiągnięciami (2004?), Więc nie wszystkie języki i biblioteki obsługują je bardzo dobrze. „Ogólne rozwiązanie”, którego szukasz, to tylko sposób myślenia: w jaki sposób możesz zaprojektować swój kod dla luźnego łączenia i skutecznego testowania jednostek?
M. Dudley,
6

Zawijanie biblioteki ma na celu przełamanie zależności własnego kodu od tej biblioteki, aby umożliwić:

  • Testowanie jednostkowe - Musisz być w stanie przetestować swój kod. Jeśli biblioteka nie pozwala na wyśmiewanie się z klas lub wymuszanie odpowiedzi, które są potrzebne w teście, musisz ją owinąć. Jest to oczywisty problem i prawdopodobnie nie taki przypadek, o którym się zastanawiasz.
  • Zmiana implementacji - jako autor kodu musisz zrozumieć zmiany, które prawdopodobnie nadejdą po twojej myśli, oraz ile kosztują te przygotowania w porównaniu do ich prawdopodobieństwa. Czy możesz przejść z .NET na JVM? To trudne i mało prawdopodobne; istnieje jednak duże prawdopodobieństwo, że w przyszłości zmienisz technologie interfejsu użytkownika lub silniki XML.

Izolowanie bibliotek i frameworków stron trzecich to tylko podzbiór izolowania zmian.

Ben
źródło
Bardzo dobra uwaga na temat testów jednostkowych. Nie mówię, że zawsze zawijaj, aby móc przetestować aplikację, ale jest to dobra strategia na oddzielenie zależności w razie potrzeby.
Sergio Acosta
2

Nie traktowałbym członków standardowej biblioteki jako kodu innej firmy - w końcu są one standardowe i można zasadnie założyć, że są dostępne i funkcjonalne na używanej platformie.

Jeśli chodzi o coś takiego jak Zend, myślę, że nie można tego owinąć - prawdopodobnie musiałbyś przepisać program, gdybyś przyjął inną platformę. Szczerze mówiąc, nie napisałbym wiele, co nie było poważną zależnością od konfiguracji zewnętrznej lub gdybym tak naprawdę nie planował wymiany tego elementu.

Wyatt Barnett
źródło
2

Biblioteki dostarczane przez konkretny język programowania uznałbym za część tego języka.

Niż, uważam, że strony trzecie, wszystkie biblioteki dostarczone przez jakikolwiek inny podmiot jako rozszerzenie lub oddzielne narzędzie od samego języka programowania.

Biorąc twój przykład, uważam Zend za osobę trzecią. Skonstruowałbym również moją aplikację w taki sposób, aby moja podstawowa logika biznesowa nie zależała od Zend.

Wikipedia określa komponent strony trzeciej jako:

W programowaniu komputerowym komponent oprogramowania innej firmy to komponent oprogramowania wielokrotnego użytku opracowany w celu swobodnej dystrybucji lub sprzedaży przez podmiot inny niż pierwotny dostawca platformy programistycznej.

Patkos Csaba
źródło
1

W najściślejszym sensie każdy podany przez Ciebie przykład to kod innej firmy. Jednak nie cały kod strony trzeciej powinien być zapakowany. Wszystkie biblioteki stron trzecich powinny być opakowane. Ramy z definicji nie mogą być pakowane, ponieważ stają się nieodłączną częścią twojego kodu. Dlatego opakowujesz bibliotekę rejestrowania, ale nie platformę .NET lub Zend. Nie można tak naprawdę oddzielić kodu od .NET - są one powiązane. Oczywiście dobre frameworki będą miały interfejsy do programowania, co pozwoli ci w pewnym stopniu ominąć problem.

Zobacz także: /programming/148747/what-is-the-difference-between-a-framework-and-a-library

Michael
źródło