I would like this blog post to serve as a quick reference that recalls the basic concept of covariant and contravariant type parameters of generic interfaces in the C# language.I tried to keep the example as simple as possible. Included comments explain the key points. No long stories and no dissertations.
Sztuka programowania 4160 dni, 22 godziny temu 63 źrodło rozwiń
Po wstępie i omówieniu różnic między testami jednostkowymi, a integracyjnymi, czas na omówienie jak strukturalnie powinien wyglądać wzorcowy test jednostkowy. Będzie to pewnie najkrótszy wpis tej serii, ale jednocześnie jeden z najważniejszych. Pozwoli bowiem na pierwszy kontakt z testem jednostkowym w praktyce.
Sztuka programowania 4163 dni, 17 godzin, 56 minut temu 144 źrodło rozwiń
Kolejna część artykułu o GC. Zapraszam do lektury: http://msdn.microsoft.com/pl-pl/library/garbage-collector-cz-4-wycieki-pamieci
Sztuka programowania 4163 dni, 17 godzin, 56 minut temu 252 źrodło rozwiń
Gdy MyEnum nie ma wartości -13, to poniższy kod się wykona poprawnie i w enumie będziemy mieli wartość spoza zakresu enuma. var myEnum = (MyEnum) -13; Właściwa treść Mamy enum: enum MyEnum { One = 1 } I chcemy wykonać prostą operacje utworzenia tego enuma, tyle że posiadamy jedynie wartość liczbową (z zewnętrznego źródła danych). Akurat tak pechowo się stało, że mamy nie istn...
Sztuka programowania 4164 dni, 18 godzin, 30 minut temu 154 źrodło rozwiń
W poprzednim wpisie pisałem o pierwszym bloku grupującym – BatchBlock. Dziś czas przyszedł na kolejny element, tym razem JoinBlock. JoinBlock grupuje elementy podane na wejście w formie Tuple (pisałem o tej klasie kiedyś na blogu). Jeśli zatem podamy na wejście dwa integer’y, na wyjściu pojawi się Tuple
Sztuka programowania 4166 dni, 14 godzin, 9 minut temu 27 źrodło rozwiń
In many of my projects including last one I need to user N-Tier architecture for my application. This is very good approach because you can centralize your business logic and have many type of clients (WWW, mobile devices) thanks WCF and REST technology. The other thing is that most of business solutions displays some data in tabular format knows as grids and grid has always one problem: number of records increasing in time. So we need to ask ourselves do we really need to display all the data together ...
Sztuka programowania 4168 dni, 16 godzin, 3 minuty temu 127 źrodło rozwiń
AutoResetEvent\ManualResetEvent może być używany do synchronizacji międzyprocesowej tak samo jak np. mutex. Posiada podobny zestaw metod do tworzenia obiektu z nazwą oraz późniejszego jego otwierania. Aby móc go użyć do synchronizacji międzyprocesowej należy oczywiście nadać obiektowi nazwę – tak samo jak to jest z Mutex. W tym problem, że konstruktory ManualResetEvent czy AutoResetEvent nie przyjmują takich parametrów. Zaglądając jednak do dokumentacji dowiemy się, że:publicsealedclass ManualResetEvent...
Sztuka programowania 4170 dni, 21 godzin, 42 minuty temu 68 źrodło rozwiń
Dzisiaj pierwszy post o tzw. grouping block czyli blokach grupujących. Ich zasada jest prosta – grupują dane z różnych źródeł w sposób zależny już od konkretnego bloku. W tej części zajmiemy się BatchBlock, który przychodzące dane buforuje, a następnie przesuwa je na wyjście w zdefiniowanych porcjach. BatchBlock działa w dwóch trybach: greedy i non-greedy. W przypadku implementacji zachłannej, wszystko co pojawia się na wejściu jest akceptowane i przekazywane na wyjście gdy uzbiera się określona liczba ...
Sztuka programowania 4173 dni, 23 godziny, 22 minuty temu 33 źrodło rozwiń
W ostatnim poście wspomniałem o minimalnej liczbie wątków. Istnieje również górny próg, określający ile maksymalnie może zostać stworzonych wątków. Zbyt niski próg oraz zła architektura może spowodować bardzo trudny w znalezieniu błąd a mianowicie deadlock. Wyobraźmy sobie następującą sekwencję zdarzeń:Wątek T0 (lub główny, nie ma znaczenia) dodaje zadanie do puli.Stworzone zadanie tworzy n nowych zadań.T0 czeka aż wszystkie n zadań zostanie wykonanych (wait). Następnie przyjmijmy, że w tych n wątkach, ...
Sztuka programowania 4173 dni, 23 godziny, 22 minuty temu 122 źrodło rozwiń
Pula wątków to specjalny mechanizm zaimplementowany w CLR, mający na celu ponowne używanie tych samych wątków. W dzisiejszym wpisie chciałbym wyjaśnić co to jest optymalna liczba wątków i jaki ona ma wpływ na wydajność. Rozważmy następujący kod:internalclass Program { publicstaticvoid Main() { for (int i =0; i
Sztuka programowania 4176 dni, 22 godziny, 47 minut temu 169 źrodło rozwiń
Dzisiaj bardzo krótka notka, mająca na celu przestrzec przed modyfikacją jakichkolwiek właściwości wątku, który pochodzi z puli. Bardzo łatwo zmienić jego stan poprzez ustawienie nowego priorytetu albo zmianę kultury. Inny przykład to TLS o którym już pisałem na blogu. Dlaczego jest to tak złe?privatevoid Run() { Thread.CurrentThread.Priority = ThreadPriority.Highest; } Musimy zdać sobie sprawę, że takowe wątki wyłącznie wypożyczamy. Ktoś na forum porównał to do wypożyczalni samochodów. Gdy wypożycz...
Sztuka programowania 4180 dni, 6 godzin, 14 minut temu 68 źrodło rozwiń
Na witrynie techdays można obejrzeć wykład Roya Osherove pt. A Second Look at Unit Testing z tegorocznej konferencji Microsoft SWIT 2013 w Kijowie. Z wykładu dowiemy się m.in.:co się zmieniło i co zdezaktualizowało w świecie Test-Driven Development od czasu pierwszej edycji książki Art of Unit Testing (2009), jakie frameworki do izolacji (isolation frameworks) są obecnie na topie,dlaczego nie korzystać z Rhino Mocks, NUnit.Mocks i M...
Sztuka programowania 4186 dni, 6 godzin, 4 minuty temu 148 źrodło rozwiń
Kolejna część artykułu o GC – tym razem o zasobach niezarządzanych. Zapraszam do lektury: http://msdn.microsoft.com/pl-pl/library/garbage-collector-cz-3-zasoby-niezarzadzane
Sztuka programowania 4186 dni, 6 godzin, 4 minuty temu 122 źrodło rozwiń
W części drugiej kursu przyjrzymy się rodzajom testów w świecie Test-Driven Development i poznamy różnice między testami jednostkowymi, a integracyjnymi.
Sztuka programowania 4187 dni, 4 godziny, 43 minuty temu 741 źrodło rozwiń
Reguły, zasady – przemyślenia na ich temat ostatnio opanowały mój umysł, więc naturalną konsekwencją jego stanu są kolejne moje wpisy. I czuję, że to jeszcze nie koniec. Na blogu ostatnio jest bardziej filozoficznie, ale tak bywa, kiedy dokonuje się retrospekcji. Dziś co nieco o regule nazywania warunków (wywodzącej się z reguły wydzielania metody). Chodzi w niej o to, aby wyrażenia logiczne występujące w kodzie...
Sztuka programowania 4188 dni, 10 godzin, 23 minuty temu 191 źrodło rozwiń
W ostatnim wpisie pokazałem dostępne bloki buforujące. Dzisiaj zajmiemy się prostym przykładem, który jest bardziej praktyczny od tego przedstawionego w poprzednim poście. Załóżmy, że piszemy system, który składa się z kilku wątków przetwarzających. Każdy z nich pełni rolę konsumenta – przetwarza dane. Chcemy to tak zoptymalizować, aby nowe dane były wysyłane wyłącznie do jak najmniej zajętych węzłów. Oczywiście temat jest bardziej skomplikowany niż może wydawać się, ale dzisiaj pokażemy jak można do te...
Sztuka programowania 4188 dni, 21 godzin, 43 minuty temu 29 źrodło rozwiń
Dzisiaj wracamy do tematu TPL Dataflows. W ostatniej części zajęliśmy się m.in. BroadcastBlock, który jest jednym z bloków buforujących. Dla przypomnienia przykład:class Program { privatestaticvoid Main(string[] args) { BroadcastBlock
Sztuka programowania 4191 dni, 22 godziny, 23 minuty temu 78 źrodło rozwiń
Informatyka z racji swojego sformalizowania kocha się w regułach. Nie można się praktycznie ruszyć, by w jakąś nie wdepnąć. Zaczynam się powoli zastanawiać, czy nie mamy tutaj do czynienia ze zjawiskiem podobnym do eksplozji klas – eksplozją reguł. Bezsprzecznie do tego stanu rzeczy przyczyniają się także blogi. Widywałem na blogach wpisy, w których ...
Sztuka programowania 4193 dni, 16 godzin, 56 minut temu 219 źrodło rozwiń
ReaderWriterLockSlim jest klasą, która ma zastąpić ReadWriterLock, znanego ze starych wersji framework’a. Ale zacznijmy od początku… Dlaczego zwykły lock nie zawsze jest wystarczający? ReaderWriterLockSlim pracuje w trzech trybach:mutual lock – inaczej writer lock. Wyłącznie jedna taka blokada może zostać nadana. Jest to typowy lock i należy z niego korzystać, gdy modyfikujemy dane. shared (reader) lock – wiele wątków może mieć dostęp do tych samych danych. Można nadać wiele shared lock, pod warunkiem, ...
Sztuka programowania 4194 dni, 23 godziny, 19 minut temu 80 źrodło rozwiń
Komentarze z reguły są złe, zamiast nich należy pisać czytelny kod (czyli kod, który czytany wyjaśnia swoje działanie). Są złe bo się dewaluują, tj. po jakimś czasie nie korespondują z kodem, opisują go w nieprawdziwy sposób, bo kod się zmienił. Jest to prawda, której obecnie nie trzeba chyba już nikomu tłumaczyć, przynajmniej tym, którzy trzymają rękę na programistycznym pulsie. Czy zatem rezygnując z komentarzy oraz pisząc czytelny kod pozbyliśmy się całego ich zła? Niekoniecznie, ono czeka cierpliwie...
Sztuka programowania 4195 dni, 11 godzin, 19 minut temu 199 źrodło rozwiń