Ostatnio nawiązała się ciekawa wymiana zdań odnośnie projektu CQRS Sample.
Zapraszam na forum.
Zapraszam już w najbliższy poniedziałek na moją kolejną sesję poświęconą przetwarzaniu zapytań przez SQL Servera.
UPDATE: Start godzina 18.00.
22 kwietnia, poniedziałek
18:00 – 19:00 | Metody dostępu w SQL Serverze | Michał Mac
Gdzie i jak baza danych przechowuje dane? Jakie są strategie pobierania danych? Dlaczego serwer wybrał tą metodę, a nie inną? Na jakiej podstawie to zrobił? Która metoda dostępu jest szybsza i dlaczego? Jak działają indeksy?
MIEJSCE:
Wyższa Szkoła Zarządzania i Bankowości w Krakowie, Al. Kijowska 14, 6K (parter)
Więcej szczegółów można znaleźć na stronie PLSSUG.
Zapraszam.
Wyobraźmy sobie kompozytowy ekran, na którym widnieje lista dostępnych do kupna produktów. Użytkownik po dodaniu jednego z nich do koszyka dostanie informację o wykonanej akcji (np. animowana notyfikacja), a w innym miejscu interfejsu komponent wyświetlający stan koszyka zostanie odświeżony.
Powyższy scenariusz można rozwiązać z użyciem wzorca EventBroker (więcej w najnowszym numerze programisty).
Implementacja wspomnianego wzorca w JS jest bardzo krótka i prosta.
function EventBroker() { var self = this; self.list = []; this.subscribe = function(event, handler) { if (!self.list[event]) self.list[event] = []; self.list[event].push(handler); } this.publish = function(event, data) { if (self.list[event]) { for( var n in self.list[event] ) { self.list[event][n](data); } } }; }
Publikator (fasada odpalająca akcje dodaj) publikuje zdarzenie, a subskrybent (widget koszyka) na nie oczekuje i odświeża swój stan.
Przykład można znaleźć tutaj. Otwórz źródło strony, by zobaczyć szczegóły implementacji i interakcję.
Poniżesz można ściągnąć materiały z 42. spotkania TGD.NET
Zapraszam już w najbliższą środę na moją sesję poświęconą przetwarzaniu zapytań przez SQL Servera.
13 lutego, środa
18:00 – 19:00 | Optymalizacja zapytań w SQL Server | Michał Mac
Prezentacja będzie poświęcona różnym technikom, które pozwalają odpowiedzieć na pytanie, czy dane zapytanie jest wydajne. Co jest problemem? Jak czytać fizyczne plany zapytań? Jak porównać wydajność dwóch zapytań? Jakie są często spotykane problemy? Jak wykorzystać row_number oraz inne sposoby w celu poprawy wydajności? Podczas sesji zostaną zaprezentowane konkretne problemy, które będziemy rozwiązywali.
MIEJSCE:
Wyższa Szkoła Zarządzania i Bankowości w Krakowie, Al. Kijowska 14, 6K (parter)
Więcej szczegółów można znaleźć na stronie PLSSUG.
Zapraszam.
Dlaczego singleton jest zły?
Singleton jest jednym z dobrze znanych i często stosowanych antywzorców. Zacznijmy od razu od poniższego przykładu:
public class OrderProcessor { public void Process(Order order) { // Validate // Do some work if ( Settings.Instance.ShouldLog ) Logger.Instance.Log("Order id=5 processed successfully"); } }
Jeśli mielibyśmy napisać unit test, to jak to zrobić?
Jak wytestować w izolacji klasę procesora?
Można sobie wyobrazić, że ustawienia czytają jakiś plik z dysku, a logger zapisuje.
Jest bardzo trudno zestawić łatwo i szybko takie środowisko. Jeśli tak będzie to szybko przestanie nam się chcieć pisać testy.
Więcej na ten i powiązane tematy można znaleźć w najnowszym artykule w Programiście. Polecam.
To będzie pierwszy wpis na temat interfejsu IDisposable w tej krótkiej mini serii z większej serii.
Otóż dobry programista używający jakiegokolwiek obiektu, który implementuje interfejs IDisposable jest zobowiązany do wywołania metody Dispose w momencie gdy skończy pracować z daną instancją klasy. Spowoduje to zwolnienie zasobów przez wykorzystywany obiekt, np. zwrócenie połączenia bazodanowego do puli połączeń, rozłączenie połączenia tcp/ip, zwolnienie jakiegoś niezarządzalnego zasobu czy zwolnienie dużej wewnętrznej struktury.
W bazowym frameworku .Neta niestety możemy spotkać kilka niekonsekwentnych i problematycznych implementacji. Przyjęło się poprzez konwencję, że na niektórych klasach ( np. FileStream ) dostępne są dwie metody: Close i Dispose. Czym one się różnią? Otóż dokładnie niczym.
public virtual void Close() { this.Dispose(true); GC.SuppressFinalize((object) this); } [__DynamicallyInvokable] [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public void Dispose() { this.Close(); }
Zatem czy jest różnica, którą metodę można wołać?
Tak, jest.
Jeśli napiszemy kod, który będzie przypominał poniższy to mamy duży problem. Jaki?
FileStream file = File.Open("processMe.txt", FileMode.Open); // Process file here file.Close();
Otóż w momencie gdy w bloku procesującym poleci wyjątek to metoda Close nie zostanie wywołana i co za tym idzie plik nie zostanie zwolniony. Sam .Net w późniejszym czasie to naprawi (tak, by nie było wycieków niezarządalnych zasobów) poprzez finalizator (o ile jest zaimplementowany). Jednak jest to niedeterministyczne zachowanie na którym polegać nie wolno. Każdemu dobremu programiście nie przytrafi się taka sytuacja, gdyż wie, że należy obiekty implementujące interfejs IDisposable używać wraz z klauzulą using.
using(FileStream f = File.Open("processMe.txt", FileMode.Open)) { // Process file here }
Jeżeli popatrzymy sobie do disassemblera to zobaczymy jak powyższa konstrukcja jest rozwijana.
Dostrzeżemy tam użycie metody Dispose oraz bloku try finally. W momencie gdy poleci wyjątek blok obsługi błędów wykona sprzątanie zasobów i wszystko będzie w porządku.
Powyższy kod otworzony w Reflectorze z wyłączonymi optymalizacjami zostanie zdekompilowany do następującej postaci:
FileStream f; bool CS$4$0000; f = File.Open("processMe.txt", 3); Label_000D: try { goto Label_0021; } finally { Label_0011: if ((f == null) != null) { goto Label_0020; } f.Dispose(); Label_0020:; } Label_0021: return;
Co ciekawe są w .Netcie klasy, które implementują interfejs IDisosable w sposób explicit. Oznacza to, że metoda Dispose nie będzie normalnie widoczna w IntelliSense uniemożliwiając nam szybkie stwierdzenie, czy klasa implementuje wspomniany interfejs i użycie using. W takich przypadkach ja od razu pisz using, a kompilator mi powie, czy jest tam implementacja IDisposable.
Jakie to klasy?
Visual Studio Achievements
Bardzo fajny dodatek do VS: Visual Studio Achievements
Zbieramy punkty za konkretne konstrukcje i pisany kod. Programowanie będzie teraz jak granie na komputerze. Przykłady poniżej.
Dziś zajmiemy się operatorami związanym z rzutowaniem typów. W przykładach będziemy używać następującej hierarchii:
public class Animal { } public interface IMammal { } public class Tiger : Animal, IMammal { }
Operator is służy do sprawdzenia, czy dany obiekt jest konkretnego typu, bądź czy implementuje wskazany interfejs.
object tiger = new Tiger(); if ( tiger is Animal) { Animal animal = (Animal) tiger; } if ( tiger is IMammal) { IMammal mammal = (IMammal) tiger; }
Natomiast operator as rzutuje dane obiekt o ile jest on określonego typu, w przeciwnym wypadku zwraca null. Tutaj warto zauważyć, że możemy tylko rzutować na typy, które są nullowalne – nie możemy używać struktur (value type’ów).
object tiger = new Tiger(); Animal animal2 = tiger as Animal; if ( animal2 != null) { // Do something } IMammal mammal2 = tiger as IMammal; if (mammal2 != null) { // Do something }