470 likes | 600 Vues
z. z. Nowoczesne tworzenie projektów w .Net. Andrzej „ Siranen ” Piotrowski siranen@gmail.com www.anens.pl UPPoznan.Net User Experiance /Designer. Agenda. Design i Design Pattern jako marka Wzorce Projektowe Design Patterns & Best Practices and Paterns
E N D
z z Nowoczesne tworzenie projektów w .Net Andrzej „Siranen” Piotrowski siranen@gmail.com www.anens.pl UPPoznan.Net UserExperiance/Designer
Agenda • Design i Design Pattern jako marka • Wzorce Projektowe • Design Patterns & Best Practices and Paterns • A) Microsoft Enterprise Library(MGR) • *Test-driven development (TDD) • B) Model ViewPresenter (MVP) WPF • C) Model ViewViewModel (MVVM) WPF • D) Model ViewControler (MVC)ASP.NET MVC • Podsumowanie
Design Pattern Design Patterns & Best Practices and Paterns czyli jak powinno się pisać oprogramowanie “Design is so criticalitshould be on the agenda of everymeetinginevery single department.”—Tom Peters, 2003 =
SOLID • SRP—SingleResponsibilityPrinciple • OCP—OpenClosedPrinciple • LSP—LiskovSubstitutionPrinciple • ISP—InterfaceSegregationPrinciple • DIP—DependencyInversionPrinciple
Single ResponsibilityPrinciple Everyobjectshouldhave a single responsibility, and thatresponsibilityshould be entirelyencapsulated by theclass. (Każdy obiekt powinien być odpowiedzialny tylko za jedną funkcjonalność i ta funkcjonalność powinna być w całości „zamknięta” przez klasę) Podziel problem na mniejsze podproblemy Podziel podproblemy na pod-podproblemy
OpenClosedPrinciple public class Operation{ private OperationType type; public OperationType Type { get { return this.type; } } private decimal amount; public decimal Amount { get { return this.amount; } set { this.amount = value; } } public Operation (OperationType type) { this.type = type; }} Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.
public void Execute ( Operation[] operationList ){ for ( int i = 0; i < operationList.Length; i++) { Operation operation = operationList[i]; if ( operation.Type == OperationType.Income ) { ProcessIncome( operation ); } else if ( operation.Type == OperationType.Outcome ) { ProcessOutcome ( operation ); } else if ( operation.Type == OperationType.Transfer ) { ProcessTransfer( operation ); } }} Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.
public interface IOperation{ void Calculate();} public void Execute( IOperation[ ] operationList ){ for ( int i = 0; i < operationList.Length; i++ ) { IOperation operation = operationList[i]; operation.Calculate(); }} Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.
LiskovSubstitutionPrinciple void przetwarzajFigurę(Figura iFigura) { if(typeid(iFigura) == typeid(Prostokąt)) przetwarzajProstokąt(static_cast<Prostokąt>(iFigura)); else if(typeid(iFigura) == typeid(Koło)) przetwarzajOkrąg(static_cast<Okrąg>(iFigura)); else if(typeid(iFigura) == typeid(Kwadrat)) przetwarzajKwadrat(static_cast<Kwadrat>(iFigura)); }
InterfaceSegregationPrinciple interfaceIworker { voidWork() ; voidEat(); } classWorker: IWorker { public voidWork() { } public voidEat() { } } class Robot: IWorker { public voidWork() { } public voidEat() { thrownewNotImplementedException(); } } Mamy interfejs IWorker z dwoma metodami: Work oraz Eat. interface IWorkable { public void Work(); } interface IFeedable { public void Eat(); } class Worker: IWorkable, IFeedable { public void Work() { } public void Eat() { } } class Robot: IWorkable { public void Work() { } }
DependencyInversionPrinciple class B{public voidZrobCos() { }}class A{public void Metoda(){B b = new B();b.ZrobCos();}} 1. Moduły wysokopoziomowe nie powinny zależeć od modułów niskopoziomowych. Obie grupy modułów powinny zależeć od abstrakcji.2. Abstrakcje nie powinny zależeć od szczegółowych rozwiązań. To szczegółowe rozwiązania powinny zależeć od abstrakcji.
interface IB{void ZrobCos() { }}class B : IB{public void ZrobCos() { }}class A{public void Metoda(){IB b = new B();b.ZrobCos();}} Co osiągnęliśmy?-odwróciliśmy zależności (wyeliminowaliśmy zależność między abstrakcją a szczegółami implementacji)-klasa A może sterować dowolnymi klasami implementującymi interface IBRównież zasada DIP przydaje się bardzo podczas tworzenia struktury projektu do wyeliminowania zależności między modułami.
Microsoft EnterpriseLibrary “Good design isthe most importantway to differentiateourselvesfromourcompetitors.”—Samsung CEO, YunJongYong, 2004
Microsoft EnterpriseLibrary • Microsoft Enterprise Library jest to zbiór najlepszych praktyk oraz wzorców projektowych przygotowanych przez grupę specjalistów, które przydają się podczas budowy aplikacji na platformie .net, w wielu samodzielnych bibliotek które dołącza się do projektu w postaci referencji.
Microsoft EnterpriseLibrary • Consistency – Zwiozłość. Zbiór Enterprise Library zawiera bloki które cechuje rozszerzalność modułowa dodając nowe funkcjonalności oraz asocjację z wzorcami projektowymi , umożliwiając korzystanie cały czas z najnowszych porad które są dostarczane w postaci nowszych wersji biblioteki. • Extensibility – Rozszerzalność. Wszystkie bloki mogą być rozbudowywane do celów pod własny projekt, udostępniony kod źródłowy można dowolnie zmieniać i kompilować dodając referencje do projektu. • Integration – Integracyjność. Wszystkie bloki Enterprise Library są tak zaprojektowane aby współdziałały osobno i razem.
Microsoft EnterpriseLibrary Cryptography Application Block - Blok Kryptografii Aplikacji • Blok zabezpiecza dane przy użyciu algorytmów kryptograficznych. Dane które aplikacja używa mogą być zaszyfrowane. Dodatkowo wszelkie dane dostępowe jak i hasła powinny być chronione hashem. Zabezpieczenia te mogą być wprowadzane poprzez konfigurator dostarczony do biblioteki , unika się styczności z kodem źródłowym.
Microsoft EnterpriseLibrary Data Access Application Block - Blok Dostępu Do Danych Aplikacji • Blok umożliwia aplikacji czytanie danych do wyświetlenia komunikatu , przekazanie danych do innych warstw aplikacji. Pozwala również na wszelkie operacje bazo danowe z ADO.NET , zarządzanie pytaniami SQL , ustanawianie połączeń z bazą czy obsługę samego procesu przesyłania danych.
Microsoft EnterpriseLibrary Exception Handling Application Blok - Block Wyjątków Aplikacji • Blok służy do szybkiego i łatwego budowania implementacji strategii w przypadku wyjątków z różnych modułów aplikacji. Może przechowywać informacje z wyjątków, ukrywać ważne dane z wyjątków maskując je innym wyjątkiem czy nadzorować proces pojawiania się wyjątków w czasie działania aplikacji.
Microsoft EnterpriseLibrary Logging Application Block - Blok Logowania Aplikacji • Blok ten ma zastępować kod odpowiedzialny za odbieranie informacji z logowania. Posiada liczne funkcje logowania takie jak zapisywanie informacji do Windows Event Log, wysyłanie logu za pomocą wiadomości e-mail , zapisu do bazy danych , do Windows Management Instrumentation* (WMI) czy innej wskazanej lokalizacji.
Microsoft EnterpriseLibrary Validation Application Block - Blok Walidacji Aplikacji • Blok ma za zadanie sprawdzenie czy informacje uzyskiwane od użytkownika są poprawne w obrębie reguł ustanowionych w regułach biznesowych. • Jeżeli występuje błąd, gdyż wpisana nazwa jest błędna , blok ten automatycznie wysyła komunikat do użytkownika. Proste do edycji mechanizmy walidacji korzystające z atrybutów i szeregu zasad umożliwa integracje z różnymi interfaceami aplikacji.
Test Driven Development • “When I am working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong” • Charles Petzold, doświadczony programista Microsoftu
TDD • 1.Napisz test kodu • 2. Skompiluj test kodu ( oczywiście będzie błąd gdyż nic nie jest zaimpelemntowane) • 3. Dopisz resztę implementacji • 4. Uruchom test i sprawdz czy wystąpi błąd • 5. Skończy implementacje aby przejść test • 6.Uruchom test i sprawdz czy działa. • 7. Korzystając z techniki Refaktoryzacji , upraszczaj kod • 8. Powtarzaj aż do minimalizacji kodu.
MVVM , MVP Silverlight i WPF “A pictureisworth a thousandwords. An interfaceisworth a thousandpictures.”—Ben Shneiderman, 2003
MVC(ASP.NET) • Programista „drag and drop” • Używa zaawansowanej techniki programistycznej o nazwie „drag & drop” • Najwięcej czasu spędza korzystając z trybu „design” • Programista świadomy • Samodzielnie tworzy ~100% kodu • W tym JavaScript • Często walczy z ASP.NET starając się zachować maksymalną kontrolę nad generowanym kodem • Problemem są pewne wstępne założenia, promowane do dziś odnośnie tzw. dobrych praktyk użycia ASP.NET (WebForms w szczególności)
ASP.NET 4.0 • ASP.NET 4.0 stara się pomóc świadomym programistom • Nowe (właściwe) podejście do pracy z ViewState • Identyfikatory kontrolek (IDs) • Nowe trybu renderingu niektórych kontrolek • Kontrola URL • XHTML i standardy zwiększające dostępność stron WWW • ASP.NET Ajax – inwestycja w warstwę kliencką • ASP.NET MVC - NASZ WZORZEC
ViewState • Wyłączenie viewstate w web.config …sprawi, że poniższe ustawienia przestaną działać: • Tak samo ja właściwość ViewStateMode
ViewState • Możliwe wyłączenie na poziomie np. całej strony i uaktywnianie na poziomie poszczególnych kontrolek • Control.ViewStateMode • Enabled • Disabled • Inherit (ustawienie domyślne, dziedziczymy po kontrolce nadrzędnej) • Możliwość wyłączenia ViewState w Web.config
Identyfikatory ID • Control.ClientIdMode • AutoID(jak w starym ASP.NET) • Static(„manualne” ustawianie ID, ryzyko błędu) • Predictable(nowy algorytm przyznawania ID, możliwość używania z „RowClientIdSuffix”) • Inherit(ustawienie domyślne) • Web.config <system.web> <pages clientIdMode="Predictable"> </pages> </system.web>
Identyfikatory ID • Funkcjonalność dostępna w ASP.NET 3.5 SP1, w ASP.NET 4.0 będzie nieco łatwiej… ASP.NET Routing Route: Product/{name} -> Product.aspx Request: Products/Bikes WebFormsPage File Name: Product.aspx Route Values: Name = “Bikes” Response
Identyfikatory ID • Przykłady użycia: • Kod C# • Kod .aspx stringsearchterm = Page.RouteData.Values["searchterm"] asstring; label1.Text = searchterm; <asp:Literal Text="<%$ RouteValue:Category %>" runat="server" /> <asp:EntityDataSource … <WhereParameters> <asp:RouteParameter Name="Category" RouteKey="Category" Type="String" /> </WhereParameters> </asp:EntityDataSource>
Nowa kontrolki: Chart • Kontrolka Chart • Istnieje w postaci dodatkowego komponentu już od jakiegoś czasu • 35 typów wykresów w tym tryby 3D • Zaawansowane formatowanie • Funkcje statystyczne • Wykorzystanie Ajax i obsługa zdarzeń
ASP.NET(VS2010) • Kilka nowości… • Kilka usprawnień • Wsparcie dla CSS 2.1, lepsze zachowywanie integralności HTML, lepszy intellisense w JavaScript • Snippets(~200) • HTML div, table, img … • ASP.NET scriptmanager, sqldatasource, formview • ASP.NET AJAX behavior, control … • JavaScript function, forin …
ASP.NET(VS2010) • Wdrażanie (Deployment) • Paczki wdrożeniowe (Web packages) • Mogą zawierać: • Dodatkowe biblioteki • Skrypty SQL • Ustawienia • Certyfikaty, wpisy do rejestru, biblioteki itd.. • Wdrażanie: • „Import Application” w IIS 7.0 • MsDeploy (np. z linii poleceń, PowerShell, Team Build) • Deployment API • Transformacje plików Web.config
ASP.NET(VS2010) • Budowa paczki, zależności • Web publishing pipeline • Microsoft.Web.Publishing.targets
ASP.NET(MVC) • Areas • Pozwala zorganizować większy projekt w obszary (Area). • Każdy taki obszar może reprezentować logiczny moduł takiego projektu, grupując powiązane kontrolery i widoki
ASP.NET(MVC R2) • Wiele więcej… • Asynchroniczne kontrolery • Bindowanie do danych binarnych • Wsparcie dla atrybutów DataAnnotations • Lepsza walidacja po stronie klienta • Przeciążanie metod HTTP (np. PUT) • Lepsze wspracie w Visual Studio
Co wybrać • Istnieje kilka cech ASP.NET MVC, które są naprawdę fajne: • Pełna i naturalna kontrola nad HTML (w tym IDs itp.) • Łatwość użycia JavaScript frameworks (Jquery, Dojo, ExtJS) • Rozszerzalność i elastyczność (niemal naturalne wsparcie dla IoC (dependency injection) ) • Testowalność – i nie chodzi tu koniecznie o podejście TDD, ale stary dobry Unit Testing • Dla wyjadaczy tradycyjnego „ASP.NET” możliwość nauczenia się nowych koncepcji, wzorców i podejścia do tworzenia stron WWW • ASP.NET MVC wydaję się być produktem udanym i jego używanie jest naprawdę fajne (casus Entity Framework ;-( )
Co wybrać • Dlaczego ew. warto zostać przy ASP.NET • Baza wiedzy („use google before asking dump questions”) • Design Patterns i Guidlines – te które pojawiły się z ASP.NET MVC zostały dość ostro skrytykowane (Oxite i Kobe) • Baza kontrolek (darmowych i komercyjnych – Telerik, DevExpress) • Ilość gotowych elementów infrastruktury i tzw. features (Membership, Navigation itp) – ich mała ilość drastycznie zmniejsza produktywność. Ich brak oznacza, że jeżeli chodzi o Rapid Development gorszy jest chyba tylko Perl (ale jest przynajmniej Intelisense i debugger). • W praktyce musimy wspomagać się zewnętrznymi komponentami (np. MvcContrib, FluentNHibernate lub L2S, xVal, Castle.*, jQuery) – niska spójność rozwiązania (cohesion) • Słabe wsparcie w Visual Studio • Osiągamy efekt w postaci działającej aplikacji, ale wymagana jest większa wiedza i większy nakład pracy (a uzasadnienie biznesowe?)
Co wybrać • Wokół ASP.NET MVC narosło wiele mitów… • „Tylko ASP.NET MVC zapewnia czystą architekturę” (separation of concerns) • To już chyba zależy od programistów? • A istniejące już referencyjne architektury? (np.: Web Client Software Factory) • „Tylko ASP.NET MVC zapewnia testowalność” • WatiN, xUnit itp... • „Wsparcie dla Jquery”, „Ładne adresy URL” – c’mon! • „Niepoprawny HTML” – to nie wina WebForms tylko programistów kontrolek • ASP.NET to dojrzała, stabilna i sprawdzona technologia • Pamiętajmy że ASP.NET to infrastruktura na podstawie której zbudowany został również ASP.NET MVC
Bez „wzorca” • Rigidity—Oprogramowanie „Rigid”jest to rodzaj oprogramowania które wymaga zmian kaskadowychkiedy dokonuje się zmian w jednym miejscu. • Fragility—Oprogramowanie „Fragile”jest to rodzaj oprogramowania które„łamie” się w kilku miejscach kiedy dokonuje się zmian w jednym miejscu. • Needless complexity—Nadmierna kompleksowość jest to rodzaj oprogramowana które wykracza poza ramy projektoweaby dokonać jakichkolwiek zmian. • Needless repetition—Nadmierna powtarzalnośćoprogramowana którezawieraduplikujący się kod. • Opacity—Jest to rodzaj oprogramowaniaktóry jest ciężki do zrozumienia.