Witam,
Od jakiegoś czasu piszę własną aplikację, a konkretnie... coś. Właśnie zastanawiam się, czy jest to biblioteka czy framework.
Temat ten założyłem, by dowiedzieć się czym jest framework, a czym biblioteka i jakie są pomiędzy nimi faktyczne różnice.
Otóż, wymyśliłem sobie, ze napiszę coś w stylu NUnit, czyli narzędzi do testowania kodu, powszechnie traktowanego jako framework.
Stworzyłem to wszystko na nieco innych zasadach niż jest to zrobione w NUnit - nie użyłem atrybutów, tylko nieco innej struktury.
Nie zmienia to faktu, że głównym celem narzędzia jest testowanie aplikacji i takie też środki są zaoferowane.
Według wiki framework wyróżnia się:
Domyślne zachowanie – framework posiada domyślną konfigurację, która musi być użyteczna i dawać sensowny wynik, zamiast być zbiorem pustych operacji do nadpisania przez programistę.
Rzeczywiście, w danym frameworku zaimplementowane są elementy, które zawierają gotowe domyślne wartości, możliwe do wykorzystania.
Jednak pewne elementy, należy mimo wszystko ustalić / ustawić, aby dane testy były wykonane prawidłowo.
Np. możliwy jest test ExpectedException znany z NUnit. Należy najpierw jednak ustawić typ Exceptiona jaki oczekujemy.
Jednak w typowych bibliotekach oferujących rozwiązanie pewnych problemów też zdarzają się ustawienia domyślne, często po prostu matematycznie wyzerowane.
Przykładem mogą być tutaj chociażby biblioteki graficzne, czy też matematyczno - fizyczne, gdzie większość elementów należy ustawić, jednak wiele paramtrów posiada domyślne ustawienia mogące z powodzeniem być wykorzystane.
Zamknięta struktura wewnętrzna – programista może rozbudowywać framework, ale nie poprzez modyfikację domyślnego kodu.
Według mnie kompletnie nie trafiony argument. Zarówno framework jak i biblioteka dla programisty, który wykorzystuje zasoby w nich zawarte nie podlegają modyfikacji, a jedynie własnie rozszerzalności. Nie widzę tutaj różnicy w wykorzystaniu.
Gdy chcemy rozszerzyć dany element dziedziczymy po jakiejś klasie w danej bibliotece czy też frameworku.
Modyfikacja tych klas (w bibliotecie czy frameworku) jest jednak niemożliwa i zablokowana.
Gdzie tutaj różnica?
Rozszerzalność – poszczególne komponenty frameworka powinny być rozszerzalne przez programistę, jeśli ten chce rozbudować je o niezbędną mu dodatkową funkcjonalność.
Podobnie jak wyżej, biblioteka również może być napisana tak by dawać możliwości rozszerzania, baaa biblioteki często tak są pisane.
Odwrócenie sterowania – w odróżnieniu od aplikacji oraz bibliotek, przepływ sterowania jest narzucany przez framework, a nie przez użytkownika.
Nie bardzo rozumiem ten punkt. Sterowanie przepływem podlega kompilatorowi, zaś na wyższym poziomie abstrakcji biblioteka powinna być wolna od jakichkolwiek sugestii z zewnątrz i realizować swoje funkcje poprzez uniwersalny przepływ sterowania.
efektywność – tworzenie aplikacji z wykorzystaniem frameworków wymaga od programisty mniejszej ilości kodu do napisania,
Znów sytuacja taka sama jak w bibliotece. Jeśli programista dostaje zbiór narzędzi gotowych do wykorzystania to nic dziwnego, że przyśpiesza to pracę i powoduje mniejszą ilość kodu do napisania. Ale żadnej różnicy tutaj nie widzę pomiędzy biblioteką a frameworkiem. Przecież biblioteki także zawierają w sobie gotowe fragmenty kodu do wykorzystania, czym odciążają programistów.
poprawa jakości kodu – ponieważ frameworki są projektowane z myślą o elastyczności, posiadają one dobrą wewnętrzną organizację i logikę, którą narzucają aplikacji,
Tutaj jestem w stanie zrozumieć różnicę pomiędzy frameworkiem, a biblioteką jednakże nie zawsze ma to rację bytu. Otóż framework w założeniu tego punktu powinien być zawsze uniwersalny i z tym się jak najbardziej zgadzam.
Sugeruje to jednak, że biblioteka taka być nie powinna, a z tym już się zgodzić nie mogę, gdyż według mnie każda biblioteka powinna być napisana możliwie uniwersalnie w obrębie danego zagadnienia.
niezawodność – frameworki jako szkielety aplikacji są dobrze zaprojektowane i przetestowane.
No po prostu punkt - poezja. Sugeruje on, że biblioteki nie są dobrze zaprojektowane i nie są testowane. WTF?
złożoność – ze względu na swoją elastyczność oraz wykorzystywanie zaawansowanych koncepcji, opanowanie frameworków nie jest łatwe,
Złożone mogą być też biblioteki. Istnieją przecież biblioteki graficzne, które oferują szereg możliwości obróbki grafiki 3d lub obróbki obrazu cyfrowego. te biblioteki także łatwe nie są do opanowania.
wydajność – często ceną za elastyczną budowę jest niższa wydajność tworzonego oprogramowania.
To nie cecha frameworków tylko pisania kodu możliwie uniwersalnie i elastycznie. Biblioteki też takie mogą być baa często takie są.
Według mnie i z tego co rozumiem Framework jest pisany po to by ułatwić pracę programiście, zarówno tak samo jak biblioteka. Jedyną różnicą jaką widzę jest to, że framework jest w domyśle i w lekkim uproszczeniu elementem bardzo uniwersalnym o dużych możliwościach rozszerzalności. Jednak jest to tylko umowna różnica pomiędzy biblioteką a frameworkiem, gdyż ta elastyczność i uniwersalność też ma swoje granice.
Jaka jest różnica faktyczna, techniczna, nie dająca żadnych wątpliwości pomiędzy biblioteką a frameworkiem? Czy każdy framework jest biblioteką, ale nie każda biblioteka jest frameworkiem?
Załóżmy, że napisaliśmy kod do obliczeń matematycznych możliwie uniwersalnie oraz odciążając tym samym programistów od typowych problemów matematycznych (liczenie średniej, sortowanie, macierze itp.). Czy to framework czy biblioteka?
Drugi przykład: Napisałem kod do wykorzystania w dowolnej aplikacji poprzez pisanie testów. Wszystko zawarte jest w pliku dll, ale napisane jest bardzo uniwersalnie i możliwe jest a nawet zalecane dalsze rozszerzanie. To framework czy biblioteka?
Interesuje mnie to, gdyż chciałbym poznać konkretne szczegóły czym różnią się framework od biblioteki na poziomie technicznym, nie zaś filozoficzno-humanistycznym. Mój stan wiedzy nie pozwala mi jednoznacznie określić co jest biblioteką a co frameworkiem, gdyż technicznie nie widzę pomiędzy nimi różnicy.
Z poważaniem, Pracuś.