F# często przedstawiany jest jako "multi-paradigm", tak więc w swojej funkcyjnej naturze pozwala również na programowanie zorientowane obiektowo. Abstrakcję OOP realizują m. in. interfejsy i klasy abstrakcyjne, które są podobne do tych w C#. Składowe interfejsów i klas abstrakcyjnych (klasa abstrakcyjna jest dodatkowo opatrzona atrybutem typu) są deklarowane przy pomocy nazwy i następującego po niej typu składowej (ponieważ funkcja w FP jest rodzajem typu złożonego, tak więc składowa posiada swój typ, a ...
Architektura 3877 dni, 15 godzin, 44 minuty temu 38 źrodło rozwiń
W .NET mamy do dyspozycji wygodny mechanizm do zapisywania ustawień aplikacji. Nie będę tutaj opisywać podstaw obsługi tego mechanizmu. Osoby niezaznajomione z tym mechanizmem odsyłam do dokumentacji. W tym wpisie skupię się na stworzeniu własnego dostawcy ustawień. Domyślnym i jedynym standardowo dostępnym dostawcą, który zajmuje się zapisem ustawień jest LocalFileSettingsProvider. Dostawca ten zapisuje pliki do lokalnego katalogu u...
Architektura 3878 dni, 2 godziny, 3 minuty temu 33 źrodło rozwiń
Jakiś czas temu obiecałem jakiegoś sampla z MVVM i słowa dotrzymałem. Dziś wrzucam pierwszą część – opis założeń i warstwa modelu. I nie będzie to kolejny przykład na klasie User, tylko kompletny i gotowy do użycia komponent – wirtualna klawiatura obsługująca wielodotyk – efekt ostatnich dwóch dni pracy (i jeszcze pewnie dwóch kolejnych ...
Architektura 3879 dni, 13 godzin, 41 minut temu 127 źrodło rozwiń
Małymi kroczkami, dotarłem do miejsca, w którym czas złapać za klawiaturę i zacząć pisać kod. Plan działania (pierwsza pięciolatka) wygląda następująco: import i parsowanie danych ze strony sejmu, obliczanie różnych statystyk na podstawie zgromadzonych danych, warstwę dostępu do bazy danych i UI w formie strony internetowej. Uszeregowałem sobie zadania od najtrudniejszego do najłatwiejszego, przynajmniej teoretycznie. Na pierwszy ogień idzie import i parsowanie danych ze strony sejmu. Fasadę procesu impo...
Architektura 3880 dni, 15 godzin, 37 minut temu 44 źrodło rozwiń
Zastanawiałem się nad strukturą programu, może po prostu zrobić to tak jak wszystkie projekty na zaliczenie, czyli na odpierdol, byle działało. Ale nie, to w końcu praca dyplomowa, trzeba być poważnym, poza tym chcę się nauczyć czegoś nowego, dodam do założeń nowy punkt: „W łatwy sposób będzie można zmienić wygląd aplikacji, bez konieczności ingerowania w kod (logikę).” Czyli krótko mówiąc trzeba zastosowa...
Architektura 3882 dni, 5 godzin, 45 minut temu 284 źrodło rozwiń
Dziś chciałbym opisać kolejny wzorzec/mechanizm który będę używal i ma on na celu znaczne uproszczenie kodowania i eliminowanie niepotrzebnych powiązań miedzy obiektami. Event Aggregator Jak już wcześniej wspomniałem ten wzorzec/mechanizm ma na celu eliminowanie niepotrzebnych powiązań miedzy obiektami. Stanowi on pojedyncze źródło dla wielu obiektów. W najprostszej formie wygląda to tak że rejestrujemy klasy które dotyczą konkretnego zdarzenia do naszego event aggregatora. Te klasy nazywają się uchwyt...
Architektura 3884 dni, 19 godzin, 21 minut temu 261 źrodło rozwiń
XMPP, Real Time Web i … .NET Czym jest XMPP ? Extensible Messaging and Presence Protocol a.ka. Jabber to otwarty protokół oparty o XML pozwalający na wymianę informacji w czasie (prawie)rzeczywistym.
Architektura 3886 dni, 15 godzin, 48 minut temu 33 źrodło rozwiń
Szkoda, że w C# nie ma znanych z Javy anonimowych klas. Nie mylić z anonimowymi typami, które nie pozwalają na implementację metod! W internecie jest wiele skarg i próśb próbujących wymusić na Microsofcie dodania tego, jakże wygodnego, ficzera do naszego języka...
Architektura 3905 dni, 21 godzin, 8 minut temu 106 źrodło rozwiń
Chcąc dostosować swój kod do wymagań korporacyjnych oraz w celu samodoskonalenia umiejętności zacząłem niedawno stosować między innymi ten wzorzec. Jego zastosowanie może wydawać się oczywiste, ale jego znaczenie jest ogromne, jeżeli budowany kod ma nosić cechy modułowości i skalowalności. Wzorzec Dependency Injection (DI) stosuje się zazwyczaj z innym bardzo ważnym wzorcem jakim jest Inversion of Control (IoC) ale o tym przy okazji. Najprościej rzecz ujmując DI to dostarczenie zależności pomiędzy klasa...
Architektura 3906 dni, 13 godzin, 5 minut temu 200 źrodło rozwiń
Generyczna klasa zbioru W projekcie, nad którym pracuję potrzebowałem przyzwoicie działającej klasy reprezentującej zbiór. Zbiór nie do końca w sensie teoriomnogościowym (o właściwościach takiego można przeczytać np. tu), posiadający jedną bardzo ważną cechę: przechowywanie unikalnych elementów. Istniejące implementacje (Hashtable oraz HashSet) nie spełniały moich oczekiwań – elementów do wstawiania było na tyle dużo, że występowały kolizje z obliczonej przez GetHashCode() wartości. Ponieważ rozwiązanie...
Architektura 3909 dni, 8 godzin, 27 minut temu 74 źrodło rozwiń
Rozszerzalność od dawna jest w modzie: praktycznie żadna poważniejsza aplikacja nie obywa się bez jakiegoś systemu pluginów, czyli "wtyczek" zwiększających jej funkcjonalność. Niektóre robią to przy okazji (acz ze słusznych powodów), inne czynią z elastyczności i rozszerzalności swój główny oręż (patrz np. uniwersalne komunikatory w typie Mirandy). Wszystko to kojarzy się trochę linuksiarsko, ...
Architektura 3913 dni, 15 godzin, 43 minuty temu 174 źrodło rozwiń
O Fluent Interface ("płynnym interfejsie"?:) ) jest od jakiegoś czasu dość głośno w światku .NET. Stał się... trendy. Implementują go właściwie wszystkie kontenery IoC, można za jego pomocą skonfigurować NHibernate, coraz więcej innych projektów udostępnia swoje API w ten sposób. Ale dlaczego, czy jest to naprawdę tak fajne? Moim zdaniem: TAK. Fluent Interface jest nawet czymś więcej niż "fajnym bajerem" - pozwala naprawdę bardzo uprościć pracę z naszą biblioteką.
Architektura 3915 dni, 17 godzin temu 172 źrodło rozwiń
Podczas 58. spotkania Krakowskiej Grupy Developerów .NET miałem przyjemność poprowadzić prezentację pt. “Domain Driven Design, czyli programowanie przez modelowanie”. Ponieważ zakładam, że nie wszyscy jesteście z Krakowa i uczestniczyliście w spotkaniu, pozwolę sobie opisać o czym mówiłem. Prezentację możecie obejrzeć lub ściągnąć (format pptx) stąd (via SlideShare), a przykłady w kodzie stąd.Rozwiązywanie problemów Na...
Architektura 3934 dni, 15 godzin temu 220 źrodło rozwiń
ASP .NET MVC jest frameworkiem wspierającym wzorzec projektowy MVC. Należy zdawać sobie sprawę, że przechodząc z klasycznego ASP .NET na ASP .NET MVC tracimy możliwość korzystania ze zbioru kontrolek typu ListView, Repeater itp. Na początku może wydawać się to bardzo ograniczające jednak w praktyce czas wymagany na stworzenie aplikacji webowej jest niewiele dłuższy a za to zyskujemy znacznie większą elastyczność. Ponadto ze względu na brak standardowych kontrolek nie ma bałaganu z ViewState. Uogólniając,...
Architektura 3954 dni, 3 godziny, 5 minut temu 72 źrodło rozwiń
W MVC wyróżniamy 3 główne typy klas: model, widok oraz kontroler. Model stanowi bramkę dostępową do warstwy biznesowej. Przetrzymuje informacje o aktualnym stanie interfejsu. W pewnych przypadkach model może stanowić bezpośrednio klasę z warstwy biznesowej (np. dla wzorca skrypt transakcji jest to możliwe). Zwykle jednak tworzy się osobne modele (albo wrappery) dla warstwy prezentacji. Widok z kolei to interfejs graficzny w czystej postaci. W przypadku Silverlight, WPF jest to po prostu plik zawierając...
Architektura 3961 dni, 13 godzin, 9 minut temu 98 źrodło rozwiń
Warstwa prezentacji odpowiedzialna jest za komunikację z użytkownikiem. W dzisiejszych czasach interfejsy graficzne są na tyle rozbudowane, że poprawne zaprojektowanie warstwy prezentacji stanowi poważne wyzwanie. W małych projektach często ta warstwa stanowi najbardziej złożoną część całej architektury. Bez wykorzystania stosownych wzorców projektowych po pewnym czasie pisania aplikacji okaże się, że jakakolwiek zmiana interfejsu wiąże się ze skomplikowaną refaktoryzacją kodu. Jedną z podstawowych cec...
Architektura 3961 dni, 16 godzin, 16 minut temu 104 źrodło rozwiń
Zaczynamy standardowo od czystej definicji zasady:Kod z warstw z wyższego poziomu nie powinien zależeć od kodu z niższych warstw. Obie warstwy za to powinny być zależne od abstrakcji.Abstrakcje nie powinny zależeć od szczegółów (konkretnej implementacji). Z kolei szczegóły (implementacja) powinna zależeć od abstrakcji. Najlepiej rozważmy to na przykładzie aplikacji enterprise. Kodem z niższej warstwy może być np. DAL (warstwa dostępu do danych) a z wyższej – warstwa biznesowa. Według zasady, warstwa bi...
Architektura 3965 dni, 6 godzin, 43 minuty temu 77 źrodło rozwiń
Zasada mówi żeby tworzone przez programistę interfejsy były odpowiedzialne za jak najmniejsza funkcjonalność. Użytkownik chcąc zaimplementować taki interfejs nie powinien pisać metod, których nie potrzebuje. Jeśli znajdują się w nim niepotrzebne metody to wtedy nazywamy go interfejsem “fat” lub “polluted”. Najlepiej rozważyć to na klasycznym przykładzie (z oodesign):interface IWorker { void Work(); void Eat(); } class Worker: IWorker { publicvoid Work() { } publicvoid ...
Architektura 3967 dni, 20 godzin, 31 minut temu 93 źrodło rozwiń
Na początek podam czystą definicje z wiki: “Funkcje które używają wskaźników lub referencji do klas bazowych, muszą być w stanie używać również obiektów klas dziedziczących po klasach bazowych, bez dokładnej znajomości tych obiektów.” Początkowo za wiele ta tajemnicza definicja nie mówiła mi. Innymi słowy, klasa dziedzicząca powinna rozszerzać możliwości klasy bazowej a nie całkowicie zmieniać jej funkcjonalność. Sposób korzystania z klasy potomnej powinien być analogiczny do wywoływania klasy bazowej...
Architektura 3972 dni, 19 godzin, 13 minut temu 100 źrodło rozwiń
Zasada O\C mówi, że oprogramowanie powinno być otwarte na rozszerzenia a zamknięte na modyfikacje. Innymi słowy programista powinien być w stanie uzyskać zamierzony efekt poprzez rozszerzenie klasy czy przeładowanie metody a nie zmianę już istniejącego kodu. Zasada jest szczególnie istotna w przypadku kodu produkcyjnego, w którym wszelkie możliwości modyfikacji kodu są ograniczone. Zasada pozwala budować modularne systemy. Użycie ENUM moim zdaniem jest złamaniem Open\Closed principle. Wykorzystując w kod...
Architektura 3974 dni, 20 godzin, 34 minuty temu 92 źrodło rozwiń