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.
Odpowiedzi:
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.
źródło
Zend_Mail
makiety, którą przekażeszLogger
testowanemu 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_Mail
interfejs, a następnie utworzyć cienkie opakowanie, które implementuje interfejs i dziedziczyZend_Mail
wszystkie swoje wywołania lub po prostu je deleguje.Zend_Mail
był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ń?Zawijanie biblioteki ma na celu przełamanie zależności własnego kodu od tej biblioteki, aby umożliwić:
Izolowanie bibliotek i frameworków stron trzecich to tylko podzbiór izolowania zmian.
źródło
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.
źródło
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:
źródło
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
źródło