W poprzednim wpisie omówiłem kilka mechanizmów walidacji wprowadzanych danych jakie oferuje technologia WPF. Dzisiaj rozszerzę ten temat o kwestie związane z formatowaniem danych oraz konwersją typów. Często zdarza się sytuacja, w której prezentując użytkownikowi pewne dane chcemy określić dla nich własny format. Równie często konieczne jest skonwertowanie wartości wprowadzonej przez użytkownika na docelowy typ danych.
Kiedyś już wspomniałem o słowie kluczowych dynamic. W tym i następnych wpisach chciałbym przedstawić praktyczne zastosowanie tego mechanizmu. Na koniec wyjaśnię, jak dynamic jest zaimplementowany przez CLR i jak bardzo spowalnia aplikację… Programiści używający ASP.NET MVC z pewnością rozpoznają zasadę działania ExpandoObject. Klasa umożliwia tworzenie dynamicznych kontenerów. Na przykład:privatestaticvoid Main(string[] args) { dynamic bag =new ExpandoObject(); bag.FirstName ="Piotr"; bag.LastN...
Sztuka programowania 3752 dni, 17 godzin, 22 minuty temu 106 źrodło rozwiń
Kilka postów wcześniej pisałem o różnicach między const a read-only. Dzisiaj chciałbym pokazać scenariusz, który pokazuje kiedy NIE używać słowa const. Const jest doskonałym rozwiązaniem dla liczb, które są po prostu ZAWSZE stałe. Przykład? Liczba PI ma jedną wartość i oczywiście nigdy się nie zmieni. Istnieją jednak przypadki gdzie liczby w kodzie są zastępowane stałymi co nie zawsze jest dobrym wzorcem. Rozważmy, że mamy klasę przechowującą pewne parametry algorytmu:namespace ClassLibrary1 { publ...
Sztuka programowania 3756 dni, 9 godzin, 30 minut temu 152 źrodło rozwiń
W teorii są 3 rodzaje kontraktów. Podejdę wg mnie praktycznie i opowiem głównie o pierwszym (Requires), z pozostałych dwóch rzadko kto korzysta. Requires używa się do sprawdzania argumentów przekazanych do metody.
Sztuka programowania 3756 dni, 9 godzin, 30 minut temu 116 źrodło rozwiń
Z Gitem pracuję na co dzień już dobre trzy lata, czy nawet więcej. I kocham ten soft. Uważam go za najlepsze narzędzie z jakim kiedykolwiek spotkałem się w swojej programistycznej karierze - we wszystkich kategoriach. Nic nigdy aż tak bardzo mi nie zaimponowało. Zresztą rozwodzić się nie będę - o tym można poczytać we wszystkich moich postach dotyczących Gita. Nie mam jednak w zwyczaju wpadać w jedno narzędzie i od razu zakładać, że jest ono "the only one". Z tego też powodu do projektów pobocznych przez...
Binduj ValueMember i DisplayMember dla ComboBoxa (DropDownList) używając refleksji zamiast błędogennych stringów.
Sztuka programowania 3756 dni, 12 godzin, 36 minut temu 96 źrodło rozwiń
Od dłuższego czasu pracuję nad czytnikiem książek w formacie EPub dla Windows Phone. Niestety .NET to nie Java i ilość dostępnych komponentów nie jest taka duża jak u starszego brata. Ponieważ nie znalazłem żadnego projektu open source czytnika postanowiłem sam go napisać co wynikało z zamówienia klienta. A sam open source ma pomóc w testowaniu komponentu i developerce.
Mobile development 3758 dni, 21 minut temu 49 źrodło rozwiń
Dziś trochę o formatowaniu tekstu. Można je wykonać na wiele sposób. Osoby nie znające powyższych interfejsów zwykle tworzą własne metody zwracające wynik w odpowiednim formacie. Załóżmy, że mamy następującą klasę:class PhoneNumber { privatereadonlystring _extension; privatereadonlystring _phoneNumber; public PhoneNumber(string extension,string phoneNumber) { _extension = extension; _phoneNumber = phoneNumber; } } Na przykładzie powyższej klasy będę starał się po kolei pr...
Sztuka programowania 3758 dni, 21 minut temu 103 źrodło rozwiń
W C# istnieje wiele typów tablic. W poście chciałbym skupić się na ich wydajności. Rozważę następujące przypadki: - tablica wielowymiarowa, - tablica tablic tzw. jagged. - tablica unsafe. Tablice wielowymiarowe w c# są najwolniejsze ponieważ CLR nie wykonuje wszystkich optymalizacji. Zacznijmy jednak od testu:internalclass Program { privatestaticvoid DoSomething(int arg) { } privatestaticvoid MultiDimensionalArrayTest(int xCount, int yCount) { int[,] array =newint[xCount, ...
Sztuka programowania 3761 dni, 20 godzin, 26 minut temu 151 źrodło rozwiń
Jedną z podstawowych kwestii przy budowie interfejsu użytkownika jest walidacja wprowadzanych danych. WPF w tym obszarze oferuje kilka mechanizmów. Dzisiaj zajmę się omówieniem trzech rozwiązań: walidacja poprzez implementację interfejsu IDataErrorInfo (DataErrorValidationRule), walidacja za pomocą wyjątków (ExceptionValidationRule) oraz walidacja przy wykorzystaniu własnych obiektów reguł (ValidationRule).
Istnieje zalecenie, aby tworząc terminologię opierać ją na już istniejącej czy to w danym języku i jego bibliotekach, czy też w samym projekcie. Nazywając klasy, które implementują jakiś wzorzec należy w ich nazwach używać nazwy tegoż wzorca, bo to pozwoli czytającemu gładko zinterpretować przeznaczenie klasy. Trudno się z tym zaleceniem nie zgodzić, jest ono oczywiste wręcz na poziomie podświadomości. Jak to jednak z zaleceniami bywa, w teorii wyglądają one przepięknie, kiedy jednak człowiek przechodzi...
Sztuka programowania 3762 dni, 10 godzin, 36 minut temu 43 źrodło rozwiń
Domain Driven Design (DDD) zostało zdefiniowane przez Erica Evansa w jego książce Domain-Driven Design: Tackling Complexity in the Heart of Software wydanej w 2003 roku. DDD nie jest metodyką tworzenia kodu, a definiowaniem komunikacji (połączeń) pomiędzy obiektami.
Sztuka programowania 3763 dni, 20 godzin, 30 minut temu 301 źrodło rozwiń
Manipulując stanem encji, należy pamiętać o dwóch zasadach. Dotyczą one zapisu zmian do bazy danych po zakończeniu pracy z obiektami i ustawianiu im stanów.
Encja pobrana z bazy za pomocą EntityFramework może mieć jeden z następujących stanów: Added - encja jest śledzona przez kontekst, ale nie istnieje w bazie danych Unchanged - encja jest śledzona przez kontekst oraz istnieje w bazie danych. Wartości pól są takie same w bazie jak i obiekcie (nie dokonano żadnych zmian).Modified - encja jest śledzona przez kontekst, istnieje w bazie danych. Dokonano zmian w jej polach Deleted - encja jest śledzona przez kontekst i istnieje w bazie danych. Została jednak ozn...
Czasami metody mają zbyt dużo parametrów przez co wywołanie ich jest niewygodne i może zajmować nawet dwie linie. Oczywiście pierwsza rzecz, którą powinniśmy zrobić jest sprawdzenie czy metoda czasami nie wykonuje zbyt wielu operacji tzn. przestrzega zasadę Single Responsibility. Jeśli mamy pewność, że metoda przestrzega wszelkie zasady i jest dobrze zaprojektowana wtedy trzeba pomyśleć jak zmniejszyć liczbę parametrów. W poście przedstawię kilka prób uzyskania takiego efektu. Logiczne wydaje się, utwo...
Sztuka programowania 3763 dni, 20 godzin, 30 minut temu 139 źrodło rozwiń
Dziś prosta zasada przekazywania parametrów ale jednak często łamana. Kod:privatestaticvoid Display(string[] strings) { foreach (string text in strings) { Console.WriteLine(text); } } Powyższa metoda ma za zadanie wyświetlenie wyłącznie elementów. Parametr wejściowy (tablica string’ów) jest zbyt specyficzny i nie pozwala na przekazanie wszystkich zbiorów danych. Na przykład poniższy kod nie skompiluje się:List
Sztuka programowania 3766 dni, 17 godzin, 19 minut temu 193 źrodło rozwiń
Opublikowano Ostatnio pisałem o Web Essentials 2012 dzięki, któremu możemy szybko i łatwo generować klasy na podstawie json-a a dzisiaj zobaczymy co jeszcze daje dodatek Web Essentials 2012. W plikach CSS mamy dodatkowe menu Web Essentials: Minify selection – minimalizuje naszego css-a (w MVC4 można to również zrobić za pomocą bundle-s ale nie każdy używa przecież MVC)Remove Duplicate Properties – usuwa powielone właściwości. Bardzo przydatne jeśli nad css-em pracuje więcej niż jedna osoba lub css...
Niniejszy post opisuje sposób stworzenia nawigacji na stronie ASP.NET bez efektu przeładowania całej strony
Implementing RAII (Resource Acquisition Is Initialization) in C# using Castle.DynamicProxy and how to proxy iterator (IEnumerable).
Architektura 3770 dni, 5 minut temu 71 źrodło rozwiń