Klasa Monitor to chyba najpopularniejszy, najłatwiejszy i często najlepszy sposób synchronizacji danych w .NET. Większość programistów używa słowa kluczowego lock zamiast bezpośrednio Monitor.Enter. W większości przypadków jest to poprawne i zdecydowanie najbardziej przejrzyste. Dzisiaj chciałbym przyjrzeć się kilku sposobom konstrukcji Monitor.Enter\MonitorExit. Pierwszy, zdecydowanie najgorszy to:Monitor.Enter(_sync); // sekcja krytyczna tutaj Monitor.Exit(_sync); W powyższym kodzie brakuje obsługi...
Sztuka programowania 4197 dni, 23 godziny, 21 minut temu 143 źrodło rozwiń
Jakiś czas temu zapowiadałem drugą część artykułu o GC. Tym razem będzie o różnych trybach GC i kiedy z jakiego należy korzystać, tak, aby aplikacja zachowywała się płynnie oraz sprawiała wrażenie, że działa w czasie rzeczywistym. Zapraszam do lektury!
Sztuka programowania 4201 dni, 22 minuty temu 122 źrodło rozwiń
Pewnie każdy na swojej ścieżce programistycznej spotkał się z klasą abstrakcyjną. Wrzucamy tam kod, który zdaje się być domyślną implementacją pewnej grupy klas i szkoda nam kopiować tego zachowania do każdej z nich osobna. Skoro wszystkie zachowują się podobny sposób, czasem tylko dodając coś od siebie, to warto wykorzystać dziedziczenie i napisać mniej (DRY).
Sztuka programowania 4203 dni, 23 godziny temu 227 źrodło rozwiń
Biblioteka TPL istnieje już od jakiegoś czasu i raczej jest znana dla większości programistów. W .NET 4.5 Microsoft poszedł jednak o kilka kroków do przodu i dostarczył tzw. TPL DataFlows. Jest on oparty oczywiście na bibliotece TPL, dostarcza jednak kilka bardzo ciekawych klas, przydatnych do modelowania współbieżnego. Czasami algorytmy składają się z kilku “bloków”, które należy ze sobą synchronizować. TPL DataFlows służy do modelowania przepływu między różnymi wątkami. We wczesnych wersjach .NET byliś...
Sztuka programowania 4206 dni, 14 godzin, 46 minut temu 171 źrodło rozwiń
Pisząc testy jednostkowe dość często spodziewamy się identycznego zachowania w różnych testowanych scenariuszach. “Gdy zajdzie X, ma wydarzyć się A, B i C”. Z kolei “gdy zajdzie Y, ma wydarzyć się A, B i D”. W takich przypadkach, wykorzystując standardowe biblioteki do unit testów, mamy do wyboru kilka rozwiązań: wspólna klasa bazowa współdzielone metody “asercji” w ramach jednej klasy copy/paste testów pomiędzy klasami … pewnie jeszcze coś i...
Sztuka programowania 4207 dni, 20 godzin, 38 minut temu 102 źrodło rozwiń
Serialziacja jest dobrze znanym tematem. Jakiś czas temu pisałem, jak oddelegować serializację jednego obiektu do drugiego. Pokazałem to na przykładzie wzorca singleton – w tamtym przypadku chcieliśmy oddelegować serializację do IObjectReference, który zwracał po prostu zawsze tą samą instancję. Dziś trochę inny scenariusz. Załóżmy, że w plikach, zawsze chcemy trzymać czas w UTC a nie w konkretnej strefie. Ponadto nie mamy dostępu ani do kodu źródłowego DateTime ani nie chcemy korzystać z DateTimeOffset...
Sztuka programowania 4210 dni, 36 minut temu 153 źrodło rozwiń
Kilka wpisów wcześniej pisałem, dlaczego należy unikać funkcji Suspend. Dzisiaj przyszła kolej na metodę Abort, która również jest sygnałem, że zaprojektowana architektura jest po prostu zła. Aby zrozumieć, dlaczego Abort jest tak niebezpieczny, należy poznać najpierw zasadę jego działania. Wywołując Abort, wyrzucany jest tzw. asynchroniczny wyjątek ThreadAbortException. Dlaczego asynchroniczny? Ponieważ może on zostać wstrzyknięty w “dowolne” miejsce w kodzie. Istnieją pewne zasady, kiedy dokładnie może...
Sztuka programowania 4212 dni, 17 godzin, 51 minut temu 136 źrodło rozwiń
W Visual Studio wersji Ultimate są narzędzia do analizowania architektury. Jednak są ludzie, którzy zamiast wydawać pieniądze na ultimate-a wolą iść do salonu i kupić sobie auto albo dwa. Jak jednak poradzić sobie bez diagramu warstw? Wystarczy pooglądać usingi. Single Responsibility Principle mówi, że klasa powinna robić jedną rzecz, mieć jedną odpowiedzialność. Jeśli ma jedną odpowiedzialność to nie powinna raczej grzebać we wszystkich warstwach. Wątpliwe jest aby klasa, która ma jedną ...
Sztuka programowania 4216 dni, 7 minut temu 275 źrodło rozwiń
Na wstępnie od razu chciałbym dodać, że dla większości aplikacji, dalsze rozważania w tym poście nie mają sensu i należy to traktować jako ciekawostkę. Dla części systemów może to jednak być ważne a mianowicie dla oprogramowania działającego w “czasie rzeczywistym”, wymagającego low-latency. Dzisiejszy wpis może powstał trochę zbyt wcześnie ale wkrótce powinna pojawić się druga część mojego artykułu o GC, który będzie dotyczył różnych trybów kolekcji. Jednym z tych trybów jest wykonywanie kolekcji w spo...
Sztuka programowania 4216 dni, 7 minut temu 128 źrodło rozwiń
W poprzednim poście poruszyłem temat mojego side-projectu (który BTW nie powinien zająć więcej niż 2-3 dni, ale lubię dawkować przyjemności więc pewnie jeszcze trochę to potrwa;) ) i MSpec. Teraz zobaczymy jak można w bardzo ciekawy sposób przetestować WebAPI emulując dosłownie całego requesta z kodu, co miło przejedzie przez kompletny stack i sprawdzi nie tylko logikę, ale również m.in. konfigurację routingu… a docelowo tak...
Sztuka programowania 4216 dni, 16 godzin, 47 minut temu 118 źrodło rozwiń
Dzisiaj znów trochę od strony teoretycznej postaram wyjaśnić jak działają priorytety wątków w systemach Windows. Każdy chyba słyszał o tym, że wątkowi można nadać priorytet. Nie każdy natomiast wie, jaki jest zakres oraz jak wygląda dokładnie ich interpretacja. Przede wszystkim mamy do czynienia z dwoma typami priorytetów, które składają się na końcową wartość używaną przez task scheduler. Pierwszy komponent dotyczy procesu i jest to tzw. klasa priorytetu. W Windows możemy wyróżnić następujące klasy: ...
Sztuka programowania 4219 dni, 6 godzin, 5 minut temu 122 źrodło rozwiń
Każdy wątek posiada metodę Suspend, która wstrzymuje jego wykonywanie. Ktoś mógłby napisać takiego “potworka”:class Program { staticvoid Main(string[] args) { Thread thread=new Thread(Run); thread.Start(); Thread.Sleep(1000); thread.Suspend(); Thread.Sleep(5000); thread.Resume(); } staticprivatevoid Run() { while(true) { Console.WriteLine("Running..."); } } } Używanie Suspend jest bardzo złą praktyką i może ...
Sztuka programowania 4221 dni, 13 godzin, 21 minut temu 138 źrodło rozwiń
O tym, czym jest redundacja wie chyba każdy programista. Każdy z nas wie również, że jest to zjawisko nieporządane i w większości wypadków lepiej mu zapobiegać. Ten post przeznaczę na opis przykładowego zjawiska powtórzeń w zapytaniach LINQ spotykanego w sytuacjach codziennych oraz prostym i czytelnym ich rozwiązaniu, o którym nieraz zapominamy.
Sztuka programowania 4222 dni, 16 godzin, 38 minut temu 246 źrodło rozwiń
Pierwszy wpis na moim blogu i pierwsza część cyklu o TDD. Wprowadzenie do TDD, opis Red/Green/Refactor, wady i zalety.
Sztuka programowania 4225 dni, 12 minut temu 350 źrodło rozwiń
W .NET istnieje kilka klas, które odpowiadają mniej więcej za to samo. Przyczyna dlaczego nie ma po prostu jednej klasy a kilka, wynika z faktu, że cześć z nich była zaprojektowana z myślą o konkretnej technologii jak np. WinForms. Nie zmienia to faktu, że dla części programistów nie jest to jasne, kiedy używać konkretnego timer’a. OK, to zaczynamy. W .NET mamy następujące timer’y:System.Threading.Timer – używamy, gdy chcemy aby nasza operacja była wykonywana w osobnym wątku (z puli). Dlatego, ten timer...
Sztuka programowania 4225 dni, 12 minut temu 216 źrodło rozwiń
Krótko o tym jak i kiedy korzystać z Creation methods.
Sztuka programowania 4231 dni, 15 minut temu 383 źrodło rozwiń
W poprzednim wpisie przedstawiłem podstawy macierzy DSM. Dzisiaj postaram się wyjaśnić, jakie znaczenie ma to w praktyce. Sam fakt, że macierz pokazuje referencje między różnymi elementami systemu nie jest zbyt ciekawy. Pierwszą własność, jaką w łatwy sposób możemy odczytać z DSM jest spójność (cohesion). Dokładna wartość spójności zależy od konkretnej metryki. Ogólnie pisząc, wysoka spójność w systemie oznacza, że elementy w nim są bardzo od siebie zależne. Przyjrzyjmy się następującemu przykładowi (źr...
Sztuka programowania 4231 dni, 15 minut temu 101 źrodło rozwiń
W dzisiejszym wpisie chciałbym zaprezentować macierz zależności i co można z niej odczytać. Pominiemy aspekty matematyczne – ze względu, że jest to macierz istnieje wiele faktów matematycznych ale myślę, że nie są one najważniejsze dla programisty. Załóżmy, że mamy prostą aplikację składającą się z klienta, warstwy usług, biznesowej oraz DAL. Macierz możemy wygenerować w nDepend – o tym programie kiedyś już pisałem. Umożliwia przede wszystkim liczenie metryk kodu i monitorowanie jakości kodu. Macierz dla...
Sztuka programowania 4231 dni, 22 godziny, 53 minuty temu 115 źrodło rozwiń
“Masowa” i “SmtpClient” w jednym zdaniu? Nie, to nie jest żart. Każdy, kto choć raz musiał wysyłać serię maili z poziomu kodu C# pomyśli, że zwariowałem. Blokowanie wątku, cała gama wyjątków, które może rzucić metoda Send(), czy obsługa stanu aplikacji po takim błędzie. To ważniejsze atrakcje, jakie możemy napotkać korzystając z tej klasy. Jest na to jedna prosta metoda. Wróć. Właściwość… DeliveryMethod.
Sztuka programowania 4233 dni, 15 godzin, 57 minut temu 225 źrodło rozwiń
Właśnie został opublikowany kolejny mój artykuł, tym razem o GC. Zapraszam do lektury: http://msdn.microsoft.com/pl-pl/library/garbage-collector-cz-1
Sztuka programowania 4235 dni, 20 godzin, 32 minuty temu 218 źrodło rozwiń