paczki NuGet – usuwamy powtarzający się kod cz. I

paczka

Każdy programista tworzy wiele aplikacji. Niezależnie od tego jak różne problemy rozwiązują, często zawierają logikę, która się powtarza. Pisanie za każdym razem wszystkiego od nowa wydaje się niezbyt mądrą praktyką – poświęcenie dodatkowego czasu, ryzyko powstania błędów, testowanie. Jak myślisz? Czy na ten problem jest jakieś rozwiązanie?

Problemy powtarzającego się kodu

Dla programistów .NET odpowiedzią na pytanie są paczki NuGet, ale zacznijmy od początku. Jeśli w Twoich projektach dostrzegasz powtarzające się elementy np. identyczny sposób uwierzytelniania użytkownika, autorski sposób przeglądania danych w arkuszu kalkulacyjnym, czy cokolwiek innego, to masz dwa rozwiązania. Pierwsze z nich, bardzo nieprofesjonalne i nieeleganckie – kopiowanie kodu pomiędzy aplikacjami. Takie podejście generuje szereg problemów:

  1. Gdy Twój kod przeniesiesz do 176 programów i nagle uznasz, że trzeba coś w nim zmienić lub, co gorsze, znalazłeś buga, będziesz go musiał poprawić 176 razy! Każda aplikacja jest przecież niezależnym tworem i zmiany wprowadzone w jednej nie pojawią się magicznie
    w drugiej
  2. Jeśli kod rozwiązujący Twój problem zaprojektowany jest obiektowo (a powinien), prawdopodobnie rozbity jest na wiele klas, z których każda wykonuje tylko jedno zadanie. Jeśli więc chcesz korzystać z tego w innych projektach, jesteś zmuszony przenieść tam CAŁOŚĆ. Załóżmy, że Twoje rozwiązanie zawiera się w 5 klasach – potrzebujesz ich jeszcze w 175 projektach (patrz przykład wyżej) to oznacza, że musisz skopiować 175*5=875 dokumentów! Zmęczony na samą myśl? To dobrze! Nie powinieneś tak robić, bo jest sprytna alternatywa 🙂

Proste rozwiązanie

Zamiast kopiować- wydziel wspólną logikę do osobnego projektu! Na początek kilka wskazówek:

– typ projektu: Class Library,

– wersja frameworka musi być zgodna z Twoimi pozostałymi solucjami.

Okej! Gdy już utworzysz poprawny projekt, przenieś do niego wszystkie klasy, które chcesz współdzielić pomiędzy innymi i go zbuduj. Możesz to zrobić wybierając polecenie Build z menu Build albo wciskając F6 albo Ctrl+B albo Ctrl+Shift+B, do wyboru do koloru!

W kolejnym kroku otwórz folder, w którym znajduje się Twoja solucja, przejdź do katalogu projektu,
a następnie bin netcoreapp2.0 (w przypadku projektu .NET Core 2.0, którego używam). Znajdziesz tam plik o nazwie projektu i rozszerzeniu .dll. Co da się z nim zrobić? A no dużo, ale zaczniemy od podstaw.

Zauważ, że wszystkie zależności (dependencies), które masz w dowolnym projekcie, to właśnie pliki dll.

dependecies

Tak, to właśnie za ich pomocą ta sama logika jest współdzielona pomiędzy tysiącami aplikacji. Jaka jest różnica w stosunku do mojego sposobu? Wcześniej pobierane przez Ciebie pliki przechowywane są na serwerze, a Twoja dll-ka znajduje się na dysku komputera.

Jak dodać plik do projektu?

Dodawanie takiego pliku do projektu jest banalnie proste. Korzystając z Solution Explorera wybierz ten, do którego chcesz dorzucić dllke i kliknij prawym przyciskiem myszy. Z menu kontekstowego wybierz Add…, a następnie Reference.

dodawanie zależności

W nowo otwartym oknie przejdź do sekcji Browse i wciśnij przycisk o tej samej nazwie.

okno dodawania zależności

Następnie wskaż przed chwilą utworzony plik i gotowe. Od teraz możesz używać swojego wydzielonego kodu w programie do którego go dołączyłeś! W każdej kolejnej, również za pomocą kilku kliknięć możesz zastąpić kopiowanie klasy po klasie.

Czy jest to rozwiązanie kompletne?

Jeśli uważnie czytasz ten post możesz się teraz zastanawiać. I dobrze! Takie rozwiązanie załatwia tylko jeden problem z tych, które wymieniłem wcześniej. Ba! Nawet w przypadku dodania nowych funkcjonalności generuje kolejny, popatrz:

Wcześniej wprowadzona zmiana, wymusiłaby na Tobie poprawki w 176 aplikacjach. Teraz musisz napisać ją raz, przebudować projekt, co utworzy nowy plik dll, który musisz podmienić w 176 miejscach. A co jeśli zaktualizujesz 15, a potem stracisz rachubę i zapomnisz gdzie skończyłeś? Uwierz, to bardzo frustrujące. Jeśli takie rozwiązanie nie do końca Cię satysfakcjonuję, to czytaj dalej.

Co gdybym Ci powiedział, że każdą kolejną wersję wydzielonej logiki mógłbyś trzymać na serwerze? To rozwiązanie, nie załatwi za Ciebie  problemu aktualizacji w projektach, ale znacznie ją ułatwi. Pozwoli Ci kontrolować wersję, którą dołączyłeś, poinformuje wszystkich użytkowników
o aktualizacjach oraz ogólnie rzecz biorąc sprawi, że wydzielenie powtarzającego się kodu będzie miało sens i przyniesie korzyść.

Jak więc to zrobić? Potrzebujesz kilku rzeczy:

Przygotowanie plików

Pliki dll zawierają tylko i wyłącznie kod, z którego chcesz skorzystać. Co w przypadku gdybyś, stosując zasady poprawnego projektowania aplikacji wydzielił osobne dllki do uwierzytelniania i drugą do arkusza kalkulacyjnego? Wypadałoby je jakoś zgrupować, tak aby serwer mógł dostarczać je zbiorczo do Twojego programu – jeśli Ci na tym zależy. Służą do tego tzw paczki NuGet (ang. NuGet packages). To również pliki, tym razem o rozszerzeniu .nupkg. Zawierają potrzebne dllki oraz metadane takie jak numer wersji, autor, etc. Jak go utworzyć? Potrzebny będzie Ci program: NuGet Package Explorer, pobierzesz go tutaj.

Poniżej krótka instrukcja jak przygotować paczkę:

Otwórz pogram i wybierz opcję Create a new package.

Nuget Package Explorer ekran główny

Zobaczysz ekran podzielony na dwa okna. Z lewej możesz edytować nazwę paczki, jej id, numer wersji, opis, dodać możliwość akceptacji licencji, itp. Aby to zrobić kliknij ikonę Edit Metadata.

edycja metadanych

Możesz też wybrać tę opcję z menu Edit lub użyć skrótu Ctrl+K.

Z prawej strony widać ekran zawartości paczki. Tutaj musimy umieścić wszystkie pliki dll. Zanim to zrobisz musisz dodać folder lib: prawy przycisk myszy -> Add -> lib folder. Możesz to też zrobić używając menu Content -> Add -> lib folder. Kolejnym krokiem będzie dodanie folderu(ów)  z wersjami frameworka, dla których chcesz przeznaczyć paczkę. Katalogi muszą być zgodne z wersjami w projektach, gdzie będzie ona dodana. Ponownie wciśnij prawy przycisk myszy na katalogu lib, a z menu kontekstowego wybierz poprawną wersję. Jeśli nie wiesz, która jest poprawna, to sprawdź w ustawieniach projektu. Ostatnimi krokami będzie dodanie plików dll (prawy przycisk myszy -> Add existing file lub menu Content -> Add -> Existing file) i zapisanie całości.

Gotowa struktura paczki powinna wyglądać podobnie do tej:

zawartość paczki

Super! Twój NuGet jest gotowy i może trafić na serwer. I to on właśnie jest drugą i ostatnią rzeczą, której potrzebujesz. Temat okazał się jednak na tyle obszerny, że postanowiłem go rozbić
i umieścić w kolejnym artykule. Stay tuned! Kolejna część pojawi się na blogu już niedługo!

Po lekturze dzisiejszego wpisu masz nową wiedzę, która pozwoli Ci uporządkować Twój kod i zredukować ilość powtarzających się elementów.

Please follow and like us:

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.