Kilka postów wcześniej, pokazałem jak narysować linię za pomocą RX oraz przechwytywania zdarzeń. Dla przypomnienia udało nam się narysować prostą linie z punktu (0,0) do aktualnej pozycji kursora:publicclass MyCanvas : Canvas { private Point _endPoint; public MyCanvas() { var eventsSource = Observable.FromEventPattern
Sztuka programowania 4348 dni, 3 godziny, 10 minut temu 31 źrodło rozwiń
W dzisiejszym wpisie znów wracamy do tematu RX. Postaram się wyjaśnić jak można ze sobą połączyć kilka IObservable. W RX istnieje naprawdę wiele metod umożliwiających wykonanie tego i na początku może wydawać się to dość skomplikowane, ze względu na liczbę sposobów w jaki można to wykonać. 1. Observable.Amb – zawsze zwraca wyłącznie tą sekwencje, która została jako pierwsza wygenerowana. Jeśli zatem mamy MouseMove i MouseUp wtedy zostanie zwrócone te zdarzenie, które jako pierwsze miało miejsce. Przykł...
Sztuka programowania 4350 dni, 2 godziny, 55 minut temu 38 źrodło rozwiń
Programiści niskopoziomowi często narzekają na brak pewnych możliwości w C# znanych im z C++ (często ze względu na brak znajomości ich odpowiedników w C#. Po dzisiejszej rozmowie z kolegą na ten temat stwierdziłem, że pokażę jak wykorzystać takie funkcje jak memset, a przy okazji jak pisać biblioteki DLL w C++ dla C# i jak z nich korzystać. Sprawdzimy także, czy zastosowanie takich bibliotek przyśpieszy działanie...
Sztuka programowania 4351 dni, 22 godziny, 55 minut temu 317 źrodło rozwiń
Co wyświetli poniższy fragment kodu?internalclass Program { publicstaticvoid Main() { var timer =new Timer(TimerCallback, null, 0, 1000); Console.ReadLine(); } privatestaticvoid TimerCallback(Object o) { Console.WriteLine("Callback: "+ DateTime.Now); } } Powyższy konstruktor uruchamia timer i spodziewalibyśmy się, że na ekranie po prostu będą wyświetlane kolejne callbacki. W praktyce jednak dokonywana jest pewna optymalizacja, która ma fatalne efekty. Można zauwa...
Sztuka programowania 4352 dni, 15 godzin, 58 minut temu 102 źrodło rozwiń
In previous post, I defined a good unit test as one that:tests single unit of workcontains only one assertis self contained Presented sample of code with one unit test, unfortunately had two asserts. Clear violation of the second rule. One of the fellow bloggers MJ pointed out this mistake. It is time to “fix” it and talk about “Only one assert per test” rule.Why only One Assert There are couple of problems with multiple asserts.Unit Test Misinformation Frameworks like NUnit do notify about failing un...
Sztuka programowania 4356 dni, 2 godziny, 36 minut temu 37 źrodło rozwiń
Pod jednym z ostatnich postów wywiązała się krótka dyskusja na temat komentowania kodu i postanowiłem poczynić follow-up w postaci osobnej notki. Mam cały czas na myśli oczywiście komentarze wyjaśniające działanie kodu a nie zakomentowany kod. Zakomentowany kod powinien być usuwany na poziomie repozytorium w momencie check-ina i problem mielibyśmy z głowy. Na ten temat nawet nie będę się rozwodził.
Sztuka programowania 4356 dni, 15 godzin, 33 minuty temu 172 źrodło rozwiń
W poprzednim poście pokazałem jak korzystać z funkcji FromAsyncPattern na przykładzie usługi sieciowej. Dzisiaj zaprezentuję kilka dodatkowych funkcji. Najpierw zdefiniujmy co chcemy uzyskać:Użytkownik może wpisać szukaną frazę w pole edycyjne. Usługa sieciowa ma za zadanie wyszukanie fraz wpisanych w pole zdefiniowane w punkcie 1. Wyłącznie frazy dłuższe niż 3 znaki mają być przetwarzane. Jeśli użytkownik wpisze dwa razy tą samą frazę to tylko pierwsza ma zostać wysłana do usługi (optymalizacja). Zdarze...
Sztuka programowania 4358 dni, 10 godzin, 11 minut temu 17 źrodło rozwiń
This post is based on my answer on the Stack Overflow – “How to unit test this function?” The original question is about writing unit test for a code that uses Console methods inside its body. This problem is more general and in this post, I want to show one of the ways to unit test code with static method.Example of code with static methods This example is from the Stack Overflow quest...
Sztuka programowania 4362 dni, 10 godzin, 2 minuty temu 67 źrodło rozwiń
W ostatnim poście pisałem o konwersji zdarzeń .NET do RX. Dziś chciałbym zaprezentować przydatną funkcję, dostępną w rozszerzeniach Observable – Buffer. Służy ona do podzielenia danych w bufory. Załóżmy, że mamy źródło, które generuje dane co 1 sekundę. W każdej sekundzie zatem otrzymujemy jedno powiadomione OnNext. Co w przypadku jednak gdybyśmy chcieli dostawać w każdym powiadomieniu kilka wartości (tablicę elementów) ? Na przykład zamiast 10 OnNext, chcemy dwa powiadomienia, w którym każde zawiera lis...
Sztuka programowania 4362 dni, 21 godzin, 46 minut temu 38 źrodło rozwiń
W wcześniejszych wersjach .NET Framework metody asynchroniczne implementujące wzorzec Begin\End były bardzo powszechne w użyciu. RX posiada metody pomocnicze, umożliwiające konwersję asynchronicznego źródła danych do IObservable. Rozważmy to na przykładzie. Załóżmy, że mamy web service, zawierający jakieś metody. Można oczywiście dla takiego serwisu wygenerować asynchroniczne metody. Jeśli chcecie popraktykować możecie skorzystać z tej, darmowej usługi: http://services.aonaware.com/DictService/DictServ...
Sztuka programowania 4362 dni, 21 godzin, 46 minut temu 31 źrodło rozwiń
Artykuł w sposób przystępny opisuje te trzy powiązane ze sobą mechanizmy. Zaczynamy od delegacji, potem opis anonimowych metod, a na deser wyrażenia lambda. Wszystkie opisy zostały oparte o proste przykłady, które pozwalają lepiej zrozumieć działanie tych mechanizmów oraz sposoby ich wykorzystania, a także screenshoty ze skompilowanych kodów.
Sztuka programowania 4364 dni, 21 godzin, 39 minut temu 183 źrodło rozwiń
Po przeczytaniu poprzednich wpisów, zasada działania i zastosowanie RX powinny być już jasne. Jeśli tak nie jest, koniecznie zachęcam do przeczytania tamtych postów. Jak wspomniałem, RX to ujednolicony model, umożliwiający korzystanie z kolekcji typu “push-based” w jednakowy sposób. Dzisiaj pokażę jak sprawa wygląda dla zdarzeń czyli jak skonwertować EventHandler do IObervable. Oczywiście kluczem do rozwiązania jest klasa Observable, która zawiera mnóstwo rozszerzeń dla interfejsów IObservable\IObserver...
Sztuka programowania 4364 dni, 21 godzin, 39 minut temu 48 źrodło rozwiń
W poprzednim poście pokazałem jak dokonać subskrypcji aby otrzymywać powiadomienia o nowych danych oraz jak skonwertować IEnumerable to IObservable. Dzisiaj chciałbym pokazać kilka metod klasy Observable, które są szczególnie ważne przy pisaniu testów jednostkowych oraz przy nauce RX. Muszę przyznać, że na co dzień korzystam wyłącznie tylko z kilku z nich ale w przypadku UnitTest’ów są już bardzo praktyczne. Observable to zbiór statycznych metod (często rozszerzających) usprawniających pracę z IOb...
Sztuka programowania 4368 dni, 57 minut temu 93 źrodło rozwiń
Kiedyś już chciałem poprowadzić cykl wpisów o Reactive Extensions i nawet napisałem pierwszy post wprowadzający do interfejsów IObservable, IObserver. Niestety po drodze przytrafiły się tematy które chciałem najpierw opisać i na końcu zrezygnowałem z tego. W między czasie kilka osób pytało o ten cykl ale nie widziałem sensu ponieważ Maciej Zbrzezny już wykonał kawał dobrej roboty i opisał to na swoim blogu w bardzo szczegółowy sposób. Dzisiaj postanowiłem jednak napisać kilka postów o RX po swojemu, z t...
Sztuka programowania 4374 dni, 1 godzinę, 24 minuty temu 111 źrodło rozwiń
W zeszłym tygodniu pisałem o zastosowaniu dynamicznych zmiennych. W dzisiejszym wpisie zastanowimy się co dokładnie CLR robi z dynamic i jak to wpływa na wydajność aplikacji. Pierwszy test polega na porównaniu wydajności dodawania dwóch liczb:privatestaticvoid TestStatic() { var stopwatch = Stopwatch.StartNew(); int a =10; int b =45; int c = a + b; stopwatch.Stop(); Console.WriteLine("Static:{0}", stopwatch.ElapsedTicks); } privatestaticvoid TestDynamic() { var stopwatch = Stopwatch...
Sztuka programowania 4377 dni, 9 godzin, 23 minuty temu 97 źrodło rozwiń
Już kiedyś pisałem jak obsługiwać prawidłowe wyjątki ale dzisiaj jeszcze raz chciałbym rozwinąć temat. Zacznijmy od:privatestring GetData(int id) { string result=null; try { result = _service.GetData(id); } catch(Exception e) { } return result; } Jest to oczywiście skrajnie złe rozwiązanie ponieważ wszystko ignorujemy. Na szczęście programiści rzadko popełniają powyższy błąd. Niestety dużo częściej popełnianym błędem jest:privatestring GetData(int id) { stri...
Sztuka programowania 4380 dni, 10 godzin, 21 minut temu 169 źrodło rozwiń
Dzisiaj chciałbym przedstawić jedną z podstawowych rzeczy w języku C#, którą osoby mające za sobą już kilka programów w tym języku zapewne doskonale znają. Mam na myśli trzy słowa kluczowe, które sprawiają, że dostosowywanie funkcji składowych do naszych potrzeb jest jeszcze prostsze. Pierwszym z nich jest słowo out. Pozwala na zwrócenie w prost...
Sztuka programowania 4381 dni, 11 godzin, 31 minut temu 144 źrodło rozwiń
Wszyscy dążymy do oprogramowania, które zawsze działa ale oczywiście musimy przygotować się na przypadki w których wystąpił wyjątek i nie wiadomo jak go obsłużyć. Najgorszą reakcją jest oczywiście pozwolenie aplikacji dalej działać co może spowodować nieoczekiwane efekty oraz popsuć po prostu dane. Musimy wszystko zrobić aby nie dopuścić do niespójności danych. W przypadku gdy wiemy, że aplikacja nie może kontynuować swojego działania musimy bezwzględnie zakończyć cały proces albo AppDomain. Należy po pr...
Sztuka programowania 4383 dni, 1 godzinę, 46 minut temu 128 źrodło rozwiń
Dziś będzie opowieść… Co sądzą ludzie, którzy nie testują? Ja, dla przykładu, wierzę w Unit Testy. Kontrastowałem (podpytywałem) to ze stanowiskiem wielu osób. Niektóre osoby odpowiadały, że to nie działa. Następnie podały powody dlaczego tak uważają i od tych powodów chciałbym zacząć...
Sztuka programowania 4383 dni, 1 godzinę, 46 minut temu 167 źrodło rozwiń
Dziś kolejny post z cyklu zastosowanie słowa kluczowego dynamic. Ostatnio pisałem o ExpandoObjet, który jest dynamicznym kontenerem na metody i dane. DynamicObject pozwala z kolei tworzyć wrappery na różne klasy. Zacznijmy od przykładu:internalclass Program { publicclass CustomWrapper : DynamicObject { publicoverridebool TryGetMember(GetMemberBinder binder, outobject result) { result ="Hello World"; returntrue; } publicoverridebool TrySetMem...
Sztuka programowania 4389 dni, 15 godzin, 46 minut temu 94 źrodło rozwiń