Biblioteka vs framework

0

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ś.

1

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.

No właśnie to odwrócenie sterowania moim zdaniem jest kluczowym punktem. Jak masz np framework do aplikacji webowych to on narzuca ci jak mają wyglądać kontrolery, sam przetwarza dane na swoje struktury, wymusza np sposób walidacji i parsowania formularzy, zapewnianie bezpieczeństwa, dostęp do bazy, itp itd Framework do testowania narzuca ci np które klasy masz rozszerzać i jak twoje testy mają wyglądać, by w ogóle zostały odpalone, formatuje i agreguje wyniki testów, ogólnie nimi zarządza (np jesteś w stanie odpalić testy które nie powiodły się w poprzednim testowaniu).

Biblioteki łatwiej też podmienić niż frameworki. Np robisz aplikację we frameworku webowym A i chcesz przejść na framework webowy B to musisz generalnie przeorać całą aplikację naraz. Natomiast jeśli chcesz zmigrować z jednej biblioteki na drugą to możesz robić to etapami.

Oczywiście nie ma żadnego deterministycznego i doprecyzowanego algorytmu pozwalającego stwierdzić czy coś powinno nazywać się biblioteką czy frameworkiem, ale myślę, że moje argumenty pozwolą dużo rozjaśnić :)

2

Z mojego punktu widzenia różnica jest zasadnicza:

  • Framework narzuca pewne "ramy" w których piszesz kod. Tzn framework w pewnym sensie determinuje architekturę aplikacji a programista "wypełnia luki" w trakcie tworzenia aplikacji.
  • Biblioteka to zbiór funkcjonalnści które programista może wykorzystać. To programista decyduje kiedy i gdzie korzysta z danej funkcji / obiektu etc.

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?

Oba przykłady to biblioteki. Bo programista może je sobie wziąć i użyć po jednej z funkcji z każdej z nich.

Ale gdyby na przykład twój kod do obliczeń matematycznych to był uniwersalny "szablon" dla aplikacji przetwarzających dane, tak że uzytkownik musi tylko zaimplementować sobie jakiegoś DataProvidera (z interfejsem który narzucasz) a potem cała reszta "aplikacji" zrobi się sama, to byłby już framework. Bo narzuciłby sposób budowy aplikacji i zdeterminowałby implementacje.

Jeśli twój kod do testowania wymusza na użytkowniku pisania testów w konretny sposób (np. z użyciem jakiegoś DSLa) a potem samo testowanie przebiega "automatycznie" (użytkownik może nawet nie wiedzieć jak to się wszystko dzieje) to to będzie framework. Ale jeśli udostepniasz tylko bibliotekę która potrafi zwrócić mocka i przetestować jego zachowanie, a użytkownik musi sam naklepać cały kod odpowiedzialny za odpalanie testów to napisałeś biblioteke.

0
pracus444 napisał(a):

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?

Nic podobnego nie jest w artykule na Wikipedii sugerowane. Zmyślasz sobie jakieś sugestie, a potem sam się z nimi nie zgadzasz. Przeczytaj to jeszcze raz, tym razem uważniej.

0

Super, wydaje mi się, że teraz rozumiem. Obawiałem się też, że być może nie znam pewnych technologicznych zależności i, że da się frameworka i bibliotekę jednoznacznie technicznie określić, nie zaś poprzez zakres i możliwości obu tych elementów.

Jednak doszedłem do - tak mi się wydaje - zabawnego wniosku, gdyż tak jak napisałeś Shalom:

testowanie przebiega "automatycznie" (użytkownik może nawet nie wiedzieć jak to się wszystko dzieje) to to będzie framework. Ale jeśli udostępniasz tylko bibliotekę która potrafi zwrócić mocka i przetestować jego zachowanie, a użytkownik musi sam naklepać cały kod odpowiedzialny za odpalanie testów to napisałeś biblioteke.

Otóż napisałem chyba jakąs hybrydę :)

1.)
Dll-ka umożliwia odpalenie testu poprzez wybranie dll-ki (jako fizycznego pliku) następnie aplikacja wyszukuje wszystkie testy możliwe do wykonania i daje użytkownikowi wybór które z tych testów chce wykonać. Jest to osobna aplikacja, będąca wspomaganiem dla programisty (tak naprawdę po to pisałem ją w zasadzie dla siebie i z ciekawości). Z tego co zrozumiałem takie działanie jest frameworkiem, gdyż dll-ka sama w sobie zarządza jak ma wykonać testy i co zrobić, a programista piszący testy musi implementować określony interfejs i niczym więcej się nie martwi. W tym także sposób odpalenia testu go nie interesuje.
W tym przypadku jest to osobna aplikacja, odłączona od projektu testowanego. odpalana jest formatka z wyborem klas i metod do przetestowania, a następnie ukazuje się formatka z wynikami testów.

2.)
Z drugiej strony udostępniłem w pliku dll możliwość odpalenia testów przez programistę. Najpierw implementuje określony interfejs, następnie pisze testy, a na końcu może napisać kod wywołujący dany zbiór testów. Nawet ma wybór czy chce zobaczyć formatkę (osobna dll-ka), czy też nie.

Jak zrozumiałem w pierwszym punkcie jest to framework, zaś w drugim punkcie jest biblioteką.
W takim wypadku jest to framework czy też biblioteka?
Gdybym napisał tutaj na forum: Chciałbym Wam przedstawić mój nowy projekt. Oto... no właśnie. Oto z jednej strony framework, a z drugiej biblioteka.

0

Framework to taka biblioteka do wszystkiego. Z założenia raczej nie miesza się frameworków ze sobą, bo służa właśnie do „wszystkiego”.

Niektórzy autorzy wolą nazwać swoje dzieło “framework” zamiast “library” bo to mądrzej brzmi.

Ale czy coś jest biblioteką czy frameworkiem to problem mało istotny.

0

Framework - z angielska struktura.
Library - biblioteka.

Jak chcesz coś wziąć i użyć to bierzesz bibliotekę, jak chcesz coś poukładać to używasz struktury.

0

@pracus444 to akurat nic nadzwyczajnego. Są frameworki a nawet i aplikacje które udostepniają swoje "bebechy" jeśli ktoś bardzo chciałby z nich skorzystać. Mimo to zwykle tak nie jest, bo te bebechy są na tyle mocno powiązane ze sobą, że nie bardzo byłoby jak ich używać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1