Pytanie “przechowywać, czy nie przechowywać” pojawia się praktycznie przy okazji każdego projektu, w którym trzeba przesłać coś więcej niż proste formy do i od użytkownika. Szkoły są dwie (plus hybryda, o czym za chwilę), jednak wybór, która w danym wypadku jest najlepsza zależy w dużej mierze od specyfiki samej aplikacji oraz rozwiązań technicznych użytych w projekcie.
Sztuka programowania 4086 dni, 9 godzin, 59 minut temu 192 źrodło rozwiń
Zanim przejdziemy do pokazania przykładów jak optymalizować async\await najpierw trzeba zrozumieć implementację wewnętrzną w .NET. Bez tego ciężko będzie cokolwiek optymalizować. Na początku async\await wydawał mi się również czymś niezwykłym, a jak zacząłem zagłębiać się w kod IL, okazało się, że to bardzo prosty mechanizm i mógłby być napisany przez każdego z nas. Kod korzystający z async\await wygląda na synchroniczny. Pod spodem jednak są zwykłe callback’i – dokładnie tak jakby było to napisane w po...
Sztuka programowania 4086 dni, 18 godzin, 26 minut temu 162 źrodło rozwiń
W kolejnych kilku wpisach, zajmiemy się async\await ale od strony wydajnościowej. Jeśli ktoś nie wie do czego te słowa kluczowe służą, zachęcam przeczytać np. mój artykuł o programowaniu asynchronicznym w .NET 4.5. Sposób korzystania z async\await jest bardzo prosty. Do tego stopnia, że programowanie asynchroniczne wygląda w zasadzie tak jak synchroniczne podejście. W kodzie nie ma callback’ow a przepływ logiki wygląda na sekwencyjny. Niestety, trzeba być świadomym jakie pułapki czekają na programistów...
Sztuka programowania 4089 dni, 22 godziny, 53 minuty temu 288 źrodło rozwiń
Dzisiaj na szybko wrócimy z powrotem do tematu TPL Data Flows. Jakiś czas temu pisałem o różnych blokach w TPL DataFlows. Nie opisałem jednak TransformManyBlock. TransformManyBlock jest analogiczny do TransformBlock z tym, że na wyjściu jest kolekcja więc możliwe jest zwrócenie kilku wartości. TransformBlock służył wyłącznie do przetworzenia parametru i zwrócenia pojedynczego wyniku. Ktoś może zapytać, czy to nie to samo co przekazanie jako typu generycznego IEnumerable do TransformBlock – też wtedy na...
Sztuka programowania 4091 dni, 13 godzin, 51 minut temu 47 źrodło rozwiń
W sprawie wydajności wyjątków można znaleźć wiele opinii, często sprzecznych ze sobą. W dzisiejszym wpisie przedstawię kilka programików, mających na celu, wyjaśnienie jaki wpływ mają wyjątki oraz ich łapanie na wydajność aplikacji. Zacznijmy od przykładów a potem przejdziemy do analizy wyników. Kod z wyrzucaniem wyjątków: internalclass Program { privatestaticvoid Main(string[] args) { constint n =20000; Stopwatch stopwatch = Stopwatch.StartNew(); for (int i =0; i < n;="" i+...
Sztuka programowania 4095 dni, 1 godzinę, 34 minuty temu 285 źrodło rozwiń
And how are you defining your variables?
Sztuka programowania 4096 dni, 1 godzinę temu 207 źrodło rozwiń
Często spotykam następujące konstrukcje:class RiskInfo { publicint Condition{get;set;} publicdouble Score{get;set;} } Innymi słowy, kontener na kilka prostych zmiennych. Jeśli ktoś nie zna zasady działania Garbage Collector, gorąco zachęcam do przeczytania np. mojego cyklu artykułów o GC. Usunięcie obiektu z pamięci to nie prosta sprawa i naprawdę wiele musi zostać wykonanych operacji w tle. Z tego względu, jeśli klasa jest mała i posiada wiele instancji, wtedy dużo lepiej skonwertować ją do s...
Sztuka programowania 4098 dni, 19 godzin, 36 minut temu 235 źrodło rozwiń
W tej części omówię jak wykonać kilka prostych technik, tj. jak:zgrupować testy za pomocą atrybutu [TestCase],testować wyjątki,testować zdarzenia. Na tapetę idzie przykład dzielenia; chcemy napisać funkcjonalność i testy mając na uwadze, że:metoda Divide należy do klasy Calculator,metoda Divide przyjmuje dwa parametry wejściowe — obydwa typu int; zwracanym ...
Sztuka programowania 4099 dni, 20 godzin, 34 minuty temu 164 źrodło rozwiń
Potrzebowałem funkcję do konwertowania długości pliku w bajtach na zjadliwą dla użytkownika formę. Zgodnie z tdd najpierw należy napisać test: [Test] [Row(1, "1 B")] [Row(1024, "1 KB")] [Row(2000, "1,95 KB")] [Row(1048576, "1 MB")] [Row(1537500, "1,47 MB")] [Row(5242880, "5 MB")] [Row(1073741824, "1 GB")] public void ToFileSize_Tests(int value, string expected) { var fileSize = value.ToFileSize(); Assert.AreEqual(expected, fileSize); } a potem wygooglować odpow...
Sztuka programowania 4101 dni, 8 godzin, 16 minut temu 104 źrodło rozwiń
Załóżmy, że w kodzie zobaczymy enum’a np.:publicenum Colors { Black, Red, Yellow }; Jeśli budujemy framework lub jakąkolwiek bibliotekę należy być świadomym zagrożeń wynikających z wewnętrznej budowy enum’a. Warto zajrzeć do Reflector’a aby przekonać się o tym:.classpublic auto ansi sealed Colors extends [mscorlib]System.Enum { .field publicstatic literal valuetype ConsoleApplication1.Colors Black = int32(0) .field publicstatic literal valuetype ConsoleApplication1.Colors Red = i...
Sztuka programowania 4103 dni, 2 godziny, 7 minut temu 252 źrodło rozwiń
XAdES to najbardziej popularny format podpisu elektronicznego w Polsce. Występuje on w kilku odmianach: zwykły, ze stemplem czasowym, dodatkowymi informacjami itd. Czasami zachodzi potrzeba zweryfikowania podpisu elektronicznego w .NET. Jakiś czas temu miałem podobny problem. Pokopałem trochę w Google i w MSDN i znalazłem w .NET Framework ciekawą klasę SignedXml...
Sztuka programowania 4104 dni, 22 godziny, 18 minut temu 1400 źrodło rozwiń
W ostatnim wpisie przedstawiłem aspekt do obsługi wyjątków. Dzisiaj trochę więcej o samych aspektach dla metod. Oprócz wyświetlenia nazwy metody czy przekazanych parametrów można wyciągnąć trochę więcej informacji. Dla przypomnienia, parametry można wyświetlać następująco:publicoverridevoid OnEntry(MethodExecutionArgs args) { var argValues =new StringBuilder(); foreach (var argument in args.Arguments) { argValues.Append(argument.ToString()).Append(","); } Console.WriteLin...
Sztuka programowania 4104 dni, 22 godziny, 18 minut temu 103 źrodło rozwiń
If you were asked to mention new features of C# 5.0, then you would probably say, first of all, async / await. However, on MSDN there is list of changes that could hardly be considered as well-known, even after almost 1 year after .NET 4.5 RTM was published. In this post I briefly explain one of them, that in my opinion is worth remembering.
Sztuka programowania 4107 dni, 9 godzin, 3 minuty temu 181 źrodło rozwiń
O programowaniu aspektowym kiedyś już pisałem więc jeśli od strony teoretycznej nie jest to jasne to zachęcam do poszperania na blogu. Dzisiaj zaprezentuje framework Postsharp w wersji express (darmowa edycja, również do zastosowań komercyjnych). Jak wiemy, obsługa wątków czy wykonanie logów mogą być problemami cross-cutting. Postsharp jest typowym framework’iem implementującym AoP Zaczynamy od instalacji z NuGet: Pomimo, że Postsharp express jest w pełni darmowy, musimy zarejestrować się i uzyskać...
Sztuka programowania 4107 dni, 12 godzin, 41 minut temu 221 źrodło rozwiń
O kontraktach już kiedyś pisałem tutaj. Dziś z kolei zaprezentuję bardzo złą praktyką, czasami niestety jeszcze spotykaną tzn.:interface IDataFilter { IEnumerable
Sztuka programowania 4111 dni, 2 godziny, 3 minuty temu 224 źrodło rozwiń
Rozpocząłem właśnie nowy cykl artykułów o Enterprise Library. Dzisiaj pierwsza cześć o Log Application Block: http://msdn.microsoft.com/pl-pl/library/enterprise-library-logging-application-block–czesc-1 Zapraszam do lektury!
Sztuka programowania 4114 dni, 2 godziny, 16 minut temu 124 źrodło rozwiń
W tej części cyklu stworzymy nasz pierwszy test jednostkowy. Przedstawię krok po kroku jak napisać i przetestować prostą funkcjonalność wedle zasad TDD. Opiszę tutaj szczegółowo wszystkie kroki, począwszy od tego jak dodać referencję do NUnita, a skończywszy na tym jak uruchomić test.
Sztuka programowania 4115 dni, 2 godziny, 5 minut temu 241 źrodło rozwiń
W kilku ostatnich postach pisałem o blokach grupujących. Obiecywałem, że pokaże kilka przykładów ich zastosowania, w szczególności wyjaśniające zachowanie zachłanne i niezachłanne. W dzisiejszym wpisie, zaprezentuję przykład (lekko zmodyfikowany z MSDN) jak JoinBlock i BufferBlock mogą zostać zastosowane. Wyobraźmy sobie, że mamy kilka źródeł danych. Na przykład: WCF, pliki oraz pamięć. Odczyt z WCF prawdopodobnie będzie najwolniejszy. W zależności od lokalizacji, odczyt pliku prawdopodobnie będzie dużo...
Sztuka programowania 4116 dni, 23 godziny, 35 minut temu 20 źrodło rozwiń
Od jakiegoś czasu myślałem o zebraniu w garść przemyśleń związanych z rozwojem projektów, bazując na doświadczeniach w aplikacjach, przede wszystkim biznesowych, w produkcji których przyszło mi uczestniczyć. Ponieważ pamięć jest zawodna i nie wszystko co chciałem wymienić udało mi się spamiętać i ubrać w słowa...
Sztuka programowania 4120 dni, 18 godzin, 8 minut temu 363 źrodło rozwiń
W ostatnich postach pisałem o JoinBlock oraz BatchedBlock czyli o blokach grupujących. Dzisiaj czas na połączenie tych dwóch konstrukcji, a mianowicie BatchedJoinBlock. Jak sama nazwa sugeruje, block będzie łączył elementy z kilku źródeł w Tuple ale zamiast Tuple
Sztuka programowania 4122 dni, 48 minut temu 34 źrodło rozwiń